ファイル存在チェック
「開く前にあるか」「保存前に上書き確認」「必要な複数ファイルを一括チェック」など、業務で必須の存在確認を、初心者でもすぐ使える最短コードと安全テンプレでまとめます。
基本の方法(最短で確実に)
- 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)。
- ポイント: 参照設定不要(CreateObject)。フォルダ確認は
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()(引数なし)で次を取得。 - 不足リスト化: 利用者に「何が足りないか」を明確に返すと運用が楽。
- Dirの連続呼び出し: 2回目以降は
再利用関数(業務用の定番化)
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は基本的に非区別。
