Excel VBA 逆引き集 | ファイル存在チェック

Excel VBA
スポンサーリンク

ファイル存在チェック

「開く前にあるか」「保存前に上書き確認」「必要な複数ファイルを一括チェック」など、業務で必須の存在確認を、初心者でもすぐ使える最短コードと安全テンプレでまとめます。


基本の方法(最短で確実に)

  • Dir関数でファイルを確認:
    • ポイント: Dirは存在すればファイル名を返し、無ければ空文字。ワイルドカードも使える(例: “C:\Data*.xlsx”)。
Sub CheckFile_WithDir()
    Dim path As String
    path = "C:\Data\Report.xlsx"
    If Dir(path) = "" Then
        MsgBox "ファイルが見つかりません: " & path, vbExclamation
    Else
        MsgBox "ファイルがあります: " & path, vbInformation
    End If
End Sub
VB
  • FileSystemObjectで確認(可読性派):
    • ポイント: 参照設定不要(CreateObject)。フォルダ確認は fso.FolderExists(path)
Sub CheckFile_WithFSO()
    Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
    Dim path As String: path = "C:\Data\Report.xlsx"
    If fso.FileExists(path) Then
        MsgBox "ファイルがあります", vbInformation
    Else
        MsgBox "ありません", vbExclamation
    End If
End Sub
VB

フォルダの存在チェックと作成

Sub EnsureFolder()
    Dim folderPath As String
    folderPath = ThisWorkbook.Path & "\Output"

    If Dir(folderPath, vbDirectory) = "" Then
        MkDir folderPath  '無ければ作成
        MsgBox "フォルダを作成しました: " & folderPath
    Else
        MsgBox "フォルダは存在します: " & folderPath
    End If
End Sub
VB
  • ポイント:
    • vbDirectory: Dirの第2引数に指定するとフォルダ存在判定ができる。
    • 作成権限: 作成できない可能性に備え、エラーハンドリングを併用すると安全。

安全テンプレート(開く前チェック+エラーハンドリング)

Sub OpenWorkbook_Safely()
    Dim path As String: path = ThisWorkbook.Path & "\Input\Report.xlsx"
    If Dir(path) = "" Then
        MsgBox "ファイルが見つかりません: " & path, vbExclamation
        Exit Sub
    End If

    On Error GoTo Fail
    Application.ScreenUpdating = False

    Dim wb As Workbook
    Set wb = Workbooks.Open(path, ReadOnly:=True, UpdateLinks:=False)
    '…処理…
    wb.Close SaveChanges:=False

Cleanup:
    Application.ScreenUpdating = True
    Exit Sub

Fail:
    MsgBox "開けませんでした: " & Err.Description, vbCritical
    Resume Cleanup
End Sub
VB
  • ポイント:
    • 事前チェック: Dirで早期離脱するとユーザーに優しい。
    • 更新抑止: UpdateLinks:=False でリンク更新の遅延を回避。

応用:ワイルドカード・複数ファイルの一括チェック

'パターン一致で列挙(*.xlsx を全部拾う)
Sub ListFiles_WithWildcard()
    Dim p As String: p = ThisWorkbook.Path & "\Input\*.xlsx"
    Dim name As String: name = Dir(p)
    Dim r As Long: r = 2

    If name = "" Then
        MsgBox "該当ファイルがありません: " & p, vbExclamation
        Exit Sub
    End If

    Do While name <> ""
        Cells(r, 1).Value = name
        r = r + 1
        name = Dir()  '次の一致へ
    Loop
End Sub

'必須ファイル群をまとめてチェック(不足を報告)
Sub CheckRequiredFiles()
    Dim req As Variant
    req = Array("C:\Data\A.xlsx", "C:\Data\B.xlsx", "C:\Data\C.xlsx")

    Dim i As Long, missing As String
    For i = LBound(req) To UBound(req)
        If Dir(req(i)) = "" Then missing = missing & req(i) & vbCrLf
    Next

    If missing <> "" Then
        MsgBox "不足ファイル:" & vbCrLf & missing, vbExclamation
    Else
        MsgBox "すべて存在します", vbInformation
    End If
End Sub
VB
  • ポイント:
    • Dirの連続呼び出し: 2回目以降は Dir()(引数なし)で次を取得。
    • 不足リスト化: 利用者に「何が足りないか」を明確に返すと運用が楽。

再利用関数(業務用の定番化)

Public Function FileExists(ByVal path As String) As Boolean
    FileExists = (Dir(path) <> "")
End Function

Public Function FolderExists(ByVal path As String) As Boolean
    FolderExists = (Dir(path, vbDirectory) <> "")
End Function

'アクセス可能性まで確認(存在+読み取り可)
Public Function CanReadFile(ByVal path As String) As Boolean
    If Dir(path) = "" Then Exit Function
    Dim fn As Integer: fn = FreeFile
    On Error Resume Next
    Open path For Input As #fn
    If Err.Number = 0 Then
        CanReadFile = True
        Close #fn
    Else
        CanReadFile = False
        Err.Clear
    End If
    On Error GoTo 0
End Function
VB
  • ポイント:
    • 存在だけでなく「読めるか」: ネットワーク共有でロック・権限NGに遭遇するため、簡易の読み取りテストが有効。
    • 関数化: どこからでも使い回せる。

落とし穴と対策

  • 相対/絶対パスの混乱:
    • 対策: 配布コードは ThisWorkbook.Path 基準で組み立てる。ユーザーの環境差に強い。
  • UNC/ネットワークの遅延・権限:
    • 対策: 存在チェック後に簡易読み取り(CanReadFile)でアクセス可否も確認。タイムアウトは分けて扱う。
  • Dirの状態持ちに注意:
    • 対策: ワイルドカード列挙中に別の Dir を呼ぶと状態がリセットされる。列挙ループはまとめて完結させる。
  • ファイル名の禁止文字:
    • 対策: 保存前チェックでは /:*?”<>| を事前除去し、存在判定と合わせて安全に。
  • 大文字小文字の差異:
    • 対策: Windowsは非区別だが、共有先や別OS連携では注意。Dirは基本的に非区別。
タイトルとURLをコピーしました