let … in の使い方
let … in の使い方を“構造から理解する”
Power Query(M言語)を初めて触る多くのユーザーが最初に戸惑うのが let … in の構造です。 しかし、実務で使う範囲なら「仕組みを一度理解すれば一生使える」ほどシンプルで強力な構文です。 ここでは、初心者でも迷わず書けるように、ステップバイステップで let … in をかみ砕いて解説します。
let … in は「処理の箱」と「出口」を作る構文
let は“処理ステップを並べる場所”
M言語のクエリは、ほぼすべて次の形で始まります。
let
Step1 = ...,
Step2 = ...,
Step3 = ...
in
Step3
Power Queryここで理解すべき最重要ポイントは次の2つです。
let:処理ステップ(変数)を上から順番に定義する場所 in:最終的に返す値(テーブル・リスト・レコードなど)を指定する場所
Power Queryの「適用したステップ」は、この let の中身そのものです。 つまり、画面で見ているステップ=M言語の let 内の変数定義なのです。
let の中身は“変数定義”であり“処理の積み上げ”
ステップ名はそのまま変数名
Power Queryのステップ名は、実はそのまま「変数名」です。 次のステップで前のステップを参照することで、処理を積み上げていきます。
let
Source = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
Filtered = Table.SelectRows(Source, each [金額] > 1000),
Added = Table.AddColumn(Filtered, "金額2倍", each [金額] * 2)
in
Added
Power Query流れはこうです。
- Source:売上テーブルを読み込む
- Filtered:金額が 1000 より大きい行だけ残す
- Added:金額2倍列を追加する
- in Added:最終結果として「列追加後のテーブル」を返す
この「ステップを積み上げる」という発想が、M言語の本質です。
let … in をステップバイステップで理解する
ステップ1:最小構文を読む
まずは最もシンプルな例を見てみます。
let
x = 10,
y = x * 2
in
y
Power Queryこれは「10 を 2倍した結果(20)を返す」だけのコードです。 ここで重要なのは、
in の値が最終結果になる
ということです。 どれだけ let の中にステップがあっても、返すのは in の値だけです。
ステップ2:テーブルを扱う例に進む
実務ではテーブルを扱うことがほとんどです。
let
Source = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
Added = Table.AddColumn(Source, "税込金額", each [金額] * 1.1)
in
Added
Power Queryこのコードは、
- 売上テーブルを読み込み
- 税込金額列を追加し
- その結果を返す
という流れです。
ステップ3:複数ステップを積み上げる
実務では、複数の処理を順番に積み上げることが多いです。
let
Source = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
Filtered = Table.SelectRows(Source, each [金額] > 1000),
Added = Table.AddColumn(Filtered, "金額2倍", each [金額] * 2),
Sorted = Table.Sort(Added, {{"金額2倍", Order.Descending}})
in
Sorted
Power Queryこのように、前のステップを次のステップで参照することで、 処理を積み上げていきます。
let … in を使いこなすための“深掘りポイント”
1. let の中は「上から順番に評価される」
M言語は宣言型ですが、let の中は上から順番に評価されます。 つまり、次のステップで前のステップを参照できるのはこのためです。
2. in は「出口」なので1つしか書けない
in の後に書けるのは 1つの値だけです。 そのため、複数の結果を返したい場合は、テーブルやレコードにまとめて返します。
例:
in
[正常行 = ValidTable, エラー行 = ErrorTable]
Power Query3. ステップ名は自由に変えられる
Power Queryが自動生成するステップ名は「ChangedType」「AddedCustom」などですが、 実務では読みやすい名前に変えることを強くおすすめします。
例:
FilteredHighValueRows
AddedTaxColumn
SortedByAmount
Power Query読みやすさは、保守性に直結します。
実務で使える let … in テンプレート集
テンプレ1:基本構造
let
Source = ...,
Step1 = ...,
Step2 = ...
in
Step2
Power Queryテンプレ2:フィルタ+列追加
let
Source = ...,
Filtered = Table.SelectRows(Source, each [数量] > 0),
Added = Table.AddColumn(Filtered, "金額", each [数量] * [単価])
in
Added
Power Queryテンプレ3:複数処理を積み上げる
let
Source = ...,
Cleaned = Table.TransformColumns(Source, {{"顧客コード", Text.Trim, type text}}),
Valid = Table.SelectRows(Cleaned, each [顧客コード] <> ""),
Final = Table.Sort(Valid, {{"顧客コード", Order.Ascending}})
in
Final
Power Querylet … in を理解すると何ができるようになるか
実務でのメリットは圧倒的です
let … in を理解すると、次のようなことができるようになります。
- Power Queryの自動生成コードを読める
- 自分でステップを追加できる
- クレンジング処理をテンプレート化できる
- 複雑な処理を「構造化」して書ける
- 他の人が書いた M コードを理解できる
つまり、Power Query を“使う側”から“操る側”に進化できるのです。
