変数を定義するとは何か
Power Query(M言語)で「変数を定義する」というと、急に難しく聞こえるかもしれませんが、実務で使う範囲ならイメージはとてもシンプルです。 M言語における「変数」とは、途中の計算結果やテーブルを“名前を付けて保存しておく箱”だと思ってください。
この「箱」に名前を付けておくことで、 後続の処理から何度でも参照できるようになり、 クエリが読みやすく・安全で・再利用しやすくなります。
M言語での変数定義の基本構文
let … in の中で「名前 = 値」を書く
M言語では、変数は let … in の中で 名前 = 値 と書くことで定義します。
最小の例は次のようになります。
let
x = 10,
y = x * 2
in
y
Power Queryここでのポイントは次の通りです。
xという変数に10を入れているyという変数にx * 2(つまり 20)を入れているin yなので、最終的な結果は 20
この「名前 = 値」が、M言語における変数定義の基本形です。
実務でよく使う「テーブル変数」の定義
例:売上テーブルを変数として定義する
実務では、数値よりも「テーブル」を変数として扱うことが圧倒的に多いです。
let
SalesTable =
Excel.CurrentWorkbook(){[Name="売上"]}[Content]
in
SalesTable
Power Queryここでは、
SalesTableという変数に「Excelの売上テーブル」を入れているin SalesTableなので、そのテーブルをそのまま返している
という構造になっています。
この SalesTable を後続のステップで何度でも参照できるようにしておくことが、 「変数を定義する」ことの実務的な意味です。
変数をステップとして積み上げる
変数は「ステップ名」として連鎖していく
Power Query の「適用したステップ」は、そのまま 変数定義の連続です。
let
SalesTable =
Excel.CurrentWorkbook(){[Name="売上"]}[Content],
FilteredHighAmount =
Table.SelectRows(SalesTable, each [金額] > 1000),
AddedTaxColumn =
Table.AddColumn(FilteredHighAmount, "税込金額", each [金額] * 1.1)
in
AddedTaxColumn
Power Queryここで定義されている変数は次の通りです。
SalesTable:元の売上テーブルFilteredHighAmount:金額が 1000 より大きい行だけを残したテーブルAddedTaxColumn:税込金額列を追加したテーブル
それぞれが「名前の付いた変数」であり、 後続の処理から参照できる「箱」になっています。
変数定義をステップバイステップで理解する
ステップ1:まず「意味のある名前」を決める
悪い例:
Step1 = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
Step2 = Table.SelectRows(Step1, each [金額] > 1000),
Step3 = Table.AddColumn(Step2, "税込金額", each [金額] * 1.1)
Power Query良い例:
SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
FilteredHighAmount = Table.SelectRows(SalesTable, each [金額] > 1000),
AddedTaxColumn = Table.AddColumn(FilteredHighAmount, "税込金額", each [金額] * 1.1)
Power Query変数名(ステップ名)は、「何が入っているか」が分かる名前にすることが重要です。 これはセキュリティ・品質の観点からも大事で、 「意図が分からない変数」は誤操作や誤修正の原因になります。
ステップ2:変数に“テーブル・数値・リスト”などを入れる
M言語の変数は、次のようなものを入れられます。
- 数値(例:
x = 10) - テキスト(例:
Message = "OK") - リスト(例:
Numbers = {1,2,3}) - レコード(例:
Info = [顧客コード="C001", 金額=1200]) - テーブル(例:
SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content])
実務では、テーブル変数と数値変数が特に重要です。
ステップ3:変数を再利用する
変数を定義する最大のメリットは「再利用できること」です。
let
SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
FilteredHighAmount =
Table.SelectRows(SalesTable, each [金額] > 1000),
FilteredLowAmount =
Table.SelectRows(SalesTable, each [金額] <= 1000)
in
FilteredHighAmount
Power Queryここでは、同じ SalesTable を使って「高額行」と「低額行」を別々に抽出しています。 元データを何度も読み込む必要はなく、変数として保持しておけば何度でも使えるのがポイントです。
変数定義で注意すべき重要ポイント
1. 変数名は一意でなければならない
同じ名前を二度定義すると、後の定義が前を上書きします。 意図的に上書きするならまだしも、誤って同じ名前を使うとバグの原因になります。
悪い例:
let
SalesTable = ...,
SalesTable = Table.SelectRows(SalesTable, each [金額] > 0)
in
SalesTable
Power Queryこれは「元の SalesTable がどこかで消えてしまう」ので、 読み手にとって非常に分かりづらいコードになります。
2. 変数名に機密情報を入れない
セキュリティの観点から、変数名やコメントに次のような情報を入れるのは避けるべきです。
- パスワード
- 認証トークン
- 個人情報の具体的な値
例:これは危険です。
AdminPassword = "P@ssw0rd!"
Power Query変数はコードの一部であり、 Power Query エディタを開ける人なら誰でも見られます。 機密情報は必ず別の安全な仕組みで管理するべきです。
3. 変数の「型」を意識する
M言語は型付き言語なので、変数に何が入っているか(型)を意識することが重要です。
- 数値なのか
- テキストなのか
- テーブルなのか
例:
TotalAmount =
List.Sum(SalesTable[金額]) // 数値
ValidSalesTable =
Table.SelectRows(SalesTable, each [金額] > 0) // テーブル
Power Query型を意識せずに変数を使うと、 「テーブルだと思っていたら実は数値だった」というようなバグにつながります。
実務で使える「変数定義テンプレート」
テンプレ1:元データ+クレンジング+フィルタ
let
// 元データを読み込む
RawSales =
Excel.CurrentWorkbook(){[Name="売上"]}[Content],
// 顧客コードの表記ゆれを修正
CleanedSales =
Table.TransformColumns(
RawSales,
{{"顧客コード", Text.Trim, type text}}
),
// 金額が0以下の行を除外
ValidSales =
Table.SelectRows(CleanedSales, each [金額] > 0)
in
ValidSales
Power Queryここでは、
RawSales:生データCleanedSales:クレンジング済みデータValidSales:業務上有効なデータ
という3つの変数を定義しています。
テンプレ2:集計用の数値変数
let
SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
TotalAmount =
List.Sum(SalesTable[金額]),
AverageAmount =
TotalAmount / Table.RowCount(SalesTable)
in
[合計金額 = TotalAmount, 平均金額 = AverageAmount]
Power Queryここでは、
TotalAmount:合計金額(数値)AverageAmount:平均金額(数値)
を変数として定義し、 最後にレコードとしてまとめて返しています。
まとめ:変数を定義することは「処理に名前を付けること」
M言語で変数を定義することは、単に値を入れるだけではなく、 「処理に名前を付けて、意味のある単位に分割すること」です。
これによって、
- クエリが読みやすくなる
- 修正しやすくなる
- 再利用しやすくなる
- セキュリティ・品質の観点からも安全になる
というメリットが得られます。
変数定義は、実務で通用する Power Query を書くための“基礎体力”ですので、 ぜひ「意味のある名前を付けて、テーブルや数値を変数として扱う」感覚を身につけていただきたいです。
