みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでのThisWorkbook.Pathはかなり使用頻度が高いと思うのですが、変更したいとき、けっこう面倒なんですよね。
プロジェクトの全てのコードから該当の「ThisWorkbook.Path & “\” & ファイル名」を探し出してフルパスに書き換えて…ってちょっと危なっかしい作業になります。
そんな時には、エクセルファイルを開いたときにそのファイルのファイル名フルパスを定数(的な変数)に放り込めれば便利です。
ということで、今回はエクセルVBAでThisWorkbook.Pathを使ったファイル名フルパスを定数っぽく使えるようにする方法です。
では行ってみましょう!
ThisWorkbook.Pathを使ったフルパスの指定で困ること
エクセルVBAでお仕事用のツールやシステムを作っていると、プログラムを記述しているエクセルファイルだけでなく、他のファイルも含めて複数のファイルを同じフォルダに詰め込んで、一つのシステムを構成したいときがあります。
例えば、Accessデータベースファイルと読み書きする場合とか
他のExcelファイルやPowerPointファイルをひな形的に活用する場合とか
マクロを記録してるファイル以外のファイルを使いたいときは多いものです。
その場合、プログラムを記述しているエクセルファイルと同じ階層にファイルがありますからThisWorkbook.Pathを使うことで、他の構成ファイルを開いたり操作したりできますよね。
と書くのですが、あちこちのプロシージャに何回もそうやって書いておくと、後で
- 「やっぱり固定パスにしよう」
- 「ファイル名変えよう」
など、変更になったときに全部を書き換えなければなりません。
作業としては、プロジェクトの全てのコードから該当の「ThisWorkbook.Path & “\” & ファイル名」を探し出して、フルパスに書き換える作業になりますが
- どこか一か所を変更し忘れる
- どこか一か所をスペルミスする
などの可能性があります。
VBEの機能では一斉置換などもありますが、ちょっぴりおっかないので、できればこの手で変更したいですしね。
ThisWorkbook.Pathは定数に代入できない
それが嫌だからといって、プロシージャ外に
Public Const FILE_PATH As String = ThisWorkbook.Path
などと書いても
「コンパイルエラー:定数式が必要です。」というエラーが出て怒られてしまいます。
それはそうです、定数ですから「”hoge”」とか「123」といった固定の値でなければなりません。これはプロシージャ内でやってもConstである限り同じこと。
Auto_OpenイベントでPublic変数にフルパスを格納する
そんな時に使えるアイデアがこちら。
Auto_OpenイベントでPublic変数にThisWorkbook.Pathをいつも格納してしまう
というアイデアです。
つまり
- マクロを書いたエクセルファイルを開くとAuto_Openイベントが走る
- Auto_Openイベントプロシージャ内でPublic変数にThisWorkbook.Path(またはそれを使ったファイル名フルパス)を代入
という段取りが、ファイルを開くたびに自動で動くようにするのです。
実際にはこう書いておけばOKです。
Option Explicit
Public FILE_PATH As String
Sub Auto_Open()
FILE_PATH = ThisWorkbook.Path & "\sample.txt"
End Sub
ちなみに、Auto_Openは標準モジュールに書いておいてくださいね。Auto_Openは標準モジュールに書く必要がありますので。
標準モジュールの一番上に、Public変数の宣言とAuto_Openをセットで並べて記述しておくのがミソです。
フルパスを変更したいときも簡単
こうしておけば、うっかり該当のファイルを固定パスで指定したくなったときも、簡単に対応できます。
標準モジュールの一番上のところだけを
Option Explicit
Public Const FILE_PATH = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-path-kotei\sample.txt"
'Public FILE_PATH As String
'
'Sub Auto_Open()
'
'FILE_PATH = ThisWorkbook.Path & "\sample.txt"
'
'End Sub
このようにちょちょいっとコメントアウト(もちろん削除してもOK)しつつ、定数に書き換えれば、全プロジェクトに対しての対応が一か所の修正で可能になります。
ちなみに、当然ですがAuto_Openプロシージャをコメントアウトまたは削除しておかないと
このように「コンパイルエラー:定数には値を代入できません。」と怒られます。
だから、Auto_Openプロシージャを標準モジュールの一番上に記載しておくということですね。
まとめ
ということで、エクセルVBAでThisWorkbook.Pathを使ったファイル名フルパスを定数っぽく使えるようにする方法についてお伝えしました。
Auto_Openプロシージャ、覚えておくと便利ですね。以下のような用途でも使えますしね。
ちょっと大きめのプロジェクトになると、けっこうファイルパスがアチコチに書き込まれることになるので、今回のように一か所で更新できるようにしておくと、スッキリしますしメンテナンスが楽になります。
ぜひ、ご活用下さいね!