実務で使えるPower Query小技・テクニック | Mコードを読みやすく整形する

Excel VBA Power Query M Formula Language
スポンサーリンク
スポンサーリンク

なぜ「Mコードを読みやすく整形する」ことが重要なのか

Power QueryのMコードは、GUI操作だけでも自動生成されますが、そのままだと

  • 1行が長くて読みにくい
  • どこで何をしているのか分かりにくい
  • 条件や型変換の意図が伝わりにくい という状態になりやすいです。

実務では、「自分以外の誰かが後から読む」「自分が数ヶ月後に読み返す」ことがほぼ確実に起こります。 そのときに、読みやすく整形されたMコードになっているかどうかが、

  • バグの発見しやすさ
  • セキュリティ・品質レビューのしやすさ
  • 保守・改修のスピード に直結します。

ここでは、初心者向けに、Mコードを読みやすく整形する具体的な考え方とテクニックを、ステップバイステップで解説していきます。

基本の整形ルールを押さえる

ステップごとに「1行1役割」を意識する

Mコードの基本構造は、次のような「ステップの連鎖」です。

let
    Source = ...,
    Step1 = ...,
    Step2 = ...,
    Step3 = ...
in
    Step3
Power Query

ここで大事なのは、「1つのステップは1つの役割に絞る」という意識です。

悪い例(詰め込みすぎ):

FilteredSorted =
    Table.Sort(
        Table.SelectRows(
            Table.TransformColumnTypes(Source, {{"金額", type number}}),
            each [金額] > 1000
        ),
        {{"金額", Order.Descending}}
    )
Power Query

良い例(役割を分ける):

Typed =
    Table.TransformColumnTypes(
        Source,
        {{"金額", type number}}
    ),

Filtered =
    Table.SelectRows(
        Typed,
        each [金額] > 1000
    ),

Sorted =
    Table.Sort(
        Filtered,
        {{"金額", Order.Descending}}
    )
Power Query

このように、

  • 型変換
  • フィルタ
  • 並べ替え を別々のステップに分けることで、「どこで何をしているか」が一目で分かるようになります。

引数は「縦に並べる」ことで読みやすくする

Mの関数は、引数が増えると一気に読みにくくなります。 そのときに有効なのが、「引数を縦に並べる」整形です。

悪い例(横に詰め込み):

Table.TransformColumnTypes(Source, {{"顧客コード", type text}, {"顧客名", type text}, {"金額", type number}, {"売上日", type date}})
Power Query

良い例(縦に整形):

Table.TransformColumnTypes(
    Source,
    {
        {"顧客コード", type text},
        {"顧客名", type text},
        {"金額", type number},
        {"売上日", type date}
    }
)
Power Query

このように整形することで、

  • どの列にどの型を設定しているか
  • 列の追加・削除・修正がどこに書かれているか が一目で分かるようになります。

「引数が2つ以上ある関数は、縦に並べる」というルールを持っておくと、コードがぐっと読みやすくなります。

ステップバイステップで整形してみる

ステップ1:自動生成されたコードをそのまま眺める

まず、GUIで作ったクエリのMコードを詳細エディターで開きます。 自動生成されたコードは、だいたい次のような感じになっていることが多いです。

let
    ソース = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース, {{"顧客コード", type text}, {"顧客名", type text}, {"金額", type number}, {"売上日", type any}}),
    フィルター行 = Table.SelectRows(変更された型, each [金額] > 0),
    並べ替え済みの行 = Table.Sort(フィルター行, {{"金額", Order.Descending}})
in
    並べ替え済みの行
Power Query

ここから、

  • どこが読みにくいか
  • どこを分けたほうがよいか を見つけていきます。

ステップ2:長い行を「改行+インデント」で分解する

次に、長い行を「改行+インデント」で分解します。

整形後の例:

let
    ソース =
        Excel.CurrentWorkbook(){[Name="売上"]}[Content],

    変更された型 =
        Table.TransformColumnTypes(
            ソース,
            {
                {"顧客コード", type text},
                {"顧客名", type text},
                {"金額", type number},
                {"売上日", type any}
            }
        ),

    フィルター行 =
        Table.SelectRows(
            変更された型,
            each [金額] > 0
        ),

    並べ替え済みの行 =
        Table.Sort(
            フィルター行,
            {{"金額", Order.Descending}}
        )
in
    並べ替え済みの行
Power Query

ここでのポイントは、

  • = の右側を改行してインデントする
  • 関数名の後ろに改行し、引数を縦に並べる
  • { ... } の中身も縦に並べる

という3つです。

「右辺は必ず改行してインデントする」という癖をつけると、コード全体が自然と読みやすくなります。

ステップ3:ステップ名に「役割」を込める

整形とセットで重要なのが、ステップ名の付け方です。

悪い例:

Step1 =
    ...,

Step2 =
    ...,
Power Query

良い例:

Source =
    ...,

Typed =
    ...,

FilteredPositiveSales =
    ...,

SortedByAmount =
    ...
Power Query

日本語でも構いませんが、

  • 「何をしているステップか」
  • 「何を前提としているステップか」 が分かる名前にしておくと、依存関係が読みやすくなります。

例:セキュリティ・品質を意識した名前付け

Typed =
    Table.TransformColumnTypes(...),

ValidRowsOnly =
    Table.SelectRows(
        Typed,
        each [顧客コード] <> null and [顧客コード] <> "" and [金額] > 0
    ),

AdminUsersOnly =
    Table.SelectRows(
        ValidRowsOnly,
        each [Role] = "Admin"
    )
Power Query

このように、ステップ名だけで「このステップは何を保証しているか」が伝わるようにしておくことは、セキュリティと品質の両面で非常に重要です。

条件式・カスタム列を読みやすく整形する

if 文は「縦に書いて構造を見せる」

条件分岐を含む式は、横に書くと一気に読みにくくなります。

悪い例:

each if [金額] = null then null else if [金額] > 100000 then "大口" else "通常"
Power Query

良い例:

each
    if [金額] = null then
        null
    else if [金額] > 100000 then
        "大口"
    else
        "通常"
Power Query

このように、

  • if / then / else を縦に並べる
  • 条件ごとに改行する
  • インデントで「ネストの深さ」を見せる

ことで、「どの条件でどの値を返しているか」が視覚的に分かるようになります。

複雑な条件は「論理ブロックごとに改行する」

複数の条件を組み合わせる場合も、縦に整形すると読みやすくなります。

悪い例:

each [顧客コード] <> null and [顧客コード] <> "" and [金額] <> null and [金額] > 0 and [IsActive] = true
Power Query

良い例:

each
    [顧客コード] <> null
        and [顧客コード] <> ""
        and [金額] <> null
        and [金額] > 0
        and [IsActive] = true
Power Query

さらに、意味ごとにコメントを付けると、セキュリティ・品質の意図が明確になります。

each
    // 顧客コードが有効
    [顧客コード] <> null
        and [顧客コード] <> ""

        // 金額が有効
        and [金額] <> null
        and [金額] > 0

        // アクティブユーザーのみ
        and [IsActive] = true
Power Query

「条件式は、意味ごとに改行+コメント」で整形することで、後から読む人が安心してレビューできるコードになります。

コメントを使って「意図」を残す

「何をしているか」ではなく「なぜそうしているか」を書く

コメントは、

  • コードを説明するため というより、
  • 「この条件・この型・このフィルタには、どんな意図があるか」を残すため に使うと効果的です。

例:型変換ステップのコメント

Typed =
    // 以降のステップは、金額を数値として扱う前提。
    Table.TransformColumnTypes(
        Source,
        {
            {"顧客コード", type text},
            {"顧客名", type text},
            {"金額", type number},
            {"売上日", type date}
        }
    ),
Power Query

例:セキュリティチェックのコメント

AllowedUsersOnly =
    Table.SelectRows(
        Typed,
        each
            // 管理者かつアクティブかつ承認済みユーザーのみ許可
            [Role] = "Admin"
                and [IsActive] = true
                and [ApprovalFlag] = "Y"
    ),
Power Query

「このステップは何を保証しているか」「後続ステップは何を前提にしているか」をコメントで明示することは、セキュリティと品質の観点から非常に重要です。

実務で使える「整形済みMコード」テンプレート

売上クエリの読みやすい基本形

let
    // 1. 元データ
    Source =
        Excel.CurrentWorkbook(){[Name="売上"]}[Content],

    // 2. 型を整える(以降はこの型を前提)
    Typed =
        Table.TransformColumnTypes(
            Source,
            {
                {"顧客コード", type text},
                {"顧客名", type text},
                {"金額", type number},
                {"売上日", type date}
            }
        ),

    // 3. 金額が正の行のみ(売上のみを対象)
    PositiveSalesOnly =
        Table.SelectRows(
            Typed,
            each [金額] > 0
        ),

    // 4. 消費税額列を追加
    AddedTaxAmount =
        Table.AddColumn(
            PositiveSalesOnly,
            "消費税額",
            each [金額] * 0.1,
            type number
        ),

    // 5. 金額で降順ソート
    SortedByAmount =
        Table.Sort(
            AddedTaxAmount,
            {{"金額", Order.Descending}}
        )
in
    SortedByAmount
Power Query

まとめ:「Mコードを読みやすく整形する」は“クエリを守るための習慣”

Mコードを読みやすく整形するというのは、 単に見た目をきれいにするだけではなく、

「クエリの意図・前提・依存関係・セキュリティルールを、誰が読んでも分かる形で残す」

ための習慣です。

そのために、

  • ステップごとに1役割に絞る
  • 右辺は改行+インデントで整形する
  • 引数・条件・if 文は縦に並べる
  • ステップ名に役割と前提を込める
  • コメントで「なぜそうしているか」を残す

というルールを、自分なりに持っておくことが大切です。

読みやすく整形されたMコードは、

  • バグを見つけやすく
  • セキュリティレビューがしやすく
  • チームで共有しやすく
  • 将来の自分にも優しい

「実務で使えるPower Query」の土台になります。 ぜひ、Mコードを書くたびに「整形してから保存する」を当たり前の習慣にしていってください。

タイトルとURLをコピーしました