[ Excel VBA ] 相対パス指定での注意点

エクセル

相対パス指定での注意点

VBAでファイルの場所やフォルダを指定する時、相対パス指定して、ハマった記録。

動作に関しては「Excel for Microsoft365」にて検証しています。過去のバージョンやMicrosoft365のバージョンアップ等により、異なる動作となる場合があります。

絶対パス指定と相対パス指定

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を参照すると空白が返されるので注意して下さい。)

コメント

タイトルとURLをコピーしました