カスタム列で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 と型を意識して式を書く
- セキュリティ・品質に関わるロジックはコメントと関数化も検討する
という流れを意識しながら、 カスタム列を「ただの計算欄」ではなく、業務ロジックと安全性を支える重要なコードの場所として活用していっていただきたいです。
