Power Queryの裏側で動いている「M言語」は、データの変換や整形を自動化するための強力なスクリプト言語です。
ExcelやPower BIを使っていると、クエリエディタの中に見慣れないコードが表示されることがありますが、それがまさにM言語です。
この記事では、M言語の基本構造から、実際の使い方、応用例までをわかりやすく解説します。
「なんとなく操作で済ませていたけど、M言語を理解して効率化したい」という方にぴったりの内容です。
M言語とは?Power Queryの心臓部を理解しよう
Power Query M言語(以下、M言語)は、Microsoftが開発したデータ変換専用の関数型言語です。
ExcelやPower BIの「クエリエディタ」で行う操作は、すべて内部的にM言語のコードとして記録されています。
つまり、ボタン操作で行う変換も、裏ではM言語のスクリプトが実行されているのです。
M言語は「関数型プログラミング言語」と呼ばれ、手続き的に「こうやる」と命令するのではなく、「何をしたいか」を定義していくスタイルです。
たとえば、テーブルの列をフィルタする操作を行うと、自動的に次のようなコードが生成されます。
= Table.SelectRows(前のステップ, each [売上] > 10000)
このように、関数と条件を組み合わせて「データをどう変換するか」を指定します。
PythonやVBAのように長いロジックを書かず、シンプルに目的を記述できるのが特徴です。
M言語の構造を理解しよう
M言語は、基本的に「ステップ」と呼ばれる処理の連続で構成されています。
Power Queryエディタで表示される各ステップ(例:ソース、列の削除、並べ替えなど)は、M言語の1行のコードとして記録されます。
基本構文は次のようになります。
let
ソース = Excel.CurrentWorkbook(){[Name="売上データ"]}[Content],
フィルタ = Table.SelectRows(ソース, each [売上] > 10000),
並べ替え = Table.Sort(フィルタ, {{"売上", Order.Descending}})
in
並べ替え
この構文では以下のような流れになります。
- let:処理の開始。変数を定義していく部分です。
- in:最終的に返す結果(テーブルや値)を指定します。
- =:変数に対して関数の結果を代入します。
- ,(カンマ):複数のステップを区切るために使用します。
つまり、letブロックで複数の変換処理を定義し、inで最終結果を返すという構造になっています。
この仕組みを理解することで、自分でステップを追加したり、不要な処理を削除したりと柔軟な編集が可能になります。
よく使われるM言語の関数一覧
M言語には数百もの関数が存在しますが、日常的なデータ処理でよく使われる代表的な関数を紹介します。
| 分類 | 関数名 | 概要 |
|---|---|---|
| テーブル操作 | Table.SelectRows | 条件を満たす行を抽出 |
| テーブル操作 | Table.AddColumn | 新しい列を追加 |
| テーブル操作 | Table.RemoveColumns | 指定した列を削除 |
| 並べ替え | Table.Sort | 指定した列でソート |
| グループ化 | Table.Group | 集計やグルーピング |
| 型変換 | Table.TransformColumnTypes | 列のデータ型を変更 |
| 文字列操作 | Text.Upper | 文字列を大文字に変換 |
| 文字列操作 | Text.Contains | 指定文字列が含まれるか判定 |
| 日付操作 | Date.Year | 年を抽出 |
| 日付操作 | Date.AddDays | 日付を加算・減算 |
これらを組み合わせることで、Excelで複雑な処理をしていたデータ整形を、一瞬で自動化できるのがM言語の強みです。
実践例:特定の条件でフィルタして集計する
ここでは、売上データを「特定の支店の売上のみ抽出し、月別に集計する」例を見てみましょう。
let
ソース = Excel.CurrentWorkbook(){[Name="売上データ"]}[Content],
支店抽出 = Table.SelectRows(ソース, each [支店] = "東京"),
日付型変換 = Table.TransformColumnTypes(支店抽出, {{"日付", type date}}),
月追加 = Table.AddColumn(日付型変換, "月", each Date.Month([日付])),
グループ化 = Table.Group(月追加, {"月"}, {{"合計売上", each List.Sum([売上]), type number}})
in
グループ化
このコードでは、
- データを読み込み(
ソース) - 東京支店のデータを抽出(
Table.SelectRows) - 日付列を正しい型に変換
- 月列を追加
- 月ごとの売上合計を集計
という流れになっています。
M言語を理解していると、GUI操作よりも細かく柔軟な集計ロジックを組めるようになります。
M言語を使いこなすコツ
① 自動生成されたコードを観察する
Power Queryで操作を行うと、自動的にMコードが右側のエディタに生成されます。
そのコードを見て、どの関数が使われているかを確認することで、少しずつM言語の文法に慣れていけます。
② 手動で編集してみる
ステップ名を変更したり、条件を追加したりして、コードを直接修正する練習をしましょう。
特に、条件式の部分(each [列名] > 100など)を変えてみるのが理解を深める近道です。
③ 関数を分解して考える
M言語は「小さな処理の積み重ね」で構成されます。
複雑なコードも、1ステップずつ分けて考えるとシンプルに理解できます。
「この行では何をしているのか?」を意識して読む癖をつけると良いでしょう。
M言語とExcel VBAの違い
Excelに慣れている方の中には「M言語はVBAと何が違うの?」と疑問に思う方も多いです。
主な違いを以下にまとめます。
| 項目 | M言語 | VBA |
|---|---|---|
| タイプ | 宣言的(関数型) | 命令的(手続き型) |
| 処理対象 | データ変換・整形 | Excel操作全般 |
| 実行環境 | Power Query | Excel本体 |
| メリット | 自動記録され、再現性が高い | 柔軟だがミスのリスクあり |
| コード記述 | シンプルで短い | 比較的冗長 |
M言語は「データ処理に特化したExcelの補助エンジン」と考えるとわかりやすいです。
複雑なマクロを書くよりも、Power Queryで処理を組み立てた方が、保守性や再利用性に優れています。
応用:カスタム関数を作成する
M言語では、自分で関数を定義して使うこともできます。
たとえば「税抜価格から消費税込み価格を求める関数」を作る場合、次のように書けます。
(価格 as number) as number =>
let
税率 = 0.1,
税込 = 価格 * (1 + 税率)
in
税込
この関数を「AddTax」という名前で保存すれば、次のように呼び出せます。
= Table.AddColumn(売上データ, "税込価格", each AddTax([価格]))
このようにカスタム関数を使うことで、同じ処理を繰り返す手間を大幅に減らせます。
まとめ
Power Query M言語は、データ整形を効率化するための強力なツールです。
見慣れない構文に最初は戸惑うかもしれませんが、構造を理解してしまえば、GUI操作よりも柔軟にデータを扱えるようになります。
- M言語はPower Queryの内部で動く関数型言語
letとinが基本構文Table.SelectRowsなどの関数で変換処理を定義- 自動生成されたコードを観察・修正することで理解が深まる
