VBA フォルダ確認(Dir)

■ Dir関数の基本構文

Dir[(pathname, [attributes])]
  • pathname:検索するファイルやフォルダーのパス(文字列)
  • attributes(省略可):検索対象の属性(ファイル/フォルダー、隠しファイルなど)

■ 属性(attributes)の種類

定数内容
vbNormal0通常のファイル
vbReadOnly1読み取り専用ファイル
vbHidden2隠しファイル
vbSystem4システムファイル
vbDirectory16ディレクトリ(フォルダー)
vbArchive32アーカイブ属性

複数の属性を組み合わせるには「+」を使います:

Dir("C:\MyFolder", vbDirectory + vbHidden)

■ 使い方①:ファイルの存在確認

If Dir("C:\test\file.txt") <> "" Then
MsgBox "ファイルは存在します。"
Else
MsgBox "ファイルが存在しません。"
End If

Dir関数は、該当するファイルやフォルダーが存在する場合はそのファイル名を返す。存在しない場合は空文字列("")を返します。


■ 使い方②:フォルダーの存在確認

If Dir("C:\MyFolder", vbDirectory) <> "" Then
MsgBox "フォルダーは存在します。"
Else
MsgBox "フォルダーは存在しません。"
End If

このように、vbDirectoryを指定しないとファイルとして探され、フォルダーは見つからないことがあるため注意が必要です。


■ 使い方③:ワイルドカードでファイルを検索(列挙)

Sub ListTextFiles()
Dim fileName As String
fileName = Dir("C:\TestFolder\*.txt")

Do While fileName <> ""
Debug.Print fileName
fileName = Dir
Loop
End Sub

ポイント:

  • Dir関数は最初の呼び出しで検索条件を指定します。
  • 2回目以降は引数なしで連続呼び出しし、次の一致ファイルを取得します。
  • 一致するものがなくなれば""を返します。

■ フォルダーの一覧を取得する例

Sub ListFolders()
Dim folderName As String
folderName = Dir("C:\TestFolder\*", vbDirectory)

Do While folderName <> ""
' "."と".."は除外
If folderName <> "." And folderName <> ".." Then
If (GetAttr("C:\TestFolder\" & folderName) And vbDirectory) = vbDirectory Then
Debug.Print folderName
End If
End If
folderName = Dir
Loop
End Sub

■ Dirの注意点

注意点内容
① グローバルな状態管理Dirは内部的に状態を持つため、複数のDirループを同時に使用できません
② “.”や”..”の除外が必要フォルダー一覧を取得すると、...も返ってくるため除く必要あり
③ サブフォルダーの検索非対応Dir単体ではサブフォルダー内を検索できません。再帰的な処理が必要です。
④ ファイル名のみ返すフルパスではなく、ファイル名のみ返します
⑤ 属性の扱いが限定的vbSystemvbHidden などを意識しないと、一部ファイルが見つからない

■ よく使うパターンマッチ

パターン説明
"*.txt"拡張子が .txt のファイル
"file?.txt"file1.txt, fileA.txt など
"data*.csv"data, で始まるCSVファイル
"*"すべてのファイル/フォルダー

■ 実用的な使用例:特定のファイル群を削除

Sub DeleteLogFiles()
Dim file As String
file = Dir("C:\Logs\*.log")

Do While file <> ""
Kill "C:\Logs\" & file
file = Dir
Loop
End Sub

■ 応用例:サブフォルダーも含めてファイルを検索(再帰処理)

Sub ListAllFilesRecursive(folderPath As String)
Dim file As String
Dim subFolder As String

' ファイルを列挙
file = Dir(folderPath & "\*", vbNormal)
Do While file <> ""
Debug.Print folderPath & "\" & file
file = Dir
Loop

' サブフォルダーを列挙
subFolder = Dir(folderPath & "\*", vbDirectory)
Do While subFolder <> ""
If subFolder <> "." And subFolder <> ".." Then
If (GetAttr(folderPath & "\" & subFolder) And vbDirectory) = vbDirectory Then
ListAllFilesRecursive folderPath & "\" & subFolder
End If
End If
subFolder = Dir
Loop
End Sub

呼び出し例:

Call ListAllFilesRecursive("C:\TestFolder")

■ まとめ(要点)

  • Dirファイル/フォルダーの存在確認一覧取得に便利。
  • ワイルドカードを使えば、複数ファイルの処理が容易。
  • 複数のループで使う際は内部状態の競合に注意
  • サブフォルダー対応や属性判定などの拡張にはGetAttrや再帰が必要。
タイトルとURLをコピーしました