
この日付変換、別のクエリでも使いたいんですけど、また同じ処理を書かないとダメですか?

毎回書く必要はないよ。Power Queryには『カスタム関数』という仕組みがあって、一度作った処理を何度でも使い回せるんだ。
Power Queryというと、「データを取り込んで変換ステップを積み上げていくツール」というイメージを持っている方が多いのではないでしょうか。
もちろんその使い方だけでも非常に便利ですが、Power Queryには関数(カスタム関数)を自作して再利用できる仕組みがあります。関数化することで作業効率やメンテナンス性を大きく向上させることができます。
「関数」と聞くと難しそうに感じるかもしれませんが、Power Queryのカスタム関数は基本的な仕組みを理解すれば意外とシンプルです。
この記事では、カスタム関数の基本的な作り方から、構文の読み方、呼び出し方、実際の活用例までを順番に解説します。これから関数を使い始めたい方は、ぜひ最後まで読んでみてください。
パワークエリで関数を作るメリット
パワークエリで関数を作成すると、同じ処理を何度も記述する必要がなくなり、作業効率が大きく向上します。
主なメリットは次のとおりです。
- 同じ処理を繰り返し書かなくて済む
- 複数のクエリで共通の処理を使い回せる
- 修正が必要になった場合も、関数側を変更するだけで全体に反映できる
- ステップが整理され、読みやすく管理しやすくなる
関数化は、パワークエリを単なるデータ変換ツールとして使うだけでなく、再利用可能な処理をまとめる仕組みとして活用できる便利なテクニックです。一度作った処理を何度も利用できるようになるため、実務で扱うデータが増えるほど効果を実感できるでしょう。
基本的な関数の作り方
ここでは、Power Queryで関数を作る基本的な手順を紹介します。
空のクエリを作成する
まずは関数を作成するための空のクエリを用意します。
空のクエリは、次のいずれかの方法で作成できます。
Excelから作成する場合
「データ」タブ→「データの取得」→「その他のデータソースから」→「空のクエリ」

Power Queryエディターのリボンから作成する場合
「ホーム」タブ→「新しいソース」→「その他のソース」→「空のクエリ」

クエリ一覧([クエリ]ウィンドウ)の右クリックメニューから作成する場合
Power Queryエディターの[クエリ]ウィンドウで右クリック→「新しいクエリ」→「その他のソース」→「空のクエリ」

操作が完了すると、「クエリ1」のように空のクエリが作成されます。

関数を書いてみる
それでは、実際に簡単な関数を作成してみましょう。
数式バーに次のコードを入力します。

= (x as number) => x * 2この関数は、「入力された数値を2倍にして返す」というシンプルな関数です。
なお、Power Queryでは数式を入力するときに「=」から書き始める必要があります。「=」を付けずに入力すると、コードではなく文字列として認識されてしまうので注意してください。
関数を呼び出してみる
関数を作成すると、Power Queryエディターに「呼び出し」ボタンが表示されます。
パラメーターの入力ボックスに「4」を入力し、「呼び出し」をクリックしてみましょう。

すると、「クエリ1」という関数に「4」が渡され、その結果を表示する新しいクエリが作成されます。

今回の関数は入力値を2倍にするため、結果として「8」が返されます。
このように、関数は「値を受け取り、処理を実行して結果を返す仕組み」と考えるとイメージしやすいでしょう。
関数では、
- 関数に渡す値のことを「引数」
- 関数の実行結果として返される値のことを「戻り値」
と呼びます。
今回の例では、「4」が引数で、その値をもとに計算された結果の「8」が戻り値です。
関数の基本構文を確認する
ここまでは簡単な関数を作成してきましたが、応用的な関数を作れるようになるために、関数の基本構造を確認しておきましょう。
関数の基本構文は次のようになっています。
(パラメータ1 as データ型, パラメータ2 as データ型,…) =>
処理内容「=>」の左側で受け取る値(パラメーター)を定義し、右側に実行する処理を記述します。
先ほど作成した関数も、この構文で書かれていました。
= (x as number) => x * 2この関数は「数値型の x を受け取り、x を2倍にした結果を返す」という意味になります。
戻り値のデータ型を指定する
この関数は、戻り値(実行結果として返される値)のデータ型を指定していないため、Power Query上では「any型」として扱われています。

any型は「どんな型でも受け入れられる型」です。便利な反面、データ型を明確にしたい場合もあります。そのような場合は、次のように戻り値のデータ型を指定できます。

= (x as number) as number => x * 2これで、関数の戻り値が数値型(number型)であることを明示できました。
戻り値のデータ型を含めた基本構文は次のようになります。
(パラメータ1 as データ型, パラメータ2 as データ型,…) as データ型 =>
処理内容詳細エディターで関数の構造を見てみる
次は、関数の内部構造をもう少し詳しく見てみましょう。
作成したクエリを選択し、「ホーム」タブ→「詳細エディター」を選ぶと、次のようなコードが書かれています。

let
ソース = (x as number) as number => x * 2
in
ソース関数全体が「let ~ in」の中に格納されていることが分かります。
このコードは、次のように書き換えることもできます。
(x as number) as number =>
let
ソース = x * 2
in
ソース関数の宣言部分を let の外へ移動し、実際の処理を let ~ in の中に記述した形です。
let ~ in の役割
Power Queryの「let ~ in」は、次のような構造になっています。
- let に処理内容を書く
- in に最終的に返す値を書く
今回の例では少し回りくどく見えるかもしれませんが、この書き方を使うことで処理を複数のステップに分けて記述できるようになります。
つまり、
(x as number) as number =>
let
処理1 = ... ,
処理2 = ... ,
処理3 = ...
in
処理3のように、複雑な処理を段階的に組み立てながら関数化できるようになるのです。実務で使うカスタム関数では、この「(パラメータ) => let ~ in」の組み合わせで作成されていることが多いと思います。
日付の「西暦 → 和暦」変換関数を作る
それでは、実際にカスタム関数を作ってみましょう。今回は、西暦の日付を和暦の日付へ変換する関数を作成します。実務でも日付の変換はよく使うため、カスタム関数の練習題材としてもおすすめです。
まずは空のクエリを作成し、クエリ名を「fn_西暦和暦変換」に変更します。
続いて、詳細エディターを開き、次のコードを入力します。

(西暦日付 as date) as text =>
let
y = Date.Year(西暦日付),
era =
if 西暦日付 >= #date(2019,5,1) then "令和" & Text.From(y - 2018)
else if 西暦日付 >= #date(1989,1,8) then "平成" & Text.From(y - 1988)
else if 西暦日付 >= #date(1926,12,25) then "昭和" & Text.From(y - 1925)
else if 西暦日付 >= #date(1912,7,30) then "大正" & Text.From(y - 1911)
else "不明",
和暦日付 =
era & "年" &
Text.From(Date.Month(西暦日付)) & "月" &
Text.From(Date.Day(西暦日付)) & "日"
in
和暦日付これで「fn_西暦和暦変換」というカスタム関数が完成しました。なお、今回は明治以前の元号は未対応という仕様にしています。
この関数は、西暦の日付を受け取り、その日付がどの元号に属するかを判定して和暦形式の文字列を返します。
関数を呼び出してみる
次は、作成した関数を実際のデータで使ってみましょう。
今回は、次のような日付テーブルを用意しました。

この日付テーブルに「和暦日付」列を追加してみます。
- 「列の追加」タブ→「カスタム関数の呼び出し」を選択
- 「カスタム関数の呼び出し」ウィンドウで先ほど作成した「fn_西暦和暦変換」を選択する

これで、新しい列として和暦の日付が追加されます。

これだけで、複数の日付を一括で和暦に変換できます。
関数を改修してさらに使いやすくする
変換結果を確認すると、少し気になる点があります。
- 元年が「1年」と表示される
- 月や日が1桁の場合に桁数がそろわない
例えば、
- 令和1年5月1日
- 令和元年05月01日
では見た目の統一感が異なります。
そこで、関数を少し改良してみましょう。
(西暦日付 as date) as text =>
let
y = Date.Year(西暦日付),
元号 =
if 西暦日付 >= #date(2019,5,1) then "令和"
else if 西暦日付 >= #date(1989,1,8) then "平成"
else if 西暦日付 >= #date(1926,12,25) then "昭和"
else if 西暦日付 >= #date(1912,7,30) then "大正"
else "不明",
元号年 =
if 西暦日付 >= #date(2019,5,1) then y - 2018
else if 西暦日付 >= #date(1989,1,8) then y - 1988
else if 西暦日付 >= #date(1926,12,25) then y - 1925
else if 西暦日付 >= #date(1912,7,30) then y - 1911
else 0,
年表示 =
if 元号年 = 1 then "元年"
else Text.PadStart(Text.From(元号年), 2, "0") & "年",
月 = Text.PadStart(Text.From(Date.Month(西暦日付)), 2, "0"),
日 = Text.PadStart(Text.From(Date.Day(西暦日付)), 2, "0"),
和暦日付 = 元号 & 年表示 & 月 & "月" & 日 & "日"
in
和暦日付これで、
- 令和元年05月01日
- 令和05年05月01日
のように、元年の表記や月日の桁数が統一された形式で表示できるようになりました。

このように、一度作成したカスタム関数は後から自由に改修できるのも大きなメリットです。関数を修正すれば、その関数を利用しているすべてのクエリに変更内容が反映されるため、メンテナンスがとても楽になります。
「同じ処理を使い回せる」だけでなく、「後からまとめて修正できる」という点も、カスタム関数を活用する大きなメリットと言えるでしょう。
まとめ
今回は、Power Queryのカスタム関数の基本的な作り方を解説しました。
カスタム関数を使うことで、
- 同じ処理を何度も書かなくて済む
- 複数のクエリで処理を使い回せる
- 修正を関数側で一括管理できる
- ステップが整理されて読みやすくなる
といったメリットがあります。
また、関数の基本構文やパラメーター(引数)、戻り値の考え方を理解しておくことで、自分で必要な処理を関数として作成できるようになります。
今回の例では、西暦の日付を和暦へ変換する関数を作成しました。関数を一度作っておけば、簡単に呼び出せるため、同じ処理を何度も作る必要がありません。さらに、変換ルールを変更したい場合も関数を修正するだけで済むため、メンテナンスも楽になります。
関数は数値や日付だけでなく、テーブルそのものを受け取ることもできます。そのため、普段Power Queryで作成している変換ステップをそのまま関数化することも可能です。この機能を使うと、複数のテーブルに同じ変換処理を簡単に適用できるようになります。
カスタム関数はPower Queryの中でも少し上級者向けの機能に見えますが、基本構文は意外とシンプルです。まずは今回紹介したような簡単な関数から作成し、少しずつ再利用できる処理を増やしていきましょう。
最後まで読んでいただき、ありがとうございました!

一度作ったら何度でも使えるなんて、カスタム関数めちゃ便利じゃないですか~!
優秀な人材は引っ張りだこですし、優秀な関数にも何度も登場してもらいましょう!