VBAでファイルを扱う際、現在の作業フォルダ、すなわち**「カレントフォルダ」**を基準に操作したい場合があります。例えば、パスを指定せずにファイル名だけで保存した場合、そのファイルはカレントフォルダに保存されます。
VBAには、このカレントフォルダを取得するためのCurDir
という関数が用意されています。しかし、この関数の挙動には注意が必要で、多くの場合、より安全な代替手段が存在します。
この記事では、CurDir
関数の使い方と、実務で使う際に必ず知っておくべき注意点を解説します。
完成したVBAコードと、その動作
以下のコードは、現在のカレントフォルダを表示し、その後、パスを指定せずに新しいブックを保存するものです。
Sub CheckCurrentDirectory()
' 変数を宣言します
Dim currentFolderPath As String
Dim newBook As Workbook
' --- 1. 現在のカレントフォルダを取得して表示 ---
currentFolderPath = CurDir
MsgBox "現在のカレントフォルダは以下です:" & vbCrLf & currentFolderPath
' --- 2. パスを指定せずにブックを保存 ---
' 新しいブックを追加
Set newBook = Workbooks.Add
' ファイル名だけで保存すると、カレントフォルダに保存される
newBook.SaveAs "NewFile_In_CurDir.xlsx"
' --- 3. 保存したブックを閉じる ---
newBook.Close
MsgBox "「" & currentFolderPath & "」に" & vbCrLf & _
"「NewFile_In_CurDir.xlsx」を保存しました。"
End Sub
このマクロを実行すると、まずメッセージボックスにカレントフォルダが表示されます。そして、そのフォルダ内にNewFile_In_CurDir.xlsx
という名前の新しいExcelファイルが作成されているはずです。
【最重要】 CurDir
と ThisWorkbook.Path
の決定的な違い
CurDir
を使う上で最も重要な注意点は、その指し示すフォルダが、必ずしもマクロが書かれているブックのフォルダと一致するとは限らないという点です。
プロパティ/関数 | 示す場所 | 信頼性 | 主な用途 |
CurDir | Excelアプリケーションの現在の作業フォルダ | 低い(変わりやすい) | 特殊なケースのみ。通常は非推奨。 |
ThisWorkbook.Path | マクロが書かれているブックの保存フォルダ | 高い(不変) | ファイル入出力の基準パスとして強く推奨。 |
CurDir
が指すフォルダは、以下のような操作で簡単に変わってしまいます。
- ユーザーが「ファイルを開く」や「名前を付けて保存」ダイアログで別のフォルダに移動した。
- VBAの
ChDir
ステートメントで変更された。
そのため、マクロの実行タイミングによってCurDir
がどこを指しているか分からなくなり、意図しない場所にファイルが保存されたり、「ファイルが見つからない」というエラーの原因になったりします。
まとめ
- **
CurDir
**は、Excelの現在の作業フォルダを取得する関数です。 - パスを指定せずに**
SaveAs "ファイル名"
**を実行すると、CurDir
が指すフォルダに保存されます。 CurDir
はユーザーの操作などで簡単に変化するため、信頼性が低いです。
結論として、マクロブックと同じフォルダを基準にファイルを操作したい場合は、CurDir
を使うのではなく、常にThisWorkbook.Path
を使いましょう。
myPath = ThisWorkbook.Path & "\NewFile.xlsx"
この書き方を徹底することで、マクロの実行環境に左右されない、安定したファイル操作が可能になります。