VBAマクロでファイルを特定のフォルダに保存したり、フォルダ内のファイルを読み込んだりする際、もし対象のフォルダが存在しなかったら、エラーが発生してマクロは停止してしまいます。
このようなエラーを未然に防ぐには、処理の実行前に**「フォルダが存在するか?」をチェックし、「もし存在しなければ、新しく作成する」**という処理を組み込むのが鉄則です。
FileSystemObject (FSO)
を使えば、この一連のチェックと作成の処理を簡単に行うことができます。この記事では、そのための基本的なコードパターンを解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール
> 参照設定
を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下は、このマクロが書かれているExcelファイルと同じ場所に、今日の日付の付いたサブフォルダ(例: Output_20250814
)が存在するかをチェックし、なければ新規作成するVBAコードです。
'参照設定: Microsoft Scripting Runtime
Sub EnsureFolderExists()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim targetFolderPath As String
Dim folderObj As Folder
'--- 1. 作成したいフォルダのパスを定義 ---
targetFolderPath = ThisWorkbook.Path & "\Output_" & Format(Date, "yyyymmdd")
'--- 2. FolderExistsメソッドで、フォルダの存在をチェック ---
If fso.FolderExists(targetFolderPath) = False Then
' 存在しない場合
'--- 3a. CreateFolderメソッドで、新しいフォルダを作成 ---
Set folderObj = fso.CreateFolder(targetFolderPath)
MsgBox "フォルダが存在しなかったため、新しく作成しました。" & vbCrLf & folderObj.Path
Else
' 存在する場合
'--- 3b. GetFolderメソッドで、既存のフォルダオブジェクトを取得 ---
Set folderObj = fso.GetFolder(targetFolderPath)
MsgBox "指定されたフォルダは既に存在します。" & vbCrLf & folderObj.Path
End If
' オブジェクトを解放
Set folderObj = Nothing
Set fso = Nothing
End Sub
コードのポイント解説
① フォルダの存在を確認: .FolderExists
If fso.FolderExists(targetFolderPath) = False Then
fso
オブジェクトの.FolderExists
メソッドは、引数で指定したパスにフォルダが存在するかどうかを**True
(存在する)またはFalse
(存在しない)**のブール値で返します。このIf
文で、フォルダの有無に応じた処理の分岐を行っています。
② フォルダを新規作成: .CreateFolder
Set folderObj = fso.CreateFolder(targetFolderPath)
フォルダが存在しなかった場合に、.CreateFolder
メソッドを実行します。このメソッドは、指定したパスに新しいフォルダを作成し、その新しいFolder
オブジェクトを戻り値として返します。
③ 既存のフォルダを取得: .GetFolder
Set folderObj = fso.GetFolder(targetFolderPath)
フォルダが既に存在していた場合は、.GetFolder
メソッドでその既存のフォルダのオブジェクトを取得します。これにより、後続の処理(そのフォルダ内にファイルを保存するなど)をスムーズに行えます。
【応用】より実用的な関数にする
この「存在チェック → なければ作成」という処理は非常によく使うため、以下のような再利用可能なFunction
としてまとめておくと大変便利です。
' 指定したパスのフォルダを確実に取得する関数(なければ作る)
Function GetOrCreateFolder(ByVal path As String) As Folder
Dim fso As New FileSystemObject
If Not fso.FolderExists(path) Then
fso.CreateFolder path
End If
Set GetOrCreateFolder = fso.GetFolder(path)
End Function
' 関数の使い方
Sub TestFunction()
Dim myFolder As Folder
Set myFolder = GetOrCreateFolder(ThisWorkbook.Path & "\MyReports")
MsgBox myFolder.Path & " の準備ができました。"
End Sub
まとめ
VBAでフォルダを扱う際の、エラーを防ぐための基本パターンは以下の通りです。
If Not fso.FolderExists("パス") Then fso.CreateFolder "パス"
ファイルを出力したり、読み込んだりするマクロの冒頭で、この一手間を加えるだけで、「指定したフォルダが見つかりません」という典型的な実行時エラーを回避でき、マクロの安定性が格段に向上します。