Power Queryのクエリにフォルダパスや対象月を直接書いていると、値を変えるたびにエディターを開いてM言語を書き直すことになります。Excel.CurrentWorkbook() を使えば、同じブックのシートに置いたテーブルや名前付き範囲の値をクエリから読み込めます。そうすると、セルの値を書き換えて更新するだけで条件を切り替えられます。
この記事では、設定用のセルを用意してクエリから参照するまでの手順と、名前が見つからないエラー、Formula.Firewallエラーが出たときの確認の順番を説明します。
Excel.CurrentWorkbook()で読めるもの
Excel.CurrentWorkbook() は、開いているブックにあるExcelのテーブルと名前付き範囲を一覧にした表を返します。主に使う列は次の2つです。
| 列 | 内容 |
|---|---|
| Name | テーブル名・名前付き範囲の名前 |
| Content | その中身(表) |
シートは一覧に含まれません。読み込みたいセルは、テーブルにするか名前を付けておく必要があります。
まずは一覧を見てみます。
- 「データ」タブ →「データの取得」→「その他のデータ ソースから」→「空のクエリ」
- Power Queryエディターの数式バーに次のように入力する(数式バーが見えない場合は「表示」タブで表示する)
= Excel.CurrentWorkbook()
Name列に、クエリから参照できる名前が並びます。名前の綴りや全角・半角は、この一覧を見て確かめるのが確実です。
設定用のテーブルを作る
切り替えたい値を置くための「設定」シートを作ります。値が複数ある場合は、項目と値の2列のテーブルにしておくと、あとから項目を足しやすくなります。
| 項目 | 値 |
|---|---|
| フォルダパス | C:\Data\売上 |
| 対象月 | 2026/10/1 |
- 上の表を入力し、範囲を選んで Ctrl+T でテーブルにする
- 「テーブル デザイン」タブの「テーブル名」を「設定」に変える
- 対象月は日付として入力する(セルの中で左に寄っている場合は文字列として入力されている)
値が1つだけなら、セルを選んで名前ボックスに名前(例:FolderPath)を入力し、名前付き範囲にする方法でも構いません。
値を取り出すクエリを作る
テーブル「設定」から、フォルダパスを1つの値として取り出します。空のクエリを作り、「ホーム」→「詳細エディター」に次のコードを貼り付けます。
let
設定 = Excel.CurrentWorkbook(){[Name="設定"]}[Content],
パス = 設定{[項目="フォルダパス"]}[値],
結果 = Text.Trim(Text.From(パス))
in
結果
{[Name="設定"]}は、一覧のうちNameが「設定」の行を1行取り出す書き方です[Content]で、その行に入っている表を取り出します設定{[項目="フォルダパス"]}[値]で、項目列が「フォルダパス」の行の、値列の中身を取り出しますText.Trimは、コピーしたときに紛れ込んだ前後の空白を取り除きます
クエリの名前を pFolderPath に変えます。対象月も同じやり方で pTargetMonth というクエリにします。セルの日付は日付時刻の値として渡されることがあるので、Date.From で日付にそろえます。
let
設定 = Excel.CurrentWorkbook(){[Name="設定"]}[Content],
月 = Date.From(設定{[項目="対象月"]}[値])
in
月
名前付き範囲(1セル)から読む場合は、次のように書きます。名前付き範囲には見出しがないため、列名は通常Column1になります。違う名前になっている場合は、プレビューで実際の列名を確かめてください。
= Excel.CurrentWorkbook(){[Name="FolderPath"]}[Content]{0}[Column1]
これらのクエリはシートに表として出す必要がありません。「ホーム」→「閉じて次に読み込む」で「接続の作成のみ」を選んでおきます。
本体のクエリで値を参照する
既存のクエリでパスを直接書いている部分を、作ったクエリの名前に置き換えます。
変更前:
ソース = Folder.Files("C:\Data\売上"),
変更後:
ソース = Folder.Files(pFolderPath),
ファイル名に「202610」のような年月が入っていて、それで絞り込む場合の例です。
年月 = Date.ToText(pTargetMonth, "yyyyMM"),
対象 = Table.SelectRows(ソース, each Text.Contains([Name], 年月)),
明細の日付列で絞り込む場合の例です([日付] 列のデータ型が日付になっている前提です)。
対象月の行 = Table.SelectRows(前のステップ, each Date.Year([日付]) = Date.Year(pTargetMonth) and Date.Month([日付]) = Date.Month(pTargetMonth)),
使うときは、設定シートの値を書き換えてから「データ」→「すべて更新」を押します。値を変えただけでは結果は変わらず、更新した時点で反映されます。
「名前が見つからない」エラーになるとき
指定した名前や項目が見つからないと、Expression.Error: The key didn't match any rows in the table. というエラーになります(日本語の画面では、テーブルのどの行ともキーが一致しないという意味のメッセージになります)。次の順に確認します。
= Excel.CurrentWorkbook()だけを書いたクエリでName列を見て、指定した名前が実際にあるか- テーブル名が変わっていないか(「テーブル デザイン」タブで確認)。シート名ではなくテーブル名を書いているか
- 全角・半角、前後の空白、大文字・小文字が一致しているか(M言語の文字列の比較は大文字と小文字を区別します)
- 設定テーブルの項目列の表記が、コードに書いた項目名と一致しているか
- 名前付き範囲が一覧に出てこない場合は、「数式」タブ →「名前の管理」で、その名前の範囲(スコープ)と参照先を確認する
項目列に同じ名前が2行あると、1行に決められないため The key matched more than one row in the table. というエラーになります。項目名は重複しないようにしてください。
Formula.Firewallエラーが出るとき
セルから読んだ値をフォルダパスのようなデータソースの指定に使うと、Formula.Firewallのエラーが出ることがあります。よく見かけるのは次の2つです。
| 種類 | メッセージの例(英語表示) | 内容 |
|---|---|---|
| 再構築を求めるもの | Query '…' (step '…') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination. | ほかのクエリを参照するステップと、データソースにアクセスするステップの組み合わせ方が問題になっている |
| プライバシーレベルに関するもの | Query '…' is accessing data sources that have privacy levels which cannot be used together. Please rebuild this data combination. | 組み合わせているデータソースのプライバシーレベルが一緒に使えない設定になっている |
Power Queryは、別々のデータソースのデータを組み合わせるときに、データが意図しない先へ送られないようチェックしています。ブック内のセル(現在のブック)とフォルダ内のファイルは別々のデータソースなので、組み合わせ方によってはここで止められます。
確認の順番:
- どちらのエラーかを確かめる。メッセージの文言で見分けます。
- プライバシーレベルを確かめる。「データ」→「データの取得」→「データ ソース設定」を開き、一覧に出ているデータソース(現在のブック、対象のフォルダなど)を選んで「アクセス許可の編集」からプライバシーレベルを見ます。未設定のものや違うレベルのものがあり、どちらも社内で同じ扱いのデータであれば、同じレベル(例:組織)にそろえます。
- クエリの構成を見直す。再構築を求めるエラーの場合は、参照の仕方が原因になっています。値を取り出す処理を別のクエリに分けている場合は本体のクエリに直接書く、逆に直接書いている場合は別のクエリに分ける、といった変更で解消することがあります。構成によって結果が変わるので、変更したら必ず更新して確かめてください。
- 最後の手段としてプライバシーレベルのチェックを無視する。「データ」→「データの取得」→「クエリのオプション」→「現在のブック」→「プライバシー」で、プライバシーレベルを無視する設定を選べます。ただしこれは、データの組み合わせに対するチェックを止める設定です。扱うデータがすべて社内で同じ扱いだと確かめられる場合に限って使ってください。また、「グローバル」側のプライバシー設定によっては、ほかの人がこのブックを開いたときに動作が変わることがあります。
設定セルを使いやすく置くコツ
- 設定値は1つのシートにまとめ、値の隣にその項目の説明を書いておく
- パスの末尾に「\」を付けるかどうかを決めて統一する(パスとファイル名を
&でつなぐと、区切りが二重になったり抜けたりしやすいため) - 対象月のセルにはデータの入力規則を設定し、日付しか入れられないようにする
- ブックを別のPCで使うときは、そのPCから見えるパスに書き換える
- クエリが出力したテーブルを、同じクエリの中で
Excel.CurrentWorkbook()を使って読み込まない(自分自身を参照することになるため)
パスや対象月をセルに出しておけば、普段の運用ではエディターを開かずに済み、クエリに書いたままの古いパスを使い続けるといった間違いも防ぎやすくなります。
