#Power Queryについて
Power Query(取得と選択)はExcel2016から本格導入された便利な仕組みです。
UIから従来はVBAでやっていたような複数ブックの集計や加工などを簡単に行えます。
#Power Queryの弱点
以下のようなフォルダ構成からPower Queryでファイルを取得したとします。
⇒
さて、このフォルダ名が例えば各事業所からの月報だったとしましょう。
そうすると、このフォルダ名にはおそらく「202005」のような日付が入っていることでしょう。その方が後から確認しやすいですからね。
ではこのフォルダ名を変えるとどうなるでしょうか。
大方想像がつくと思いますが、以下のようにエラーになります。
Power QueryのデフォルトのUIによる設計では、フォルダ構成が固定されます(まぁ当たり前といえば当たり前ですが)。
したがって、部内で共有したりとかちょっとお引越ししたりとかそうしたことに対応ができません。これは結構困りますね。
今日はこれを解決してみましょう。
#案1 泥臭く修正する
そもそもフォルダ構成はどこに記述されているのでしょうか。
数式バーを見て探してみます(数式バーが出ていないときは「表示」タブの「レイアウト」の「数式バー」にチェックを入れます)。
ステップの一番上「Source(ソース)」を確認するとありました。
ここにフォルダ名が記載されているようです。これを修正すればたぶん治りそうですね。
が、これをいちいちやるのは大変。
そして、これを引き継ぐのも大変です(Power Queryもまだまだ知られざる機能の位置づけですから、忌避感が強そう)。
なんとかセルで管理できないものか
#案2 セルの値を参照する
というわけでシートに保存場所を入力しておき、それを引っ張ってくる方法を検討しましょう。
##ファイル保存場所の入力先を作る
ひとまずファイルの保存場所をベタ打ちしてみます。
セルの値はそれだけではPower Queryでは参照できません。
そこでCtrl + tで範囲をテーブルにします(ほんとは範囲から直接クエリも作れますが、後で名前を付けるのもややこしいのでこうしています)。
余談ですが、このテーブルという機能はとても便利なので、これからExcelでデータを扱う場合はなるべくテーブルを利用しましょう。
※チェックは入れておきます。
テーブルになりました。わかりやすい名前を付けておくのがよいです(アルファベットで始めると数式で入力補助が働くのでおすすめです)。
##テーブルからクエリを作り、Power Queryで参照する
テーブルからクエリを作成します。
今作った表がクエリになりました。右クリックして「ドリルダウン」を選択しましょう。
フォルダ名だけが取り出せました。以降はこのクエリ名(赤四角)でこの値を参照できます。
先ほどのところへ戻り、フォルダパスを変更してみます。これでできるはず。
##ところが…
実は、この操作デフォルトのままではエラーになります。
Power Queryではセキュリティ対策のため、デフォルトの設定ではクエリのソースに別のクエリを指定できないよう保護がかけられています。
今回、このクエリのソースに別のクエリ(T_FolderPath)を指定しているため、エラーが出ます。
これを解消するにはこの設定を無視するよう変える必要があります。
##セキュリティレベルを下げる
セキュリティレベルを下げる操作です。自己責任でご対応ください
「ファイル」の「オプションと設定」から「クエリのオプション」を選択して、「プライバシー」から「プライバシーレベル」を「常にプライバシーレベル設定を無視します」に変えます。
これでデータが読み込めます(プレビューを更新してください)
##ところがところが…
閉じて読み込むとエラーが出ます(なぜか急に英語になりました)。
エラー内容を見ると最初のエラーが解消していないようです。
##探してみる
エラーを遡ってどこまでうまくいくか確認してみましょう(いわゆるデバッグ)。
ここより上は大丈夫なようです。
さてエラーをよく見ると「サンプルファイル」でエラーが発生しているようです。
サンプルファイルの方を見てみます。いました。ここも修正します。
これで解消されます。
#案3 セキュリティにも配慮しよう
案2でやりたいことはできました。しかしセキュリティ対策を無視しているあたりがちょっと気になります。
ここをもう少し掘り下げてみましょう。
そもそもこのエラーが出る理由は、「セキュリティ対策のため、デフォルトの設定ではクエリのソースに別のクエリを指定できない」からでした。
逆に言えばクエリのソースが別のクエリでなければよいわけです。
そこでこのクエリを発行する式自体をソースとしてしまえば、セキュリティレベルを変更しなくともテーブルの値を参照することができます。
##セルの値の参照
ドリルダウンした結果をもう一度眺めてみます。
この数式の意味は、ひとつ前のステップ(#"Changed Type")の1行目({0})のファイル保存場所という名前の列([ファイル保存場所])の値というのを表しています。
ためしに行と列の値({0}[ファイル保存場所])をこのクエリのソースにくっつけてみます。
ファイルの保存場所が表示されました(以降のステップはエラーになります)。
あとはこの式(Excel.CurrenWorkbook(){[Name="T_FolderPath"]}[Content]{0}[ファイル保存場所])をソースとして使用すればクエリのソースを別のクエリとしているわけではないということになり、セキュリティレベルを変更しなくてもよくなります(T_FolderPathはエラーになり、不要なので、削除しても大丈夫です)。
#まとめ
- フォルダを保存するセルを作りテーブルとする
- Excel.CurrenWorkbook(){[Name="テーブルの名前"]}[Content]{0}[列の名前] をソースとする
- サンプルファイルがあればそこも修正が必要
以上です。
#余談
Excel.CurrenWorkbook(){[Name="テーブルの名前"]}[Content]{0}[列の名前]でテーブルの値を参照できます。
{0}は1行目という意味なので、{1},{2}...としていけば2行目、3行目...と参照できます。
入力するフォルダを複数持ったりパラメータを複数持ちったりするならここで管理することができます。
同様に列を増やしても[列の名前]を変えることで対応が可能です。
Power Queryはまだまだ黎明の技術のように思います。こんなことがしたいということがあればコメントください。研究します。