実務で使えるPower Query小技・テクニック | カスタム列でMコードを書く

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

カスタム列でMコードを書くとは何か

Power Queryの「カスタム列」は、既存の列を組み合わせたり、条件分岐や計算を行ったりして、新しい意味を持つ列をMコードで作り出すための機能です。 画面上では「カスタム列の追加」ダイアログから式を書きますが、その中身はすべてM言語のコードです。

実務では、

  • 売上金額から消費税額や粗利を計算する
  • 顧客コードや日付から分類フラグを作る
  • セキュリティや品質チェック用の「有効/無効」フラグを作る など、カスタム列は「ロジックをテーブルに刻む場所」として非常に重要な役割を持ちます。

ここから、カスタム列でMコードを書くときの考え方を、ステップバイステップで噛み砕いて説明していきます。

カスタム列の基本構造を理解する

カスタム列は「1行ずつ評価されるM式」

カスタム列に書く式は、テーブルの各行に対して1回ずつ評価されるMコードです。 つまり、

「この行の値を使って、こういう計算・判定をして、新しい値を返す」

という小さな関数を、行ごとに繰り返し適用しているイメージです。

たとえば、次のようなカスタム列式を考えます。

[金額] * 0.1
Power Query

これは、

  • 各行の [金額] を取り出して
  • それに 0.1 を掛けた結果を
  • 新しい列の値として返す

という処理を、全行に対して行っています。

「カスタム列の式は、行ごとのロジックを書く場所」だと理解していただくと、考え方が整理しやすくなります。

カスタム列でよく使う基本要素

カスタム列の式では、次のような要素をよく使います。

  • 列参照[金額], [顧客コード], [売上日] など
  • 演算+, -, *, /
  • 比較=, <>, >, <, >=, <=
  • 論理演算and, or, not
  • 条件分岐if ... then ... else ...
  • 関数呼び出しText.Upper, Number.Round, Date.Year など

これらを組み合わせて、 「この行がどんな意味を持つか」をコードとして表現していくのが、カスタム列の役割です。

ステップバイステップでカスタム列のMコードを書く

ステップ1:何を計算・判定したいかを言葉で整理する

まず、コードを書く前に、日本語で「この列は何を表したいのか」をはっきりさせることが大事です。

例1:消費税額列

  • 「金額に対して10%の消費税を計算したい」

例2:重要顧客フラグ

  • 「金額が10万円以上で、顧客ランクがAの行を重要顧客としたい」

例3:有効行フラグ(品質チェック)

  • 「顧客コードが空でなく、金額が正である行だけを有効としたい」

この「言葉での仕様」が、そのままMコードの設計図になります。

ステップ2:列参照と演算に分解する

次に、その仕様を「どの列を使って、どんな演算・比較をするか」に分解します。

例1:消費税額

  • 使う列:[金額]
  • 演算:[金額] * 0.1

カスタム列式:

[金額] * 0.1
Power Query

例2:重要顧客フラグ

  • 使う列:[金額], [顧客ランク]
  • 条件:[金額] >= 100000 and [顧客ランク] = "A"

カスタム列式:

[金額] >= 100000 and [顧客ランク] = "A"
Power Query

このように、「仕様 → 列 → 演算・比較」という順番で考えると、カスタム列の式が自然に組み立てられます。

ステップ3:if 文で条件分岐を組み立てる

より複雑なロジックでは、if ... then ... else ... を使います。

例:重要顧客フラグを true / false で返す

仕様:

  • 金額が10万円以上かつ顧客ランクがAなら true
  • それ以外は false

カスタム列式:

if [金額] >= 100000 and [顧客ランク] = "A" then
    true
else
    false
Power Query

ここでのポイントは、

  • if 条件 then 値1 else 値2
  • 条件は true / false を返す式
  • 値1・値2は、列の型に合わせて決める(logicalなら true/false、textなら文字列など)

という基本形を守ることです。

「条件を先に書いて、その結果に応じて返す値を決める」という流れを意識すると、if 文が書きやすくなります。

実務でよく使うカスタム列のパターン

数値計算列(税・割引・粗利など)

例:消費税額列

[金額] * 0.1
Power Query

例:割引後金額

[金額] * (1 - [割引率])
Power Query

例:粗利額

[売上金額] - [原価]
Power Query

これらは、「列参照+四則演算」の基本パターンです。 実務では、税率や割引率を固定値ではなく別列やパラメータとして扱うことも多いです。

フラグ列(重要顧客・有効行・セキュリティチェックなど)

例:重要顧客フラグ

[金額] >= 100000 and [顧客ランク] = "A"
Power Query

例:有効行フラグ(品質チェック)

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

例:セキュリティ上の許可フラグ

[Role] = "Admin" and [IsActive] = true
Power Query

これらは、「条件式そのものを列として持つ」パターンです。 後続のステップで、

  • Table.SelectRows でフラグが true の行だけを残す
  • 集計で「true の件数」を数える

など、フラグ列は実務ロジックの軸になります。

文字列加工列(コード整形・大文字化・結合など)

例:顧客コードの整形

Text.Upper(Text.Trim([顧客コード]))
Power Query

例:顧客名+コードの結合

[顧客名] & " (" & [顧客コード] & ")"
Power Query

例:日付を「YYYY-MM」形式の文字列にする

Text.From(Date.Year([売上日])) & "-" &
Text.PadStart(Text.From(Date.Month([売上日])), 2, "0")
Power Query

文字列加工は、レポート用の表示列やキー列の整形に頻出します。 ただし、「表示用の文字列」と「計算・判定用の元データ」を混同しない」ことが重要です。

カスタム列でMコードを書くときの重要な注意点

1. null を必ず意識する

外部データを扱う以上、null はほぼ必ず登場します。 カスタム列の式でも、null を前提に書いておくことが安全です。

悪い例:

[金額] * 0.1
Power Query

金額が null の行でエラーになる可能性があります。

良い例:

if [金額] = null then
    null
else
    [金額] * 0.1
Power Query

あるいは、デフォルト値を入れる場合:

if [金額] = null then
    0
else
    [金額] * 0.1
Power Query

「null のときどうするか」を明示することが、品質と安全性の両面で非常に重要です。

2. 型を意識して式を書く

カスタム列の結果には「型」が付きます。 数値計算なら number、フラグなら logical、文字列なら text など、 式の結果がどの型になるかを意識して書くことが大切です。

悪い例:true/falseを文字列で返す

if [金額] > 1000 then
    "true"
else
    "false"
Power Query

良い例:logical 型で返す

if [金額] > 1000 then
    true
else
    false
Power Query

後続のステップで、

  • logical 型なら Table.SelectRows でそのまま条件に使える
  • 文字列だと "true" / "false" の揺れが発生しやすく、セキュリティや品質に悪影響

という違いが出ます。

「フラグは logical、金額は number、表示用は text」という型の役割分担を意識しておくと、クエリ全体が安定します。

3. セキュリティ・品質に関わるロジックはコメントと関数化を検討する

カスタム列の中に、セキュリティや品質に関わる重要なロジックを直接書く場合、 後から読む人にとって意図が分かりづらくなることがあります。

悪い例:カスタム列に直接複雑な条件を書く

if [Role] = "Admin" and [IsActive] = true and [ApprovalFlag] = "Y" then
    true
else
    false
Power Query

良い例:関数に切り出して意味を明示する

let
    IsAllowedUser =
        (row as record) as logical =>
            // 管理者かつアクティブかつ承認済みユーザーのみ許可
            (row[Role] = "Admin"
                and row[IsActive] = true
                and row[ApprovalFlag] = "Y"),

    AddedAllowedFlag =
        Table.AddColumn(
            UserTable,
            "許可ユーザー",
            each IsAllowedUser(_),
            type logical
        )
in
    AddedAllowedFlag
Power Query

カスタム列の式が複雑になりそうなときは、 「関数に切り出す」「コメントで意図を書く」ことで、セキュリティと品質を守りやすくなります。

実務で使える「カスタム列Mコード」テンプレート

テンプレ1:消費税額列(null対応)

if [金額] = null then
    null
else
    [金額] * 0.1
Power Query

テンプレ2:重要顧客フラグ

[金額] >= 100000 and [顧客ランク] = "A"
Power Query

テンプレ3:有効行フラグ(品質チェック)

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

テンプレ4:顧客コード整形

Text.Upper(Text.Trim([顧客コード]))
Power Query

まとめ:カスタム列は“行ごとのロジックをコードとして刻む場所”

「カスタム列でMコードを書く」というのは、 「テーブルの各行が、業務的にどんな意味を持つのか」を、M言語の式として列に刻み込むことだと言えます。

それによって、

  • 金額・税・割引・粗利などの計算が明示される
  • 重要顧客・有効行・許可ユーザーなどのフラグがコードとして残る
  • セキュリティや品質のルールが、テーブルの形として可視化される

という大きなメリットが得られます。

ぜひ、

  • まず日本語で仕様を整理する
  • 列参照と演算・比較に分解する
  • null と型を意識して式を書く
  • セキュリティ・品質に関わるロジックはコメントと関数化も検討する

という流れを意識しながら、 カスタム列を「ただの計算欄」ではなく、業務ロジックと安全性を支える重要なコードの場所として活用していっていただきたいです。

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