Excel活用

データの取得を相対パスに変えてみた話【PowerQuery】

パワークエリで盛り上がった酒井のツイート

 
 
もらったExcelファイルでデータ更新してもうまく更新できないよ~!

酒井たかま
酒井たかま
読込元データのファイルパスが更新されないからですね。ですので保管先が更新されるように設定を変えてあげましょう。

これはパワークエリで外部データを読み込む際には固定されたファイルパスを使っているから起きるエラーです。

ですので、今回はファイルの保管場所を変えた場合に読込先も自動的に変わる設定方法を見ていきます、

専用フォルダの作成と読込元データの格納

例えばこんな感じです。

「要約表.xlsx」(読込先)に、「TB.txt」(読込元)を読み込むものとします。

ちなみに、同じフォルダにするには意味があります。

今回の設定は、「エクセルファイルと同じフォルダにあるデータファイルを読み込む」という設定にするために同じフォルダに保管しないといけないのです。

酒井たかま
酒井たかま
エクセルファイルと同じフォルダにあるデータファイルを読み込むのです!

大事なことなので2回言いました。

次の処理に進みます。

保存先のファイルパスを取得する

パワークエリを使って読込元のファイルパスを探しに行くということはできませんので、ここはExcelの関数を使って保存先を取得します。

要約表.xlsxにシートを追加してこんな状態にします。

入れる関数はこれです。

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

関数の詳細はこちらの記事をご覧ください。

ファイルパスを知りたいときに使えるエクセル関数 ついにExcelについて書く時がやってきました。 今回紹介するのは、最近流行のパワークエリを使いこなすうえで、ぜひとも知っておき...

パワークエリではテーブルを読み込むので、いったんテーブル設定します。

そして、パワークエリではテーブル名で取り込むので、テーブル名を控えておきます。

今回の場合だと「テーブル5」というのがテーブル名です。

ではいよいよパワークエリでファイルパスを取り込む処理をしていきましょう。

ファイルパスの設定

TB.txtを読み込んだクエリで設定していきます。

データタブの「クエリの表示」から右のクエリ(今回だと「TB(2)」)をダブルクリック。

そして詳細エディターから直接編集します。

開くとこんな感じです。

 let
     ソース = Csv.Document(File.Contents( "C:\00Excel\TB.txt"),[Delimiter=" ", Columns=5, Encoding=932, QuoteStyle=QuoteStyle.None]),
     昇格されたヘッダー数 = Table.PromoteHeaders(ソース, [PromoteAllScalars=true]),
     変更された型 = Table.TransformColumnTypes(昇格されたヘッダー数,{{"科目", type text}, {"前残高", Int64.Type}, {"借方", Int64.Type}, {"貸方", Int64.Type}, {"残高", Int64.Type}})
 in
     変更された型 

やることは二つです。

letの直下に一文追加することと、ソースのファイルパスを変更することです。

まず、letの直下に追加する一文はこうです。

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

※テーブル名はファイルパスのテーブル名を使うので、今回の場合だと「テーブル5」です。

次にソースのファイルパスを変更します。

変更前: ”C:\00Excel\TB.txt”
変更後: filepath & “TB.txt”

変更後の詳細エディターはこうなるはずです。

let
filepath = Excel.CurrentWorkbook(){[Name=”テーブル5″]}[Content]{0}[列1],
ソース = Csv.Document(File.Contents( filepath &”TB.txt”),[Delimiter=” “, Columns=5, Encoding=932, QuoteStyle=QuoteStyle.None]),
昇格されたヘッダー数 = Table.PromoteHeaders(ソース, [PromoteAllScalars=true]),
変更された型 = Table.TransformColumnTypes(昇格されたヘッダー数,{{“科目”, type text}, {“前残高”, Int64.Type}, {“借方”, Int64.Type}, {“貸方”, Int64.Type}, {“残高”, Int64.Type}})
in 変更された型

変更した場所はlet直下の一文と「ソース」のファイルパスです。

意味合いとしては、「FilePath」を最初に設定した「テーブル5」と定義し、データソースに「FilePath」を指定する、といった感じです。

これで設定は完了で、保存して終了してください。

次から保存場所を変えてもデータ更新ボタンをぽちっとするだけでデータの更新ができるようになります。

この方法の注意点

注意点は2つあります。

(1) 読込先と読込元のファイルは同じフォルダに保存すこと。

(2)読込元のファイル名は同じものを使うこと。

(1)はファイルパスを参照しているのはあくまでも読込先であるExcelファイルのパスだからです。ですので読込元データとパスが変わると読み込む処理ができません。

(2)も同じような理由からですが、パワークエリで読み込む際に参照しているファイル名は固定されているからです。ここもファイル名が変わると読めません。

最後に

パワークエリはデータの取得・返還を繰り返す際に力を発揮するのですが、保存場所を変えるだけで外部データとの連携が切れてしまうのが弱点だと思います。

ただ、今回の相対パス的な設定をすることでその弱点は十分克服できますので、この方法を活用することでパワークエリを使ったファイル共有が進み、それが業務効率化につながればいいなと思います。

ちなみにパワークエリの詳細とその活用術については、この本に詳しく書いてありますのでこちらをぜひ一度読んでみてください。