shikumika’s diary

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

【Power Query】保守性を考慮して列名変更に対応する動的クエリの事例

Power Queryを活用する際、データソースの列名が変更されることでエラーが発生し、クエリの修正が必要になるケースは少なくありません。しかし、Power Queryを十分に習得していない人にとっては、この修正作業が容易ではなく、負担が増えてしまうことがあります。
そこで今回は、列名変更の影響を受けずに動作する保守性の高い動的クエリの作成事例を紹介します。
特に、データソースの列名が変更される可能性が高い場合に活用できる実践的な方法です。

内容:

なお、確認のExcelは「Microsoft® Excel® for Microsoft 365 MSO」(バージョン2504)です。

動的な列名変更に対応する方法の基本

列名変更の影響を受けずにクエリを動作させるためには、Table.ColumnNames関数を使用して、データソースの列名をリストとして取得することが基本となります。

このリストを活用することで、変更された列名を直接指定することなく、クエリ内で動的に使用できます。また、リストのインデックスを用いることで、列番号で特定の列名を指定することが可能になります。

learn.microsoft.com

具体的な設定事例

列名変更に対応する動的クエリの事例として、以下で紹介したExcelシートを左右で結合する方法を題材に説明します。

shikumika.org

設定のアウトプットイメージ

上記事例「Excelシートを左右で結合する方法」で作成されたステップをPowerQueryの詳細エディターで確認した状態が下図の上側です。設定時のデータソースに存在した列名が直接記述されています("端末ID", "端末分類", "形式・仕様"などの記述 )。

一方、下図の下側は、Table.ColumnNames関数を使用してデータソースの列名を動的に取得しているため、列名が直接記述されることはなく、柔軟に対応できるクエリ設計になっています。

列名が直接記述されることはなく、柔軟に対応できるクエリになっています

動的な列名変更のクエリ設定イメージ

設定の補足説明

変更点は次のとおりです。

1.変更された型の削除

データの型変更が不要であったため、この事例では「変更された型」のステップを削除しています。型の変更が必要な場合は、列順序等で指定することになります。

2.マージされたクエリ数のステップ

この事例では、"端末ID"は各データソースの左端列(インデックスでは0番目)にありました。

次のように修正しています。

マージされたクエリ数 = Table.NestedJoin(変更された型, {"端末ID"}, 前回分, {"端末ID"}, "前回分", JoinKind.FullOuter),
 ↓
マージされたクエリ数 = Table.NestedJoin(ソース, {Table.ColumnNames(ソース){0}}, 前回分, {Table.ColumnNames(前回分){0}}, "前回分", JoinKind.FullOuter),

3.展開された 前回分マージされたクエリ数のステップ

テーブルの展開時、プレフィックスで元の列名が"前回分.○○"といった表記になっているので、次の中間ステップを追加しています。

展開列名 = List.Transform(Table.ColumnNames(前回分), each "前回分." & _),

これにより、次のテーブルが作成されています。

元の各列名に"前回分"という名称を追加しています

List.Transform(Table.ColumnNames(前回分), each "前回分." & _)の内容

この”展開列名”のデータを用いて、次のように修正しています。

#"展開された 前回分" = Table.ExpandTableColumn(マージされたクエリ数, "前回分", {"端末ID", "端末分類", "形式・仕様", "設置場所", "担当者"}, {"前回分.端末ID", "前回分.端末分類", "前回分.形式・仕様", "前回分.設置場所", "前回分.担当者"})

 ↓

#"展開された 前回分" = Table.ExpandTableColumn(マージされたクエリ数, "前回分", Table.ColumnNames(前回分), 展開列名)

修正箇所は以上です。

参考)その他の記載事例

前述の記載では、”展開列名”という中間ステップを作成していました。

元の各列名に"前回分"を付与できているか確認するためです。このステップを省略して

"展開された 前回分" の数式の中で記述する方法も、もちろん可能です。

#"展開された 前回分" = Table.ExpandTableColumn(マージされたクエリ数, "前回分", Table.ColumnNames(前回分), List.Transform(Table.ColumnNames(前回分), each "前回分." & _))

 

以上、Power Queryで保守性を考慮して「列名変更に対応する動的クエリ」の事例でした。

この方法を活用することでクエリの汎用性や再利用性も高まり、様々なデータソースにも適用しやすくなります。

ただし、動的クエリの修正が必要になった際に、Power Queryを十分に習得していない人にとっての難易度も向上します。

組織の状況や目的に応じて、この方法の適用が有効なのかも検討必要です。

shikumika.org