VBAには、CurDir
というExcelアプリケーションの現在の作業フォルダ(カレントフォルダ)を取得する関数があります。それと対になる形で、このカレントフォルダをプログラムで変更するための命令も用意されています。
それがChDir
(Change Directory)とChDrive
(Change Drive)です。この記事では、これらの使い方と、カレントフォルダを扱う上での重要な注意点を解説します。
1. 同じドライブ内でフォルダを変更する (ChDir
)
現在アクティブなドライブ(例: Cドライブ)の中で、カレントフォルダを別のフォルダに変更する場合は、ChDir
ステートメントを使います。
コードと解説
Sub ChangeCurrentDirectory_SameDrive()
Dim newFolderPath As String
' 例として、Cドライブの"Work"フォルダに変更
newFolderPath = "C:\Work"
' フォルダが存在するかを確認
If Dir(newFolderPath, vbDirectory) = "" Then
MsgBox "指定されたフォルダは存在しません。", vbExclamation
Exit Sub
End If
'--- カレントフォルダを変更 ---
ChDir newFolderPath
'--- 変更されたことを確認 ---
MsgBox "カレントフォルダを以下に変更しました:" & vbCrLf & CurDir
End Sub
ChDir "フォルダパス"
: 指定したフォルダパスにカレントフォルダを変更します。- 注意点: この命令は、ドライブをまたいでは移動できません。例えば、現在のカレントフォルダがCドライブにある状態で、
ChDir "D:\Data"
を実行しようとしても、カレントフォルダは変更されず、エラーが発生します。
2. 別のドライブのフォルダに変更する (ChDrive
+ ChDir
)
カレントフォルダを別のドライブ(例: CドライブからDドライブ)にあるフォルダに変更したい場合は、2段階のステップが必要です。
コードと解説
Sub ChangeCurrentDirectory_DifferentDrive()
Dim newFolderPath As String
' 例として、Dドライブの"Data"フォルダに変更
newFolderPath = "D:\Data"
' フォルダが存在するかを確認
If Dir(newFolderPath, vbDirectory) = "" Then
MsgBox "指定されたフォルダは存在しません。", vbExclamation
Exit Sub
End If
'--- ステップ1: カレントドライブを変更 ---
ChDrive newFolderPath
'--- ステップ2: カレントフォルダを変更 ---
ChDir newFolderPath
'--- 変更されたことを確認 ---
MsgBox "カレントフォルダを以下に変更しました:" & vbCrLf & CurDir
End Sub
ChDrive newFolderPath
: まず、ChDrive
ステートメントでカレントドライブを変更します。引数にはフルパスを指定できますが、実際に使われるのはドライブ文字の部分だけです。ChDir newFolderPath
: カレントドライブが目的のドライブに切り替わった後で、ChDir
を使い、そのドライブ内の目的のフォルダにカレントフォルダを変更します。
【最重要】それでもカレントフォルダに依存すべきではない理由
前回の記事でも触れましたが、ChDir
でカレントフォルダを意図通りに変更したとしても、それは一時的な状態に過ぎません。
マクロの実行中に、ユーザーが「ファイルを開く」ダイアログで別のフォルダを閲覧しただけで、カレントフォルダは簡単に変わってしまいます。
そのため、ファイルを保存したり読み込んだりする際には、CurDir
を基準にするのではなく、 ThisWorkbook.Path
(マクロが保存されているブックのフォルダ) のように、信頼できる絶対的なパスを基準に、完全なファイルパスを組み立てることを常に強くお勧めします。
ChDir
やChDrive
は、特定の古いアプリケーションとの連携など、どうしてもカレントフォルダ自体の変更が必要な、限定的な場面でのみ使用するようにしましょう。
まとめ
- 同じドライブ内でのフォルダ移動:
ChDir "パス"
- 異なるドライブへのフォルダ移動:
ChDrive "パス"
とChDir "パス"
の2段階
カレントフォルダは変更可能ですが、非常に変わりやすく不安定なため、通常のファイル操作の基準として依存するのは避けるべきです。ファイルのパスは、常にThisWorkbook.Path
などから正確に指定するのが、堅牢なVBAマクロを作成するための基本です。