Power QueryのM言語入門|カスタム列で四則演算・文字列結合・日付抽出・null処理

スポンサーリンク

「Power Queryのカスタム列って、何やら難しそうな言語が出てきて身構える」——そんな声をよく聞きます。確かに「M言語」と聞くとプログラミングの世界に足を踏み入れる気がしてハードルが高く感じますよね。

でも安心してください。実務で使うM言語は、ほんの数パターンを押さえれば十分こなせます。しかも全部を暗記する必要はまったくなく、「こういうことがやりたい」と思ったときに調べられれば問題ありません。

この記事では、カスタム列の追加方法から、M言語の基本構造、そして実務でよく使う4つのパターン(四則演算・文字列結合・日付抽出・null処理)を、同僚に教えるような感覚で順番に解説していきます。最後によく使うM関数の早見表も用意したので、ブックマーク代わりに使ってください。

Power Query全体の位置づけをまず知りたい方は、Power Queryとは|モダンExcelの三本柱を完全解説を先に読むと、この記事の内容がより立体的に理解できます。

カスタム列とは何か|既存の列から新しい列を作る機能

カスタム列とは、ひとことで言うと「既存の列を組み合わせて、新しい列を作る機能」です。

たとえば「単価」列と「数量」列があるとき、その2つを掛け算した「金額」列が欲しくなりますよね。Excelのワークシートなら =B2*C2 と数式を書いてオートフィルする作業ですが、Power Queryではこれをカスタム列として一度定義するだけで、行数が何万行になっても、データを更新しても自動で計算されます。

カスタム列を追加する手順はとてもシンプルです。

  1. Power Query エディターを開く
  2. 上部リボンの「列の追加」タブをクリック
  3. 「カスタム列」ボタンをクリック
  4. 表示されたダイアログで、新しい列の名前と数式(M言語)を入力する

ダイアログの右側には「使用できる列」の一覧が表示されます。ここから列名をダブルクリックすると、数式欄に [列名] の形で挿入されます。この [列名] という角かっこ記法が、M言語で「その列の値を参照する」という意味になります。

つまりカスタム列で行うことは、「角かっこで列を呼び出して、それを計算・加工する式を書く」だけです。難しく考えず、まずはこの一点だけ覚えておけば大丈夫です。

M言語のlet〜in構造を読めるようになる

カスタム列のダイアログでは1行の式を書くだけですが、Power Query全体の処理は「M言語のコード」として裏側で組み立てられています。この全体像を眺めると、Power Queryで何が起きているかが一気にわかるようになります。

詳細エディターでコードを覗いてみる

「ホーム」タブの「詳細エディター」を開くと、これまでマウス操作で行ってきた処理が、すべてM言語のコードとして書かれているのが見えます。たとえばこんな具合です。

let
    ソース = Excel.CurrentWorkbook(){[Name="売上テーブル"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"単価", Int64.Type}, {"数量", Int64.Type}}),
    追加されたカスタム = Table.AddColumn(変更された型, "金額", each [単価] * [数量])
in
    追加されたカスタム

最初は呪文のように見えるかもしれませんが、構造はとても素直です。

let〜inは「手順書」だと考える

letin で囲まれた部分は、料理のレシピや作業手順書のようなものだと考えてください。

  • let の後に、処理のステップを上から順番に並べる
  • 各ステップは ステップ名 = 処理内容 の形で書く
  • 各ステップの末尾はカンマ , で区切る(最後のステップだけカンマ不要)
  • in の後に、最終的に出力したいステップ名を書く

先ほどのコードを日本語に訳すとこうなります。

ステップ名やっていること
ソース「売上テーブル」を読み込む
変更された型単価と数量を整数型に変換する
追加されたカスタム金額列(単価×数量)を追加する

そして in 追加されたカスタム は「最終的に『追加されたカスタム』の状態を結果として出してください」という意味です。

ここで大事なのは、各ステップが「ひとつ前のステップ名を受け取って、次の加工をしている」という点です。Table.AddColumn(変更された型, ...) のように、前のステップ名を引数として渡してバトンをつないでいるわけですね。Power Queryで操作を1つ追加するたびに、このステップが1行ずつ増えていきます。

カスタム列で書く [単価] [数量] という式は、この each [単価] [数量] の部分に対応しています。each は「各行に対して」という意味のキーワードで、行ごとに角かっこの列を参照して計算する、と覚えておけば十分です。

データの読み込みからこうした基本操作の流れを通しで確認したい方は、Excel Power Query入門|コピペ集計を卒業する4つの自動化レシピも参考になります。

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

ここからが本題です。実務でカスタム列を使う場面は、突き詰めると次の4パターンにほぼ集約されます。それぞれ具体的な式とともに見ていきましょう。

パターン1|四則演算(単価×数量、税込計算など)

もっとも基本的なのが数値の計算です。演算子はExcelとほぼ同じで、+ - * / をそのまま使えます。

// 金額(単価 × 数量)
[単価] * [数量]

// 税込金額(金額 × 1.1)
[金額] * 1.1

// 単価から原価を引いた粗利
[単価] - [原価]

注意点として、計算に使う列は「数値型」になっている必要があります。もし列が「テキスト型」のままだと計算がうまくいかないので、事前に「データ型」を整数や10進数に変換しておきましょう。型変換も含めたデータ整形の基礎は、Power Queryのデータ整形入門|置換・型変換・条件列で自動クレンジングで詳しく扱っています。

パターン2|文字列結合(姓名の連結、コード生成など)

複数の列のテキストをつなげたいときは、& 演算子を使います。これもExcelと同じ感覚です。

// 姓と名を半角スペースでつなぐ
[姓] & " " & [名]

// 部署コードと社員番号をハイフンでつなぐ
[部署コード] & "-" & [社員番号]

ここで一点だけつまずきやすいポイントがあります。& でつなげられるのは「テキスト同士」だけです。もし社員番号が数値型の列だった場合、そのままでは結合できずエラーになります。その場合は Text.From() という関数で数値をテキストに変換してからつなぎます。

// 数値の社員番号をテキストに変換してから結合
[部署コード] & "-" & Text.From([社員番号])

「型が違うと結合できない」「Text.Fromで揃える」——この2つを覚えておくと、文字列まわりのトラブルはほぼ解決できます。氏名や住所の分割・結合に特化した手法は、Power Queryで列を分割・結合する方法|氏名や住所の整形を自動化にまとめています。

パターン3|日付の抽出(年・月・曜日の取り出し)

日付列から「年だけ」「月だけ」を取り出して集計の軸にしたい、というのは月次レポートで頻出のニーズです。日付を扱う関数は Date. で始まるものを使います。

// 受注日から年を取り出す
Date.Year([受注日])

// 受注日から月を取り出す
Date.Month([受注日])

// 受注日から日を取り出す
Date.Day([受注日])

// 受注日の曜日を数値で取り出す(0=日曜)
Date.DayOfWeek([受注日])

Date.Year([受注日]) のように書けば、「2026/06/08」から 2026 という数値が取り出せます。これを使えば「年別」「月別」のピボット集計が一気にやりやすくなります。

関数名がうろ覚えでも、カスタム列ダイアログで Date. と打ち始めると候補がポップアップで表示されます。一覧から選べばよいので、スペルを丸暗記する必要はありません。

パターン4|null処理(空欄を別の値に置き換える)

実務データには空欄(null)がつきものです。空欄のまま計算しようとするとエラーや想定外の結果になるので、適切に処理しておきます。ここで活躍するのが if 〜 then 〜 else という条件分岐です。

// 備考が空欄なら「なし」、そうでなければ元の値
if [備考] = null then "なし" else [備考]

// 数量が空欄なら0として扱う
if [数量] = null then 0 else [数量]

M言語の if 〜 then 〜 else は、Excelの IF 関数と考え方は同じですが、書き方が「英文のように読める」形になっているのが特徴です。「もし(if)〜なら(then)〜、そうでなければ(else)〜」と素直に読めますね。

もうひとつ便利なのが ?? という演算子です。「左がnullなら右の値を使う」という意味で、null処理を短く書けます。

// 数量がnullなら0、そうでなければそのまま(上のif文と同じ意味)
[数量] ?? 0

短く書きたいときは ??、複雑な条件を組みたいときは if 〜 then 〜 else、と使い分けると読みやすいコードになります。

全部覚えなくていい|よく使うM関数早見表

ここまで読んで「関数がいろいろ出てきて覚えきれない」と感じたかもしれません。でも繰り返しになりますが、M言語は暗記する必要がありません。

実務でやることは「やりたい処理を思い浮かべる → 該当しそうな関数を調べる → カスタム列に書く」の繰り返しです。プロのエンジニアでも関数名を毎回検索しています。大事なのは「こういう処理にはこの系統の関数がある」というアタリをつけられることです。

そのアタリをつけるための早見表を用意しました。困ったときにこの表に戻ってきてください。

やりたいこと使う関数・記法記述例
数値を計算する+ - * /[単価] * [数量]
文字列をつなぐ&[姓] & [名]
数値をテキストに変換Text.FromText.From([番号])
テキストを数値に変換Number.FromNumber.From([金額文字列])
大文字・小文字に変換Text.Upper / Text.LowerText.Upper([コード])
前後の空白を削除Text.TrimText.Trim([氏名])
文字列の一部を抜き出すText.Start / Text.MiddleText.Start([電話], 3)
年・月・日を取り出すDate.YearDate.Year([日付])
曜日を取り出すDate.DayOfWeekDate.DayOfWeek([日付])
条件で値を分けるif 〜 then 〜 elseif [売上] > 1000 then "A" else "B"
nullを別の値にする??[数量] ?? 0
数値を四捨五入するNumber.RoundNumber.Round([金額], 0)

この表にある関数を「どこかで見たな」と思い出せれば、あとは関数名で検索すれば使い方はすぐに出てきます。最初から全部を覚えようとせず、必要になったときにこの表へ戻ってくる——それがM言語と長く付き合うコツです。

まとめ|カスタム列は「調べながら使う」が正解

Power QueryのM言語とカスタム列について、基本から実務4パターンまで解説してきました。最後に要点を振り返ります。

  • カスタム列は「既存の列を角かっこ [列名] で呼び出して加工し、新しい列を作る」機能
  • M言語の let 〜 in は「処理の手順書」。ステップを上から順に積み重ね、最後に出力するステップを指定する
  • 実務の大半は四則演算・文字列結合・日付抽出・null処理の4パターンでカバーできる
  • 関数名は暗記不要。早見表でアタリをつけて、必要なときに調べれば十分

M言語は「全部覚えてから使う」ものではなく、「使いながら少しずつ覚える」ものです。まずはカスタム列で [単価] * [数量] のような簡単な計算から試してみてください。一度成功体験を得ると、あとは早見表を片手にどんどん応用が利くようになります。

Power Queryの機能全体をさらに深掘りしたい方は、Power Queryとは|モダンExcelの三本柱を完全解説も合わせてご覧ください。

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