はじめに:なぜファイルの存在確認が必要なのか?
Excel VBAでマクロを自動化する際、特定のファイルやフォルダの存在を確認し、その結果で処理を分岐させることは非常に重要です。
- ファイルが存在しないのに開こうとすると、マクロがエラーで停止する。
- 既存ファイルを更新するか、新規作成するかを判断したい。
- 出力先フォルダがなければ自動で作成したい。
これにより、マクロは堅牢になり、予期せぬエラーを防ぎ、より安定した自動化を実現できます。
VBAでファイルの存在を確認する2つの主要な方法
VBAには、ファイルの存在確認に使える主要な方法が2つあります。それぞれの特徴を理解し、状況に応じて使い分けましょう。
方法1: Dir関数を使ったシンプルなファイル存在確認
Dir関数は、指定したパスにファイルやディレクトリが存在するかを確認するVBA標準関数です。存在すればその名前を、存在しなければ空文字("")を返します。
Dir関数のサンプルコード
Sub CheckFileExistsWithDir()
Dim filePath As String
filePath = ThisWorkbook.Path & "\sample.txt" ' 同一フォルダ内のsample.txtをチェック
If Dir(filePath) <> "" Then
MsgBox "ファイルが存在します: " & filePath
Else
MsgBox "ファイルが存在しません: " & filePath, vbExclamation
End If
End Sub
メリット・デメリット
- メリット: 参照設定不要、シンプルな記述、ワイルドカード利用可能。
- デメリット: ファイルの詳細情報取得不可、ファイルとフォルダの区別が難しい場合がある。
方法2: FileSystemObjectを使った高機能なファイル存在確認
FileSystemObject(FSO)は、ファイルシステムを操作するためのオブジェクトモデルです。ファイルの存在確認に加え、作成・削除・コピー・移動など、高度な操作が可能です。
参照設定「Microsoft Scripting Runtime」の追加
- VBAエディタ(Alt + F11)を開く。
- 「ツール」→「参照設定」を選択。
- 「Microsoft Scripting Runtime」にチェックを入れ「OK」。
FileSystemObjectのサンプルコード
Sub CheckFileExistsWithFSO()
Dim fso As Object
Dim filePath As String
Set fso = CreateObject("Scripting.FileSystemObject") ' 参照設定済みなら「New FileSystemObject」も可
filePath = ThisWorkbook.Path & "\another_sample.txt"
If fso.FileExists(filePath) Then
MsgBox "ファイルが存在します: " & filePath
Else
MsgBox "ファイルが存在しません: " & filePath, vbExclamation
End If
Set fso = Nothing
End Sub
メリット・デメリット
- メリット: ファイル・フォルダの多様な操作、詳細情報取得、オブジェクト指向。
- デメリット: 事前の参照設定が必要、Dir関数よりコード量が増える傾向。
実践!ファイルの存在有無で処理を分岐させる具体例
ファイルの存在を確認し、その結果で異なる処理を行うマクロの具体例を見ていきましょう。
Dir関数とFileSystemObjectを組み合わせた実用例(ファイル処理)
指定したCSVファイルが存在すれば開き、なければ新規作成して初期データを書き込む例です。
Sub ProcessOrCreateCSV()
Dim targetFilePath As String
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
targetFilePath = ThisWorkbook.Path & "\data.csv"
If Dir(targetFilePath) <> "" Then
' ファイルが存在する場合:既存ファイルを開く
MsgBox "既存のCSVファイルを開きます: " & targetFilePath
Workbooks.Open targetFilePath
Else
' ファイルが存在しない場合:新規作成して初期データを書き込む
MsgBox "CSVファイルが存在しないため、新規作成します。"
Dim fsoStream As Object
Set fsoStream = fso.CreateTextFile(targetFilePath, True)
fsoStream.WriteLine "ID,Name,Value"
fsoStream.WriteLine "1,Apple,100"
fsoStream.WriteLine "2,Banana,150"
fsoStream.Close
Set fsoStream = Nothing
MsgBox "data.csvを新規作成し、初期データを書き込みました。"
Workbooks.Open targetFilePath
End If
Set fso = Nothing
End Sub
FileSystemObjectを使ったフォルダ作成とファイル保存の例
指定した出力フォルダが存在しなければ作成し、その中にExcelファイルを保存する例です。
Sub CreateFolderAndSaveFile()
Dim fso As Object
Dim outputFolderPath As String
Dim outputFileName As String
Dim savePath As String
Set fso = CreateObject("Scripting.FileSystemObject")
outputFolderPath = ThisWorkbook.Path & "\OutputData"
outputFileName = "Report_" & Format(Date, "yyyymmdd") & ".xlsx"
savePath = outputFolderPath & "\" & outputFileName
If Not fso.FolderExists(outputFolderPath) Then
fso.CreateFolder outputFolderPath
MsgBox "出力フォルダを新規作成しました: " & outputFolderPath
Else
MsgBox "出力フォルダは既に存在します: " & outputFolderPath
End If
On Error GoTo ErrorHandler
ActiveSheet.Copy
With ActiveWorkbook
.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
.Close SaveChanges:=False
End With
MsgBox "レポートファイルを保存しました: " & savePath
Exit Sub
ErrorHandler:
MsgBox "ファイル保存中にエラーが発生しました: " & Err.Description, vbCritical
If Not ActiveWorkbook Is Nothing Then ActiveWorkbook.Close SaveChanges:=False
End Sub
まとめ:状況に応じた使い分けとマクロの堅牢性向上
Dir関数とFileSystemObjectを使ったファイルの存在確認と条件分岐について解説しました。
Dir関数: シンプルな確認やワイルドカード検索に最適。FileSystemObject: 高度なファイル・フォルダ操作や詳細情報が必要な場合に強力。
これらの機能を適切に使い分けることで、エラーに強く、環境変化にも対応できる堅牢なマクロを作成できます。ぜひ、ご自身の業務自動化に役立ててください。


コメント