ブックを指定する絶対パスと相対パス記述のコツ

vbabookspecifyeye

エクセルVBAのコード記述で、相対パスの記述方法について説明します。
カレントディレクトリをChDirステートメントでコントロールできれば難なく攻略することが出来ます。

こんにちは、じゅんぱ店長(@junpa33)です。

エクセルブックを、VBAコードから開くためには、必ずそのブックの「有る位置(存在場所)」を指定しなければいけません。その「有る位置(存在場所)」がファイルパスです。

そのファイルパスを位置指定する方法として、「絶対パス」と「相対パス」があります。

この記事では、考え方が面倒な「相対パス」でのファイル指定方法について説明を行います。

ファイル位置を指定するパスのおさらい

vbabookspecifyp008

絶対パスとは

ルートドライブから始まる指定するエクセルファイルまでのパスです。

ほとんどの場合は、非常に長尺な記述となり、コード記述が面倒です。なので、

ファイルエクスプローラーから絶対パスをコピー取得する方法が一番簡単になります。例えば、

vbabookspecifyp001

アドレスバーにカーソルを当ててマウスの右クリックでサブメニューからコピーを選択します。

矢印下001
vbabookspecifyp002

例えば、このフォルダにあるエクセルファイルBook2.xlsxを開くVBAはこのように指定できます。

VBA
Sub ブックの指定1()
Workbooks.Open Filename:= _
"C:\Users\〇〇〇\Documents\△△△\◇◇◇\xxx\VBAブックの指定" & "\" & "Book2.xlsx"
End Sub

絶対パスの全階層をそれぞれ変数化して表示させる便利マクロはこちらにあります。参考にしてください。

相対パスとは

上の例題の続きで説明します。

VBAコードの「ブックの指定1」が記述されているエクセルブック(マクロ実行元)があるフォルダまでのパスは、

C:\Users\〇〇〇\Documents\△△△\◇◇◇\xxx\VBAブックの指定 で記述できますが、

この部分は、ThisWorkbook.Path と言い換えることも出来ます。

すなわち、以下の様に記述することが出来ます。この記述方法が ” 相対パスによる指定方法 ” になります。

VBA
Sub ブックの指定2()
Workbooks.Open Filename:= _
ThisWorkbook.Path & "\" & "Book2.xlsx"
End Sub

ThisWorkbook.Pathが表す内容をメッセージボックスで確認すると、間違いなく同じ絶対パスが表示されています。

VBA
Sub ブックの指定3()
MsgBox ThisWorkbook.Path
End Sub
vbabookspecifyp003

相対パスとは、絶対パスの言い換えコードを使った表現方法ということです。

つまり絶対パスに繋がる基準となるファイルパスからの相対位置で表示する方法となります。

相対パスの使い方を詳しく

vbabookspecifyp009

相対パスと言えば、よく頭が混乱して ” いま私はどこにいるの? ” 的な状態になってしまうことが多くあるでしょう。

「相対パスの考え方は、基準となる位置を決めて・・・」と、よく言われます。

その基準となる位置が決めれない(ずれてしまう)ので困っているわけですが、その位置の固定方法が分からない方も多いと思います。

相対パス 基本の攻略法
  •  「相対パスは、カレントディレクトリを基準に記述する。」ので、カレントディレクトリを希望のフォルダに移してから相対パスで記述する。
  •  VBAマクロを実行している時、そのエクセルブックは存在位置が動かないので、このエクセルブックの位置を基準とする。(ThisWorkbook.Path)

それでは①~⑥のエクセルブックの配置を設定してそれぞれに付き相対パスの記述方法を説明して行きます。(クリックで原寸表示)

image
エクセルブックの配置

相対パスで使われる略字

階層相対パスの略字
カレントディレクトリ./
1つ上の階層../
2つ上の階層../../

下方向の階層についての略字はありません。

① Book1.xlsm の位置表現

この説明の設定では、Book1.xlsm はVBAマクロを動かしている本体のエクセルブックです。

スタートは、このブックを開いてVBAコードを実行することになりますので、このブックを開いた時点で「 ThisWorkbook 」の機能が開始されます。

自分自身の位置を相対パスで表現するとこのようになります。

ThisWorkbook.Path & “¥” & “Book1.xlsm”

② Book2.xlsx の位置表現

Book2.xlsx は、マクロ本体のBook1.xlsmと同じディレクトリにあります。

あまり意識せずに、このようにVBAコードを記述しがちですが、全く違います。いきなりミスをしてしまいます。

ブックを開く Openメソッド』の復習になりますが、ファイルパスを省略すると、開く対象がカレントフォルダにあるファイルと見なされます。

間違いVBA
Sub ブックの相対指定1()
        Workbooks.Open "Book2.xlsx"
End Sub

このVBAコードでは、エクセルのデフォルト状態ならば、 ” ドキュメント ” ディレクトリにある「Book2.xlsx」が開かれます。(無い場合はエラーが返されます。)

なので、正解のVBAコードはこちらになります。

正しいVBA
Sub ブックの相対指定2()
        Workbooks.Open Filename:= _
        ThisWorkbook.Path & "\" & "Book2.xlsx"
End Sub

相対パスでの位置表現は、

ThisWorkbook.Path & “¥” & “Book2.xlsx” 

となります。

③ Book3.xlsx の位置表現

Book1.xlsm が入っているフォルダとは同じ階層にある「VBAブックの指定B」フォルダに、Book3.xlsx ファイルがあります。

このBook3.xlsx ブックの相対パスは、マクロ実行ブック(Book1.xlsm)から見た時のVBAコードは・・・

まず最初に、ChDirステートメントでカレントディレクトリを強制移動させてしまいます。(カレントディレクトリを、ThisWorkbookの有るフォルダに移動させる)

その上で、マクロ実行ブック(Book1.xlsm)のある「VBAブックの指定A」フォルダからの相対位置を記述します。

VBA
Sub ブックの相対指定3()
        ChDir ThisWorkbook.Path
        Workbooks.Open Filename:="../VBAブックの指定B/Book3.xlsx"
End Sub
vbabookspecifyp005H

緑1のThisWorkbook.Pathをカレントディレクトリにしました。(重要です!)

緑3へ行くためには、緑2の「VBA」フォルダを経由します。

一つ上の階層の緑2の「VBA」フォルダは「¥VBA」と記述して良いのですが、相対パスの略字として「../」と表すことが出来ます。

なので緑3へは「../VBAブックの指定B」と記述することで到達することが出来ます。

緑3へ行けば後は、Book3.xlsxを指定するだけです。

したがって、Book3.xlsxの相対パスでの位置表現は、

“../ VBAブックの指定B¥Book3.xlsx”

となります。

④ Book4.xlsxの 位置指定

Book4.xlsxは、マクロ実行ブックBook1.xlsmとは同じ階層にはありますが、高い階層で分岐したフォルダの流れの中にあります。

まずはカレントディレクトリをChDirステートメントでThisWorkbookにセットします。

その上で、マクロ実行ブック(Book1.xlsm)のある「VBAブックの指定A」フォルダからの相対位置を記述します。

VBA
Sub ブックの相対指定4()
        ChDir ThisWorkbook.Path
        Workbooks.Open Filename:="../../エクセル/エクセルブックの指定A/Book4.xlsx"
End Sub
vbabookspecifyp006H

緑1のThisWorkbook.Pathをカレントディレクトリにしました。(重要です!)

まず緑5へ行くためには、緑2の「VBA」フォルダに進みます。

先ほど同様、一つ上の階層の緑2の「VBA」フォルダは「¥VBA」と記述して良いのですが、相対パスの略字として「../」と表すことが出来ます。

次に経由地の緑3へは「../ドキュメント」とも書けますが、先ほどの様に「../../」と略字記述することで到達することが出来ます。

さらに、折り返しの緑4へ行くには、「../../エクセル」と指定でき、同様に最後の緑5へは「../../エクセル/エクセルブックの指定A」とすることが出来ます。

したがって、Book4.xlsxの相対パスでの位置表現は、

“../../エクセル/エクセルブックの指定A/Book4.xlsx” 

とすることができます。

⑤ Book5.xlsx の位置指定

Book5.xlsxについては先ほどのBook4.xlsxよりも一つ階層が下ということなので、先の説明と同様に考えてください。

VBA
Sub ブックの相対指定5()
        ChDir ThisWorkbook.Path
        Workbooks.Open Filename:= _
        "../../エクセル/エクセルブックの指定A/エクセルブックの指定B/Book5.xlsx"
End Sub

なので、Book5.xlsxの相対パスでの位置表現は、

“../../エクセル/エクセルブックの指定A/エクセルブックの指定B/Book5.xlsx” 

とすることができます。

⑥ Book6.xlsx の位置指定

Book6.xlsxは「ドキュメント」フォルダにあるエクセルブックにあります。

VBA
Sub ブックの相対指定6()
        ChDir ThisWorkbook.Path
        Workbooks.Open Filename:="../../Book6.xlsx"
End Sub
vbabookspecifyp007H

緑1から緑2へは「../」、緑2から緑3へは「../」なので、緑1から緑3へは「../../」と記述することが出来ます。

つまり、Book6.xlsxの相対パスでの位置表現は、

“../../Book6.xlsx” 

とすることができます。

フォルダのレイアウトが分からない時

基本的に、それぞれのフォルダの配置が判明している場合は、ルールにしたがって記述すればよいのですが、

フォルダのレイアウトが不明な場合は、少々プランが必要になります。

フォルダダイアログを利用してユーザーにフォルダを選択してもらうことで、そのフォルダまでのパスを入手するなどの対策が必要になります。

まとめ

vbabookspecifyp010

ファイル位置を指定する表現方法として、絶対パスと相対パスがあります。

絶対パスは、VBAマクロを動かす本体のエクセルブックが、環境の異なるPCなどに移植された場合は、ディレクトリレイアウトの違いから想定通りに動かないことが多くあります。

なので、相対パスを使って必要なファイルの位置指定を行うことになります。

相対パスを使用するには、基準となるフォルダを決める必要があります。

この説明では、VBAマクロを動かす本体のエクセルブックがあるフォルダを基準点としました。

場合によって、「ドキュメント」や「Cドライブ」を基準のフォルダとすることもあると思います。

ファイルを指定するときは、絶対パスを知っているか(移植する使い方のエクセルブックでは難しい。)、または相対パスで、基準となるフォルダをその都度「ChDirステートメント」で指定変更してからコード記述を行いましょう。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。