Excel活用

パワークエリでのフォルダ取得を相対パスで便利にする方法

前回は複数のファイル取得にはフォルダ取得がオススメと書きました。

しかしこのままではフォルダのパスを変えることができず、保存場所を変えるだけでエラーになってしまいます。

そこで今回は、フォルダ取得も相対パス化してしまおうという話を書いてみることにしました。

none
none
ん?今までと同じように相対パスにすればいいだけじゃにゃいの? 

酒井たかま
酒井たかま
それが違うんです。そのあたりも含めて解説していきますね。今日のポイントはこれです(どどん!)

  • 相対パス化の方法(おさらい)。
  • フォルダ取得するときの相対パス化は今までとどこが違うのか。

相対パス化の方法(おさらい)

まずは相対パス化のおさらいからです。

  1. ファイルパス取得関数を使ってファイルパスを取得する。
  2. ファイルパス入力セルをテーブル化する。
  3. パワークエリの詳細エディタでデータソースに上記のテーブルをリンクする。(パスを2のテーブルデータと定義して、ソースに代入)

ちなみにこの時のファイル取得関数と詳細エディタに書くパスの定義構文はこの記事の最後に貼っておきますね。

では、フォルダ取得するときの相対パス化はどうすればいいのか見ていきましょう。

フォルダ取得するときの相対パス

基本的な流れは上に書いた流れと同じです。

ここでは今までの相対パス化との違いにフォーカスして書いていきます。

フォルダパスの取得

このエクセルデータのファイルパスを取得するのは同じです。

特筆すべきは「このエクセルのファイルパス+フォルダ名」となっていることです。

そしてテーブル化するのは今までと同じですね。この時にテーブル名を確認しておきましょう。

パワークエリの詳細エディタ編集

ところで、今までデータファイルを取得したのと違い、フォルダ取得した場合クエリが複数あることに気が付きましたか?

その理由を説明するのは後回しにして、やるべきことを書いておきます。

詳細エディタを書き換えるのは、内容も含めて今までと同じなのですが、書き換える場所が2か所あることに注意してください。

それが上の図の赤枠です。「サンプルファイル」と「売上データ」の2か所です。

それぞれ見てみましょう。

サンプルファイル:修正前と修正後

修正前
修正後

次に売上データの方です。

修正前
修正後

このように、詳細エディタで書き換える内容は同じですが、2か所あることが従来の方法との一番の違いです。

以上でフォルダ取得の際のフォルダパスを相対パス化する作業は完了です。

パワークエリでフォルダ取得する仕組み

ちなみにフォルダ取得する際にパワークエリ上でどのように動いているのか、イメージはこうです。

フォルダ内のデータからテーブル様式を作成し(➀ これがサンプルファイルになる)、これに各ファイルのデータをくっつけていってるのです。

なので、テーブルフォーマットとしてのサンプルファイル、個々のデータである売上データクエリの2か所にデータソースの格納されているフォルダパスが必要になるのです。

データ移動・受け渡しのときの注意点

データの保存場所変更、受け渡しによってフォルダパスが変わるときは気をつけてという話です。

データフォルダのパスは基本的にエクセルファイルのパスを参照しているので、パワークエリを組んだエクセルファイルと読込対象のデータフォルダは同じ階層に保存しなくてはなりません。

そして、同じ場所に保管するとしてもエクセルと読込対象が別々の階層に保存されてもエラーになるので、エクセルとデータフォルダをまとめてフォルダに格納してしまえばいいのです。

そうすれば、このフォルダごと移動・受け渡ししてもエクセルとデータフォルダは同階層に保存され、エラーを防ぐことができるというわけです。

まとめ

いかがだったでしょうか。一度ここで今回のポイントを見直しておきましょう。

  • 相対パス化の方法(おさらい)。
  • フォルダ取得するときの相対パス化は今までとどこが違うのか。

今までやってきた相対パス化と同じだけど、フォルダ取得となると2か所書き換えないといけない。

これが分かれば簡単に使いこなせるようになるでしょう。

最後に、相対パスにするときに必要な「ファイルパス取得関数」「パワークエリの詳細エディターに記載する相対パス化のいち文」を貼っておきますのでご自由に使ってください。


【ファイルパスの取得関数】

=LEFT(CELL("filename",$A$1),FIND("[",CELL("filename",$A$2))-1)

【詳細エディターの記載】

fPath = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content]{0}[列1],



今回も最後までお付き合いいただき、ありがとうございました!