【上級編】【PowerQuery】エクセルで出来る!自分で関数を作る方法!

これまでは
編集画面に元々そろっていた機能を使って
処理を組み立てていました!

もちろんこれをマスターするのも大事ですが…
今回はもう少し上のステップに進んでみましょう!

それは自分で関数を作る、です!
欲しい処理を自分で作って
関数として使える様にします!

でもそのためには
PowerQueryの正体を知る必要があります!
まずはここについて解説していきます!

動画で見たい方はコチラ

ステップの中身を理解しよう!

かじむー

ではまず「ステップ」の裏側を覗いてみよう!

このテーブルで説明していきます!
右にあるステップ一覧
このテーブルに対して行った処理一覧ですよね。

例えば「支店」列に対して「北海道」でフィルタをかけると
フィルターされた行」というステップが追加されました!

実はこの処理っていうのは
プログラム自動生成され記録されているのです。

どこか?というと
この「詳細エディター」になります。

ざ~っと見ると
先頭にLetて書いてて
その後なんとかイコールなんとかていうが沢山あって
最後In、なんちゃらって感じですね。

そしてよく見ると
イコールのは、ステップ名になっていますね!※一部異なる

イコールのは、数式部分になっていますね!

ステップとこのプログラムが
紐づいて見えてきましたね!

ではこのプログラムコードを
解読していこうと思います!

M言語を理解しよう!

かじむー

次はプログラムを読み解いていこう♪

実はこのような形式で表現しているコードを
M言語と呼びます。

この記述を理解する事が出来れば
PowerQueryの処理をコードから書いて作る事ができます!
ExcelのマクロをVBAから書いて作る感じですね!

では解説していきます。
まずLetからInの間についてです。

Letの記述について解説

まず「ソース」が何かとイコールになっていますよね!

M言語
ソース = Excel.Workbook(File.Contents("C:\YouTube\支店別売上.xlsx"), null, true)

イコールの右側には
Excel.Workbook や File.Contents という関数の記述があります。

そしてその中にファイルパスが記述されています。

これはエクセルファイルに接続する記述ですね!

この関数で得られた結果を「ソース」という名前のに入れた
そんなイメージです。プログラミングで言う変数ですね。

どんな結果なのか?というと・・・

このテーブルの状態を「ソース」としています!

では次に「支店別売上_Table」の記述を見てみましょう!

M言語
支店別売上_Table = ソース{[Item="支店別売上",Kind="Table"]}[Data]

なんと先ほどの「ソースがありますよね!

ここがM言語ポイントです!

「ソース」に対して
「売上支店別売上」という名前の
「Table」を取り出しています!

こんな風に

●前回の状態に何か処理を加える
●その結果を次の処理に渡す

と言った事を繰り返します。

こうやって見ていくと一番下のステップが
処理しつくされた状態のテーブルになりますね!

Inの記述について解説

ここは最終的にどの状態を結果として出すのかを決めます!

いま「フィルタされた行」というステップ名が書かれているので
この状態のテーブルが最終的に出力されています。

もしここを「変更された型」というステップ名を書けば
フィルタをかける前の状態が最終的に出力されます。

かじむー

なんとなく中身が見えてきたんじゃない?

そしてイコールのの記述って
ほぼPowerQueryの関数で出来上がってるんですよね!
という事は、PowerQueryの関数を駆使さえすれば
やりたい処理を実現できるんです!

M言語に限った話ではないですが
要は関数集合体です。

それではこれらの話を踏まえて
自分だけのオリジナルな関数を作ってみましょう!

カスタム関数を作ってみよう!

かじむー

では2つの値足し算する簡単な関数を作ってみましょう!

関数の処理部分を作る

まずは「空のクエリ」を作成します。

左のクエリ一覧の上で
右クリック→「新しいクエリ」→「その他のソース」→「空のクエリ」

ではM言語に沿って

M言語-処理
let
    x = 20,
    y = 30,
    result = x + y
in
    result

こんな風に x と y を合計する処理を書いてみると

20 + 30 で 「50」 という正しい結果が出てきましたね!

じゃあこれそのものを関数にする方法を紹介します!

因みに関数と言うのは
何か値を与えると結果が返ってくるもの
ExcelのSUM関数も
値を与えると合計という結果が返ってきますよね!

それでは話を戻します。
ここで xとyの値は固定じゃなくて
その都度、入力値として与えたいですよね?
そういう場合はこの様に記述します!

関数の入力情報を作る

M言語-入力情報
(x as number, y as number) =>

一行目にこんな風に書いてあげます!
「 x には 数値(number) が入りますよ~」
「 y には 数値(number) が入りますよ~」
と宣言してあげます!

この様に書く事で
これが独自関数認識されます

じゃあこの関数の名前を
「加算関数」とでもしておきます!

そしてクエリを閉じると・・・

「パラメータの入力」という画面になります!
ここに x = 100, y = 400 という値を与えて
「呼び出し」を押すと・・・

xとyを合計した「500」という数値が
新しいクエリになって返ってきました!

新しく生成されたクエリの中身を見てみると

HTML
ソース = 加算関数(100, 400)

という数式になっています!

先ほど作った関数の入力情報が 100 と 400 にあたり
中で合計されて結果が返ってきています!

これは簡単なものでしたが
M言語を理解できれば、自分が欲しい機能を実装して
カスタム関数が作れるよと言うお話でした♪♪

今回のまとめ

▼PowerQueryの正体

 M言語のプログラム

▼カスタム関数の作り方

 ①1行目に入力値
 ②Let~Inの間に処理
 ③Inに最終結果

PowerQuery関数の組合せの発想を鍛え
M言語でアウトプット出来るようになれば
プログラムから書いて処理を作る事が出来ます!

これを上手に作れる様になれば
ステップ数を減らしてスッキリさせたり
よく使うような処理をカスタム関数にして
処理を短くすることもできますね!

少し難しい話だったかもしれませんが
マスターすれば職場で効率化を任される
貴重な人材になっていきます!
業務効率を目指して頑張っていきましょう!

かじむー

業務改善のご相談はお気軽に♪