今回は、PowerQuery(パワークエリ)のデータソースを、絶対パスではなく相対パスで読込む方法を解説します。
データソースの参照先が絶対パス(固定)になっている場合、ソースファイルの場所が移動するたびに設定変更が必要になります。
変更しないとソースを見失い、参照エラーが発生します。(ちなみに、デフォルトでは絶対パス)
相対パスに設定しておくことで、ソースファイルの場所が変更されても相対的に参照先も変更されるので便利です。
- 絶対パス・・・参照先のデータファイルが移動するたびに、参照先のパス更新が必要。更新しないと、参照エラーとなる。
- 相対パス・・・参照先のデータファイルが移動しても、参照先のパス更新不要。参照データのパスが自動的に変更される。
当記事の手順通りに真似してみてください。
今回の記事に関してご不明な点があれば、問合せフォームからご連絡ください。
<動作確認環境>
- Windows 10 Home(バージョン22H2)
- Microsoft Office Professional Plus 2019/Microsoft® Excel® for Microsoft 365
▼この記事を書いたひと
筆者のRYO。MOSマスター資格者。Excel操作テクニックやマクロVBA知識が豊富。本業で日々Excelを使い倒しており、現場に近いExcelの悩み解決が得意。
「絶対参照」「相対参照」の違い
絶対パス・・・参照先のデータファイルが移動するたびに、参照先のパス更新が必要。更新しないと、参照エラーとなる。
相対パス・・・参照先のデータファイルが移動しても、参照先のパス更新不要。参照データのパスが自動的に変更される。
「絶対パス」が参照エラーになる仕組み
データソースを絶対参照しているとエラーになりやすいです。なぜでしょうか?
<よくあるシーン>
パワークエリファイルと、参照データソースは図1のように保存され、
データソースの場所を絶対参照(固定)でデータ取得している。
パワークエリはデータソースの存在を「1月集計の中にXXX.csvというファイルがある」と認識している。
ところが、誰かの手によって、データソースの保存先が変わった
パワークエリは参照先のファイルを見失った。
当初「1月集計フォルダ/XXX.csv」と記憶していたのに、1月集計フォルダの中から無くなったからである。
ここで、参照エラー発生。
このように、絶対参照では保存先を固定で記憶しているため、照先のファイルが移動されると見失ってしまう。
「相対参照」が便利な理由
絶対参照が保存先を固定で記憶するのに対し、相対参照では、パワークエリの保存パスを起点にソースファイルの場所を相対的に特定できます。
運用ルール:Power Queryファイルと、データソースは同じフォルダ内に保存しておく
データソースとなるファイルが、Power Queryを設定しているExcelファイルと同じフォルダ内に保存されている場合に、今回の手法が使えます。(同じフォルダ内であれば下位の階層でもOK)
前提条件として覚えておきましょう。
パワークエリ のソースデータを「相対参照」にする手順
1.関数でカレントパスを抽出
「カレントパス」とは、ファイルが現在保存されている場所のことを指します。
まず、パスの起点となるPower Query自身の保存場所(カレントパス)を取得する必要があります。
カレントパスを取得するには、パワークエリファイルにシートを準備し、CELL関数を用いてファイルパスを取得します。
<手順>
- 「設定」というシートを作成する。
- B2セルに、項目名として「パス」と記載。この項目名も後の設定で使用する。
- B3セルに、次の数式で現在のフォルダ情報を取得する。
=LEFT(CELL("filename",A1),FIND("[",CELL("filename",A1))-1)
イメージは下図の通り。
B2セルに、パワークエリExcelの保存先(カレントパス)が表示されていればOK。
2.範囲をテーブルに変換
次に、先ほど作ったファイルパスの情報を、以下の手順でテーブル化します。
- 「挿入」タブをクリック
- 「テーブル」をクリック
- テーブルに変換する範囲を選択して、「先頭行をテーブルの見出しとして使用する」にチェックを入れて、OKをクリック
下図はテーブル化された状態。
3.テーブル名の変更
次に、テーブルに名前を付けます。
- 「テーブルデザイン」タブをクリックし
- テーブル名を任意の名前に変更
今回は、「設定テーブル」という名前にした。(なんでもいいです)
4.Power Queryの編集画面で、ソースの参照先を変更
Power Query エディターを起動し、「詳細エディタ」からコードを確認します。(パワークエリで使用する言語をM言語といいます)
「let」と「ソース」の間の行に、以下のソースを記入します。(テーブル名と項目名はご自身の設定した内容に変更してください。)
filepath = Excel.CurrentWorkbook(){[Name="テーブル名"]}[Content]{0}[項目名],
また、2行目のソース部分は以下に変更します。(ファイル名はソースデータのファイル名にしてください。)
ソース = Csv.Document(File.Contents(filepath & "ファイル名")
今回の事例に置き換えると、とこうなります↓
filepath = Excel.CurrentWorkbook(){[Name="設定テーブル"]}[Content]{0}[パス],
ソース = Csv.Document(File.Contents(filepath & "商品マスタ.csv")
<変更前>
<変更後>
正しく修正できれば、次のようにエラーが発生せず、次のステップに移動し、データソースの動的な設定が完了。
(応用)データソースファイルの参照先が下層フォルダにある場合
下図のように、パワークエリファイルよりもデータソースが下層フォルダに保存されている場合は、ファイル名の前に \(バックスラッシュ)とフォルダ名を追加すればOKです。
filepath = Excel.CurrentWorkbook(){[Name="設定テーブル"]}[Content]{0}[パス],
ソース = Csv.Document(File.Contents(filepath & "\フォルダC\商品マスタ.csv"
エラーになる場合の原因と解決方法
もしも、コード編集後にエラーになったら、以下の原因が考えられます。
「Expression.Error: '〇〇' という名前の Excel テーブルが見つかりませんでした。」
「Expression.SyntaxError: トークン Eof が必要です。」
解決方法)構文が誤っているので、誤字等を確認。
「DataSource.Error: ファイル 'C:\Users\aaa\bbb\〇〇〇.xlsx' が見つかりませんでした。」
解決方法)パスの場所にファイルがないので、その場所に該当のファイルが存在するかを確認する。
使用上の注意
今回の方法で相対参照にする際、以下の2点は守ってください。
- パワークエリファイル(読込先)とデータソースファイル(読込元)のファイルは同じフォルダに保存すること(下の階層でも可)。
- データソースファイル(読込元)のファイル名は設定時と同じものを使うこと。
パワークエリファイル(読込先)とデータソースファイル(読込元)のファイルは同じフォルダ内であれば下層フォルダでも、大丈夫です。(パワークエリファイルのパスを起点にソースファイルの場所を相対的に参照できます)
逆に言えば、
パワークエリファイル(読込先)とデータソースファイル(読込元)のファイルが別のフォルダに保存されてしまうと、機能しません。
それと、データソースのファイル名を変更した時も、コードに入力したファイル名と相違してしまいエラーになるでしょう。
今回は以上です。