適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

【Power Query M式言語】let式について解説。なんとなくではなく意味を分かって使おう

Power Query M式言語のlet式について解説します。

環境

Windows10
Excel 2019

let~inってなんだ?

GUIでの操作がM式言語になるPower Query。生成される式は一見、暗号のようです。let ~ in ~ と書いてあります。このletってなんだ?M式言語を学ぼうとする上で、まず最初引っかかるところではないでしょうか。私もそうでした。

試しに空のクエリを作成し、詳細エディタを立ち上げてみます。

f:id:shinmai_papa:20211007095824p:plain

f:id:shinmai_papa:20210924232423p:plain すでにlet ~ inがいますね。これを見てしまうと「M式言語は必ずlet ~ in ~ の形をとるのか」と思えてきます。実はlet ~ in ~ はM式言語を記述するのに必須ではありません。let ~ in ~の形を取らなくてもM式言語を書くことはできます。

試しに詳細エディタの文字を一度全て消して、"Hello World"と書いてみます。

f:id:shinmai_papa:20210924232434p:plain

完了ボタンをクリックすると、let式を使わなくても結果が表示されました。

f:id:shinmai_papa:20210924232429p:plain

「なんだ、letっていらない子じゃん!!」

確かにlet式がなくてもクエリを作成できるのですが、let式を使わないと式を一つしか書くことが出来ません。式を一つしか書けないということは、例えば、Excelのワークシートを読み込んで、条件にあったレコードを抽出して、さらにそれをピボットして・・・といった一連の式を書くことができないということです。ここで、let式のドキュメントを引用してみましょう。

Power Query の M 式言語のクエリは、マッシュアップ クエリを作成する 式 の手順で構成されています。 式は評価 (計算) されて、値を生成することができます。 let 式には、計算され、名前を割り当てられた後、in ステートメントに続く後の式で使用される、一連の値がカプセル化されています。

式、値、let 式 - PowerQuery M | Microsoft Docs より

「let 式には、計算され、名前を割り当てられた後、in ステートメントに続く後の式で使用される、一連の値がカプセル化されています」とあります。ここにlet式とはなんぞや?という問いに対する答えがあります。

まず、「一連の値がカプセル化されている」とあります。カプセル化とは中に入っているくらいの意味です。そして、何がカプセル化されているかというと、「in ステートメントに続く後の式で使用される、一連の値」とあります。inの後に使う値が入っていると。どんな値?それは「計算され、名前を割り当てられた」値です。つまり、let式は、一連、つまり連続した式を作るための仕組みと言えます。

この連続した式を作るための仕組みこそがlet式です。そして、最後にその処理の結果を出力するのがinステートメントです。

let式の例

let式では、式に名前をつけます。処理1と処理2という式を作りました。処理1は1+1、そして処理2は処理1の結果+1です。最後にinステートメントで処理2の結果を出力しています。let式では連続した式を書くときは,(カンマ)で区切ります。

 
let
 処理1=1+1,
 処理2=処理1+1
in
 処理2

このようにlet式を使うことで各式に名前をつけることができ、さらに続く式で、その式の結果を使うことできます。

各式には名前が割り当てられており、その名前を使って、どこでも使うことができます。例えば次のように使うこともできます。

 
let
 処理1=1+1,
 処理2=処理1+1
in
 処理1

さきほどとの違いはinステートメントの後に処理1を出力していることです。なにも最後に割り当てた式をinの後に書く必要はありません。割り当てられた式は次の式で使うもよし、inステートメントの後に使うもよし、どこでも使うことが出来ます。

そして、この割り当てられた名前は、「適用したステップ」として表示されます。

f:id:shinmai_papa:20210924232438p:plain

つまり、名前を割り当てるというのは、このステップをひとつずつ作っていた、ということに他なりません。

今回の例ではlet式とはなんぞやという説明をするため単純な計算しか行っていませんが、名前の割り当てはテーブルやコード、リスト、その他処理の結果など、なんでも割り当てることができます。それらをlet式の中で連続的に定義し、クエリを作成し、最後にinステートメントで出力する・・・。この流れがM式言語の基本になります。

そして、このlet式こそが、M式言語の根幹を支えているといっても過言ではありません。M式言語をマスターするためには、このletと様々なカッコの意味を整理できるかどうかにかかっている・・・そんな気がします。

終わりに

Power Query M式言語のlet式について解説しました。

M式言語を学ぼうと思ったとき、この不思議すぎるlet ~ in ~に慣れることができず、戸惑ったのは私だけでしょうか・・・。

Microdoftのドキュメントを丁寧に紐解いていけばなんてことはないのですが・・・。

先達はあらまほしきことなりってやつですね。。

というわけで、ここまでお読みいただき、ありがとうございました。