相対パス指定での注意点
VBAでファイルの場所やフォルダを指定する時、相対パス指定して、ハマった記録。
絶対パス指定と相対パス指定
Cドライブの直下に下記のような構成でフォルダ/ファイルがあるとします。
「ExeFile.exe」を指定する場合、
絶対パスの場合、「C:\TOPFOLDER\Document\AppFolder1\ExeFile.exe」となります。
相対パスは基準となる位置(今いる場所)が重要で、
Cドライブ直下なら、「./TOPFOLDER/Document/AppFolder1/ExeFile.exe」
DeskTopなら、「../Document/AppFolder1/ExeFile.exe」
Documentなら、「./AppFolder1/ExeFile.exe」
AppFolder1なら、「./ExeFile.exe」
AppFolder2なら、「../AppFolder1/ExeFile.exe」
となります。
相対パスにすると何がおいしいの?
一番のメリットは、ファイルの移動に対して柔軟に対応できる事だと思います。
AppFolder2にある「ExcelVBA.xlsm」からAppFolder2\dataにある「DataFile.txt」を開く場合、
絶対パスだと
Open "C:\TOPFOLDER\Document\AppFolder2\data\DataFile.txt" For Input As #1
相対パスだと(基準位置は別途説明します)
Open "./data/DataFile.txt" For Input As #1
もし、AppFolder2がDeskTopフォルダ配下に移動した場合を考えると、絶対パス指定している場合、「ファイルがありません」となり、動かなくなります。1台のパソコンでしか使わないならどちらでも良いですが、複数台だったり配布する場合、相対パス指定しておくことで柔軟に対応できます。
ハマった事(基準点はどこですか)
思い込みって怖いもので、AppFolder2配下にマクロ有効ブックがあるから基準点は「AppFolder2」でしょって作ってたんですが、エクセルの場合、ユーザードキュメントフォルダが基準となるのです。
Open "./data/DataFile.txt" For Input As #1
の場合、「C:\Users\ユーザー名\Documents\data\DataFile.txt」になります。
対応策としては
ChDir ThisWorkbook.Path
Open "./data/DataFile.txt" For Input As #1
の様に、基準位置を移動する必要があります。(保存されていないファイルで、ThisWorkbook.Pathを参照すると空白が返されるので注意して下さい。)
コメント