【Excel VBA】ファイルの存在確認と条件分岐でマクロを賢く自動化!Dir関数とFileSystemObject徹底解説

Excel・VBA

はじめに:なぜファイルの存在確認が必要なのか?

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」の追加

  1. VBAエディタ(Alt + F11)を開く。
  2. 「ツール」→「参照設定」を選択。
  3. 「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: 高度なファイル・フォルダ操作や詳細情報が必要な場合に強力。

これらの機能を適切に使い分けることで、エラーに強く、環境変化にも対応できる堅牢なマクロを作成できます。ぜひ、ご自身の業務自動化に役立ててください。

コメント

タイトルとURLをコピーしました