VBAでフォルダがなければ自動作成する方法 | Dir・MkDir・FSOの使い分けと日付フォルダ対応

VBAでファイルを保存する処理を組むときは、保存先フォルダの存在確認と自動作成をセットで入れておくのが基本です。フォルダがない状態で保存処理を実行するとエラーになるため、「なければ作る」という一手間が、マクロの安定動作につながります。

この記事では、次の内容を順番に解説します。

  • フォルダの存在確認と自動作成の2つの方法(MkDir方式・FSO方式)
  • どちらを使うべきかの使い分け
  • 日付入りフォルダを自動作成する応用パターン
  • ファイル保存処理とセットで使う実践コード

フォルダの存在確認と自動作成をするには?

VBAでフォルダを自動作成する方法は大きく2つあります。標準機能の Dir + MkDir を使う方法と、FileSystemObject(FSO) を使う方法です。

方法存在確認作成特徴
Dir + MkDirDir(パス, vbDirectory)MkDir パス参照設定不要。VBA標準で動く
FileSystemObjectfso.FolderExists(パス)fso.CreateFolder パス記述がわかりやすい。ファイル操作全般に使える

どちらも動作は同じです。シンプルに使いたいなら Dir + MkDir、ファイルのコピーや削除なども同じコードでまとめて扱いたいなら FileSystemObject が向いています。

Dir + MkDir でフォルダを自動作成するには?

追加のオブジェクト設定が不要で、VBAの標準機能だけで動きます。最もシンプルな方法です。

Sub CreateFolderIfNotExists_Dir()

    Dim folderPath As String

    folderPath = "C:¥Data¥Output"

    'フォルダが存在しない場合だけ作成する
    If Dir(folderPath, vbDirectory) = "" Then
        MkDir folderPath
        MsgBox "フォルダを作成しました:" & folderPath
    Else
        MsgBox "フォルダはすでに存在します。"
    End If

End Sub

Dir(パス, vbDirectory) の戻り値が空文字("")であればフォルダが存在しないため、その場合にのみ MkDir で作成します。すでに存在する場合は何もしないので、二重作成のエラーも起きません。

FileSystemObject でフォルダを自動作成するには?

FileSystemObject(FSO)を使うと、FolderExists という名前のメソッドで存在確認できるため、コードの意味が読みやすくなります。ファイルのコピー・削除など他のファイル操作も同じFSOで行う場合にまとめやすいのが利点です。

Sub CreateFolderIfNotExists_FSO()

    Dim fso        As Object
    Dim folderPath As String

    folderPath = "C:¥Data¥Output"

    Set fso = CreateObject("Scripting.FileSystemObject")

    'FolderExistsでフォルダの存在を確認
    If fso.FolderExists(folderPath) = False Then
        fso.CreateFolder folderPath
        MsgBox "フォルダを作成しました:" & folderPath
    Else
        MsgBox "フォルダはすでに存在します。"
    End If

End Sub

注意点:MkDir は親フォルダが存在しない場合にエラーになります(例:C:¥Data がない状態で C:¥Data¥Output を作成しようとするとエラー)。FSOの CreateFolder も同様です。階層が深い場合は親フォルダから順番に作成するか、後述の方法を使いましょう。

親フォルダも含めて階層ごとに自動作成するには?

保存先が複数階層にわたる場合、存在しない親フォルダも含めて順番に確認・作成する関数を用意しておくと便利です。

'フォルダパスを階層ごとに分割して順番に作成する関数
Sub CreateNestedFolder(folderPath As String)

    Dim parts()  As String
    Dim current  As String
    Dim i        As Integer

    parts = Split(folderPath, "¥")
    current = parts(0) & "¥"   'ドライブレター(例:C:¥)

    For i = 1 To UBound(parts)
        If parts(i) <> "" Then
            current = current & parts(i)
            If Dir(current, vbDirectory) = "" Then
                MkDir current
            End If
            current = current & "¥"
        End If
    Next i

End Sub

'呼び出し例
Sub TestNestedFolder()
    CreateNestedFolder "C:¥Data¥2026¥04月¥請求書"
    MsgBox "フォルダを作成しました。"
End Sub

この関数を使うと、C:¥Data¥2026¥04月¥請求書 のように深い階層でも、存在しない部分を上から順番に作成してくれます。

日付入りフォルダを自動作成するには?

「毎日のレポートを日付フォルダに保存したい」という場面では、Format(Date, "yyyymmdd") でフォルダ名に今日の日付を入れます。ファイル保存処理とセットで組み合わせることで、フォルダ準備から保存まで完全自動化できます。

Sub SaveReportToDateFolder()

    Dim basePath   As String
    Dim todayPath  As String
    Dim fileName   As String
    Dim savePath   As String

    basePath  = "C:¥Reports"
    todayPath = basePath & "¥" & Format(Date, "yyyymmdd")
    fileName  = "日報_" & Format(Date, "yyyymmdd") & ".xlsx"
    savePath  = todayPath & "¥" & fileName

    '日付フォルダがなければ作成
    If Dir(basePath, vbDirectory) = "" Then MkDir basePath
    If Dir(todayPath, vbDirectory) = "" Then MkDir todayPath

    'このブックを日付フォルダにコピー保存
    ThisWorkbook.SaveCopyAs savePath

    MsgBox "保存しました:" & savePath

End Sub

実行すると、たとえば今日が2026年4月16日であれば C:¥Reports¥20260416¥日報_20260416.xlsx として保存されます。日付が変わるたびに新しいフォルダが自動で作られるため、手作業でフォルダを用意する必要がなくなります。

まとめ

  • フォルダの存在確認と自動作成は、ファイル保存処理のエラー対策の基本
  • Dir + MkDir:参照設定不要でシンプル。ほとんどの場面でこれで十分
  • FileSystemObject:コードが読みやすく、ファイル操作全般をまとめて扱いたい場合に便利
  • 親フォルダが存在しない深い階層は、パスを分割して上から順番に作成する関数を用意すると安心
  • Format(Date, "yyyymmdd") で日付入りフォルダ名を作り、ファイル保存とセットで使うと完全自動化できる

よくある質問

MkDir と FileSystemObject はどちらを使えばいいですか?

フォルダの作成だけが目的であれば Dir + MkDir で十分です。ファイルのコピー・削除・移動なども同じコードで行いたい場合は FileSystemObject を使うとまとめやすくなります。どちらを使っても動作は同じなので、チームの書き方に合わせて統一するのがおすすめです。

親フォルダが存在しない場合にエラーになります

MkDirFileSystemObject.CreateFolder も、親フォルダが存在しない状態では1段階しか作成できません。C:¥Data¥2026¥04月 を作成したいのに C:¥Data が存在しない、という場合はエラーになります。この記事で紹介した「階層ごとに分割して順番に作成する関数」を使うと、深い階層でも安全に対応できます。

フォルダ名に今日の日付を入れるにはどう書きますか?

Format(Date, "yyyymmdd") で「20260416」のような文字列を取得できます。Format(Date, "yyyy年mm月dd日") のようにフォーマットを変えることもできます。月別フォルダなら Format(Date, "yyyymm")、年別なら Format(Date, "yyyy") のように用途に合わせて調整してください。

フォルダ作成の処理を毎回書くのが面倒です

この記事で紹介した CreateNestedFolder のように、フォルダ作成処理を1つの関数(Functionプロシージャ)にまとめておき、必要な場面で呼び出す方法がおすすめです。ファイル保存を行うマクロが複数ある場合でも、CreateNestedFolder "C:¥..." の1行を追加するだけで対応できます。

社内の共有フォルダ(ネットワーク)でも使えますか?

はい、使えます。いつもエクスプローラーで見ているフォルダの場所(パス)をそのまま指定すればOKです。

ただし、普段「自分にアクセス権がないフォルダ」や「パスワードを入れないと開けない場所」には、マクロでも勝手にフォルダを作ることはできません。人間が手作業で作れる場所であれば、マクロでも同じように動くと考えて大丈夫です。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール