shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Power Query】VLOOKUPの近似一致と同様処理:区間分け(ビニング)の方法

PowerQueryで、ExcelのVLOOKUP関数の「検索の型をTRUE」(近似一致)にする方法の備忘録。Excelでは、「年齢」を「年代」に変換など、区間分け(ビニング)にVLOOKUP関数は便利です。

PowerQueryでも同様の処理を実現したい場合があり、その手順は次のとおりです。

内容:

事例の前提

ExcelのVLOOKUP関数で実施する次の事例をPowerQueryで同様に処理する。

この事例は、VLOOKUP関数の「検索の型をTRUE」(近似一致)にすることで、年齢を年代に変換する方法についてのものです。

shikumika.org

アウトプットイメージ

「顧客マスタ」の年齢を「年代テーブル」で検索して近似一致の「年代」を抽出する。

年齢を年代に変換している

アウトプットイメージ

上記の元データは、次の「顧客マスタ」と「年代テーブル」。

「顧客マスタ」に年齢、「年代テーブル」に年齢区分を含む表がある

「顧客マスタ」と「年代テーブル」の内容

実施手順

上記の「顧客マスタ」と「年代テーブル」クエリがある状態から以下説明します。

なお、「カスタム関数を使用する方法」、「カスタム列で実施する方法」の2つがあります。数式の理解がしやすいのは、カスタム関数を使用する方法と思います。

カスタム関数を使用する方法

「空のクエリ」の作成

「ホーム」-「新しいソース」-「その他のソース」-「空のクエリ」をクリック

「ホーム」-「新しいソース」-「その他のソース」-「空のクエリ」をクリック

「空のクエリ」の作成
カスタム関数の作成

「空のクエリ」(事例では、クエリ1という名称)が作成されるので、中央の数式欄に次の内容を入力、Enterで確定する。

= (検索年齢 as number) =>  Table.Last(Table.FirstN(年代テーブル,each [年齢区分] <= 検索年齢))[年代]

青字部分:変数名

赤字部分:クエリ、フィールド名によって異なる

数式欄に次の数式を入力する

カスタム関数の作成例
カスタム関数の名称変更

画面左側にfxのマークがあるクエリ(カスタム関数)が追加されるので、カスタム関数名をわかりやすい名前に変更する(事例では「年代変換」としている)。

「クエリ1」を「年代変換」に名称変更している

カスタム関数の名称変更
カスタム関数の呼び出し

「顧客マスタ」のデータに年代を追加するため、「顧客マスタ」を選択後、「カスタム関数の呼び出し」をクリックする。

メニューにある「カスタム関数の呼び出し」をクリック

カスタム関数の呼び出し
カスタム関数の設定

作成したカスタム関数を選択し、変数に「年齢」を設定する

カスタム関数の設定

以上で、次のとおり年齢から年代を抽出され、VLOOKUPの近似一致と同様処理ができている。

年齢から年代が抽出されている

カスタム関数の呼び出し後

カスタム列で実施する方法

カスタム関数を作成したくない場合などは、カスタム列で実施することも可能。

考え方等は以下を参考にさせていただきました。

nandemo-xl.hatenablog.com

カスタム列の追加

追加したいクエリ(事例の場合は、「顧客マスタ」のクエリ)において、メニューの「列の追加」-「カスタム列」をクリックし、次の内容を入力する。

[
  検索年齢 = [年齢],
  変換結果 = Table.Last(Table.FirstN(年代テーブル, each [年齢区分]<=検索年齢))[年代]
][変換結果]

青字、緑字部分:変数名

赤字部分:クエリ、フィールド名によって異なる

上記の内容を入力する

カスタム列の追加

上記でOKをすると、以下となる。

カスタム列を使用して年齢を年代に変換している

カスタム列での実行結果

なお、カスタム列の設定後に自動生成された上記の数式は次のとおり。

= Table.AddColumn(ソース, "年代(関数なし)", each [
  検索年齢 = [年齢],
  変換結果 = Table.Last(Table.FirstN(年代テーブル, each [年齢区分]<=検索年齢))[年代]
][変換結果])

以上、Power QueryでVLOOKUPの近似一致と同様処理する方法の備忘録でした。