【Excel VBA】FSOでフォルダが存在しない場合に新規作成する方法 (FolderExists)

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 "パス"

ファイルを出力したり、読み込んだりするマクロの冒頭で、この一手間を加えるだけで、「指定したフォルダが見つかりません」という典型的な実行時エラーを回避でき、マクロの安定性が格段に向上します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次