Power Queryでのデータ加工中、「列名をステップごとに変更するのが面倒」「もっと複雑な条件分岐ができればいいのに」などと感じたことはありませんか?
あるいは、興味本位で「詳細エディター」を開いたものの、何が書いてあるか分からず、そっと画面を閉じてしまった経験があるかもしれません。
実は、Power Queryの裏側で動いているM言語を少し理解するだけで、マウス操作だけでは出来ない式の修正が可能になり、業務効率は飛躍的に向上します。
この記事では、プログラミング未経験の方でも理解できるように、M言語の仕組みと実務ですぐに使える基本構文を分かりやすく解説します。
M言語(Power Query M 数式言語)とは何か
M言語は、Power BIやExcelのPower Queryで使用される、データ変換・マッシュアップのための関数型言語です。
普段、リボンメニューのボタンをクリックして「列の削除」や「型の変更」を行っていますが、実はその裏側では、操作の一つひとつがこのM言語のコードとして自動的に記述されています。

つまり、皆さんは知らず知らずのうちにM言語を作成しているのです。
Excel数式やVBAとの決定的な違い
Excelのワークシート関数やVBA(マクロ)との違いを整理します。
- Excel関数: 「セル」単位で計算を行います。
- VBA: 「手続き」や「操作」を自動化するための言語です。
- M言語: 「データ(テーブル)」全体に対して、順序立てて変換処理を行うことに特化しています。
Excel関数が「このセルの値」を対象にするのに対し、M言語は「この列全体」や「テーブル全体」を対象に処理を行うイメージです。
なぜM言語を学ぶ必要があるのか
GUI(マウス操作)機能は非常に優秀ですが、万能ではありません。M言語を学ぶことで、以下のような「GUIの限界」を突破できます。
- 複雑な条件分岐: GUIの「条件列」よりも高度な論理判定が可能になります。
- 動的な処理: 今日の日付を基準にファイルパスを変えるなど、柔軟な連携が可能になります。
- エラーハンドリング: エラー発生時に処理を止めず、別の値を代入するといった制御が可能になります。
参考:Power Query M 数式言語リファレンス – PowerQuery M | Microsoft Learn
M言語の基本構造「let … in」を理解する
詳細エディターを開くと、必ず目にするのが let と in という単語です。これがM言語の骨組みとなります。
「let」は計算過程、「in」は最終結果
M言語のコードは、料理のレシピに例えると分かりやすくなります。
- let: 調理の「手順」を記述する場所です。(野菜を切る → 炒める → 味付けする)
- in: 完成した「料理」をお皿に出す場所です。(最終的にテーブルに表示したい結果)
let
ソース = Excel.CurrentWorkbook(){[Name="売上明細"]}[Content],
変更された型 = Table.TransformColumnTypes(ソース,{{"売上日", type datetime}, {"商品名", type text}, {"得意先", type text}, {"数量", Int64.Type}, {"金額", Int64.Type}}),
#"変更された型 1" = Table.TransformColumnTypes(変更された型,{{"売上日", type date}}),
追加されたカスタム = Table.AddColumn(#"変更された型 1", "単価", each [金額] / [数量])
in
追加されたカスタム上記のコードでは、let の中で「ソース」→「変更された型」→「変更された型 1」→「追加されたカスタム」という順にステップが進んでいます。そして、最後に in の後ろにある「追加されたカスタム」が、Power Queryの画面に表示される結果となります。
変数名の注意点
自動生成されるコードを見ると、#"変更された型 1" のように、ハッシュタグとダブルクォーテーションで囲まれた記述が目立ちます。
これは、変数名(ステップ名)にスペースが含まれる場合の特別な書き方です。
実務で必須となる基本的な文法とデータ型
M言語を手書き、あるいは修正する際に最低限知っておくべきルールを紹介します。
大文字・小文字は厳密に区別される
Excel関数では vlookup と小文字で書いても VLOOKUP と認識されますが、M言語は完全な別物として扱われます。
例えば、Text.Start を text.start と書くとエラーになります。関数名の先頭は大文字であることが多いです。

主要なデータ型と書き方
実務で頻出するデータ型の記述方法です。
- テキスト(Text): ダブルクォーテーションで囲みます。
- 例:
"東京都"
- 例:
- 数値(Number): そのまま記述します。
- 例:
123,10.5
- 例:
- 日付(Date):
#date関数を使用します。- 例:
#date(2026, 12, 31)
- 例:
リスト { } とレコード [ ] の使い分け
M言語特有の構造として、「リスト」と「レコード」があります。これらはExcelの行と列の概念で理解するとスムーズです。
- リスト
{ ... }: 「1つの列」のようなイメージです。データを縦に並べたものです。- 例:
{1, 2, 3}や{"A", "B", "C"}
- 例:
- レコード
[ ... ]: 「1つの行」のようなイメージです。項目名(列名)と値がセットになっています。- 例:
[ 商品名="外付けSSD 1TB“, 数量=4, 金額=36000 ]
- 例:
この違いを理解しておくと、例えば「特定の列だけを選択したい」場合はリスト形式 {" で指定するなど、関数の引数を理解しやすくなります。商品名", "金額"}
GUI操作では難しい!M言語による高度な加工の実践例
ここからは、実務で役立つ具体的なコードの書き方を紹介します。これらは「カスタム列の追加」ダイアログなどで直接記述できます。
if … then … else による条件分岐
ExcelのIF関数と同様の処理ですが、M言語では構文が異なります。
Excelの IF(条件, 真の場合, 偽の場合) とは異なり、プログラミングのように記述します。
if [金額] >= 10000 then "高" else "低"さらに条件を重ねる(else if)場合は以下のように書きます。
if [金額] >= 10000 then "高"
else if [金額] >= 5000 then "中"
else "低"改行を入れて可読性を高めるのがコツです。
try … otherwise を使ったエラーハンドリング
ExcelではIFERROR関数でエラー時の処理を書けますが、M言語でも同様の機能があります。
数量にエラーがあるテーブルをPower Queryで読み込んだとします。

単価を求めるために、金額÷数量という式を書いてしまうと、数量がエラーになっている場合、計算結果がErrorになってしまいます。
[金額] / [数量]
try ... otherwise 構文を使用すると、エラーが発生した場合の代替値を指定できます。
try [金額] / [数量] otherwise 0Errorが解消されました。

エラー時の処理を書くことが出来るため、想定外のデータが混入したときにも対応できます。
初心者が陥りがちな「M言語の罠」と対処法
詳細エディターを編集する際によくあるミスを紹介します。
カンマ(,)の付け忘れ
let の中のステップは、最後のステップを除き、行末に必ずカンマ , が必要です。
let
ソース = ..., // ← ここにカンマがないとエラー!
変更された型 = ...
in
変更された型詳細エディターでステップを追加したり削除したりした際、カンマを消し忘れたり、付け忘れたりするミスが多発します。エディターの下部に「トークン ‘,’が必要です」と表示されたら、行末を確認してください。
数式バーと詳細エディターの使い分け
すべてのコードを詳細エディターで書く必要はありません。
- 数式バー: 1つのステップ内の微修正(列名の変更や、引数の数値変更など)に適しています。
- 詳細エディター: クエリ全体の構造変更や、複数行にわたる複雑なロジックの記述に適しています。
まずは数式バーの表示をオンにし、自動生成されたコードを眺めることから始めるのがおすすめです。

まとめ
Power QueryのM言語は、一見難解に見えますが、基本構造である let ... in と、いくつかのデータ型のルールを理解すれば、決して怖いものではありません。
- M言語は「データ変換の手順書」である。
letで手順を書き、inで結果を出す。ifやtryを使うことで、GUIでは不可能な柔軟な処理ができる。- ステップ名の
#"..."や行末のカンマに注意する。
まずは、GUIで作ったクエリの「詳細エディター」を開き、「どこで何をしているのか」を解読することから始めてみてください。コードの意味が分かれば、データ加工の自由度は無限に広がります。

