エクセルVBAのコード記述で、相対パスの記述方法について説明します。
カレントディレクトリをChDirステートメントでコントロールできれば難なく攻略することが出来ます。
こんにちは、じゅんぱ店長(@junpa33)です。
エクセルブックを、VBAコードから開くためには、必ずそのブックの「有る位置(存在場所)」を指定しなければいけません。その「有る位置(存在場所)」がファイルパスです。
そのファイルパスを位置指定する方法として、「絶対パス」と「相対パス」があります。
この記事では、考え方が面倒な「相対パス」でのファイル指定方法について説明を行います。
- ブックの知識
- ブックの操作
- ワークブックを開くOpenメソッドの書き方 Excelマクロ
- VBA ブック名の取得法4つの解決策を詳しく解説
- VBA 開く,保存,閉じる,作成,削除 ブックの存在確認後のコード記述
- ファイルの保存に年月日+時刻を付けて管理する
- VBA 保存先フォルダをダイアログ指定で変数化
- 新規ブック5つの保存法。AddとSaveAsの使い方がわかる
- セル値を使いブック名として保存。統一フォームに有用
- VBA シートをブックから切り出し名付け保存する
- ブック名に作成者名を付加。 プロパティ変更とファイル保存
- 不要フォルダを削除する2種類のコードの作成
- 要らないファイルを自動削除するコードの作成
- ワークブックを閉じる12のパターン使い分け VBA最速理解
- ピンポイントでファイルを完全に削除するマクロ(コピペ可)
コンテンツ
ファイル位置を指定するパスのおさらい
ルートドライブから始まる指定するエクセルファイルまでのパスです。
ほとんどの場合は、非常に長尺な記述となり、コード記述が面倒です。なので、
ファイルエクスプローラーから絶対パスをコピー取得する方法が一番簡単になります。例えば、
アドレスバーにカーソルを当ててマウスの右クリックでサブメニューからコピーを選択します。
例えば、このフォルダにあるエクセルファイルBook2.xlsxを開くVBAはこのように指定できます。
Sub ブックの指定1()
Workbooks.Open Filename:= _
"C:\Users\〇〇〇\Documents\△△△\◇◇◇\xxx\VBAブックの指定" & "\" & "Book2.xlsx"
End Sub
絶対パスの全階層をそれぞれ変数化して表示させる便利マクロはこちらにあります。参考にしてください。
上の例題の続きで説明します。
VBAコードの「ブックの指定1」が記述されているエクセルブック(マクロ実行元)があるフォルダまでのパスは、
C:\Users\〇〇〇\Documents\△△△\◇◇◇\xxx\VBAブックの指定 で記述できますが、
この部分は、ThisWorkbook.Path と言い換えることも出来ます。
すなわち、以下の様に記述することが出来ます。この記述方法が ” 相対パスによる指定方法 ” になります。
Sub ブックの指定2()
Workbooks.Open Filename:= _
ThisWorkbook.Path & "\" & "Book2.xlsx"
End Sub
ThisWorkbook.Pathが表す内容をメッセージボックスで確認すると、間違いなく同じ絶対パスが表示されています。
Sub ブックの指定3()
MsgBox ThisWorkbook.Path
End Sub
相対パスとは、絶対パスの言い換えコードを使った表現方法ということです。
つまり絶対パスに繋がる基準となるファイルパスからの相対位置で表示する方法となります。
相対パスの使い方を詳しく
相対パスと言えば、よく頭が混乱して ” いま私はどこにいるの? ” 的な状態になってしまうことが多くあるでしょう。
「相対パスの考え方は、基準となる位置を決めて・・・」と、よく言われます。
その基準となる位置が決めれない(ずれてしまう)ので困っているわけですが、その位置の固定方法が分からない方も多いと思います。
- 「相対パスは、カレントディレクトリを基準に記述する。」ので、カレントディレクトリを希望のフォルダに移してから相対パスで記述する。
- VBAマクロを実行している時、そのエクセルブックは存在位置が動かないので、このエクセルブックの位置を基準とする。(ThisWorkbook.Path)
それでは①~⑥のエクセルブックの配置を設定してそれぞれに付き相対パスの記述方法を説明して行きます。(クリックで原寸表示)
相対パスで使われる略字
階層 | 相対パスの略字 |
---|---|
カレントディレクトリ | ./ |
1つ上の階層 | ../ |
2つ上の階層 | ../../ |
下方向の階層についての略字はありません。
① Book1.xlsm の位置表現
この説明の設定では、Book1.xlsm はVBAマクロを動かしている本体のエクセルブックです。
スタートは、このブックを開いてVBAコードを実行することになりますので、このブックを開いた時点で「 ThisWorkbook 」の機能が開始されます。
自分自身の位置を相対パスで表現するとこのようになります。
ThisWorkbook.Path & “¥” & “Book1.xlsm”
② Book2.xlsx の位置表現
Book2.xlsx は、マクロ本体のBook1.xlsmと同じディレクトリにあります。
あまり意識せずに、このようにVBAコードを記述しがちですが、全く違います。いきなりミスをしてしまいます。
『ブックを開く Openメソッド』の復習になりますが、ファイルパスを省略すると、開く対象がカレントフォルダにあるファイルと見なされます。
Sub ブックの相対指定1()
Workbooks.Open "Book2.xlsx"
End Sub
このVBAコードでは、エクセルのデフォルト状態ならば、 ” ドキュメント ” ディレクトリにある「Book2.xlsx」が開かれます。(無い場合はエラーが返されます。)
なので、正解の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」フォルダからの相対位置を記述します。
Sub ブックの相対指定3()
ChDir ThisWorkbook.Path
Workbooks.Open Filename:="../VBAブックの指定B/Book3.xlsx"
End Sub
緑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」フォルダからの相対位置を記述します。
Sub ブックの相対指定4()
ChDir ThisWorkbook.Path
Workbooks.Open Filename:="../../エクセル/エクセルブックの指定A/Book4.xlsx"
End Sub
緑1のThisWorkbook.Pathをカレントディレクトリにしました。(重要です!)
まず緑5へ行くためには、緑2の「VBA」フォルダに進みます。
先ほど同様、一つ上の階層の緑2の「VBA」フォルダは「¥VBA」と記述して良いのですが、相対パスの略字として「../」と表すことが出来ます。
次に経由地の緑3へは「../ドキュメント」とも書けますが、先ほどの様に「../../」と略字記述することで到達することが出来ます。
さらに、折り返しの緑4へ行くには、「../../エクセル」と指定でき、同様に最後の緑5へは「../../エクセル/エクセルブックの指定A」とすることが出来ます。
したがって、Book4.xlsxの相対パスでの位置表現は、
“../../エクセル/エクセルブックの指定A/Book4.xlsx”
とすることができます。
⑤ Book5.xlsx の位置指定
Book5.xlsxについては先ほどのBook4.xlsxよりも一つ階層が下ということなので、先の説明と同様に考えてください。
Sub ブックの相対指定5()
ChDir ThisWorkbook.Path
Workbooks.Open Filename:= _
"../../エクセル/エクセルブックの指定A/エクセルブックの指定B/Book5.xlsx"
End Sub
なので、Book5.xlsxの相対パスでの位置表現は、
“../../エクセル/エクセルブックの指定A/エクセルブックの指定B/Book5.xlsx”
とすることができます。
⑥ Book6.xlsx の位置指定
Book6.xlsxは「ドキュメント」フォルダにあるエクセルブックにあります。
Sub ブックの相対指定6()
ChDir ThisWorkbook.Path
Workbooks.Open Filename:="../../Book6.xlsx"
End Sub
緑1から緑2へは「../」、緑2から緑3へは「../」なので、緑1から緑3へは「../../」と記述することが出来ます。
つまり、Book6.xlsxの相対パスでの位置表現は、
“../../Book6.xlsx”
とすることができます。
フォルダのレイアウトが分からない時
基本的に、それぞれのフォルダの配置が判明している場合は、ルールにしたがって記述すればよいのですが、
フォルダのレイアウトが不明な場合は、少々プランが必要になります。
フォルダダイアログを利用してユーザーにフォルダを選択してもらうことで、そのフォルダまでのパスを入手するなどの対策が必要になります。
まとめ
ファイル位置を指定する表現方法として、絶対パスと相対パスがあります。
絶対パスは、VBAマクロを動かす本体のエクセルブックが、環境の異なるPCなどに移植された場合は、ディレクトリレイアウトの違いから想定通りに動かないことが多くあります。
なので、相対パスを使って必要なファイルの位置指定を行うことになります。
相対パスを使用するには、基準となるフォルダを決める必要があります。
この説明では、VBAマクロを動かす本体のエクセルブックがあるフォルダを基準点としました。
場合によって、「ドキュメント」や「Cドライブ」を基準のフォルダとすることもあると思います。
ファイルを指定するときは、絶対パスを知っているか(移植する使い方のエクセルブックでは難しい。)、または相対パスで、基準となるフォルダをその都度「ChDirステートメント」で指定変更してからコード記述を行いましょう。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。