更新日:、 作成日:

VBA カレントディレクトリと相対パスの書き方

はじめに

Excel VBA マクロでカレントディレクトリの取得または設定と相対パスの書き方を紹介します。

パスには絶対パス (フルパス) と相対パスがあります。主に絶対パスを使用します。

パスを使用する関数などはどちらにも対応しているはずです。

絶対パスと相対パスの違い

  • 絶対パス:D:\Tips\found.txt

「絶対パス」とはルートとなるディレクトリから入力したパスのことです。どこにあるフォルダやファイルなのかを特定できます。

  • 相対パス:found.txt

「相対パス」とはフォルダやファイル名だけを入力したパスのことです。どこにあるフォルダやファイルなのかは、カレントディレクトリによって変わります。

カレントディレクトリ パス
D:D:\found.txt
D:\TipsD:\Tips\found.txt

このようにカレントディレクトリを基準にしたパスのことを相対パスと言います。

相対パスの書き方

相対パスには特殊な入力方法があります。

  • /:ルートを表します。
  • ./:カレントディレクトリを表します。
  • ../:1 つ上の階層を表します。
  • ../../:2 つ上の階層を表します。../ を複数入力することで、上位の階層を表します。

カレントディレクトリが D:\1\2\3 のときは次のようになります。

相対パス 結果
/D:
/found.txtD:\found.txt
./D:\1\2\3
./found.txtD:\1\2\3\found.txt
../found.txtD:\1\2\found.txt
../../found.txtD:\1\found.txt

カレントディレクトリを取得または設定する

FileSystemObject について

ここでは VBA の標準の関数より便利な FileSystemObject を使った方法を紹介しています。基本的な使い方については「FileSystemObject ファイル操作の基礎」をご覧ください。

コードを見やすくするため FileSystemObject を参照設定しています。また、エラー処理は行っていません。

取得

FileSystemObject オブジェクトと「CurDir 関数」の使用例を紹介します。カレントディレクトリの既定値はエクセルのオプションから保存の「既定のローカルファイルの保存場所」です。

Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim s As String
s = fso.GetAbsolutePathName("./") ' カレントディレクトリを取得する
Debug.Print(s) ' D:\Tips など

' 後始末
Set fso = Nothing

fso.GetAbsolutePathName 関数は、指定したパスを絶対パスに変換して取得します。

Dim s As String
s = CurDir ' カレントディレクトリを取得する
Debug.Print(s)  ' D:\Tips など

CurDir 関数は、カレントディレクトリを取得します。

設定

ChDrive ("D")     ' 既定のドライブを設定する
ChDir ("D:\Tips") ' カレントディレクトリを設定する

Dim s As String
s = CurDir ' カレントディレクトリを取得する
Debug.Print(s)  ' D:\Tips

ChDrive 関数は、既定のドライブを設定します。

ChDir 関数は、既定のドライブのカレントディレクトリを設定します。

CurDir 関数は、既定のドライブのカレントディレクトリを取得します。

カレントディレクトリは C: や D: などそれぞれのドライブごとに持てます。既定のドライブが C: のときに「ChDir 関数」で D: を設定しても「CurDir 関数」は C: を取得します。

そのため「ChDir 関数」で設定するドライブと同じドライブを「ChDrive 関数」で設定しておく必要があります。

カレントディレクトリを使用するとき

一般的にカレントディレクトリを使用することはありません。またカレントディレクトリを設定することもありません。絶対パスを常に使用します。

相対パスを使用してファイルを読み書きするときに、カレントディレクトリがどこであっても問題ない。またはカレントディレクトリの場所にあるファイルを常に読み書きする必要があるときなら使用します。

なぜなら、カレントディレクトリはいつどこで変更されるかわからないからです。例えばファイルを開くダイアログや保存するダイアログを使用すると、カレントディレクトリは変更されます。