■ Dir関数の基本構文
Dir[(pathname, [attributes])]
- pathname:検索するファイルやフォルダーのパス(文字列)
- attributes(省略可):検索対象の属性(ファイル/フォルダー、隠しファイルなど)
■ 属性(attributes)の種類
定数 | 値 | 内容 |
---|---|---|
vbNormal | 0 | 通常のファイル |
vbReadOnly | 1 | 読み取り専用ファイル |
vbHidden | 2 | 隠しファイル |
vbSystem | 4 | システムファイル |
vbDirectory | 16 | ディレクトリ(フォルダー) |
vbArchive | 32 | アーカイブ属性 |
複数の属性を組み合わせるには「+」を使います:
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 単体ではサブフォルダー内を検索できません。再帰的な処理が必要です。 |
④ ファイル名のみ返す | フルパスではなく、ファイル名のみ返します |
⑤ 属性の扱いが限定的 | vbSystem や vbHidden などを意識しないと、一部ファイルが見つからない |
■ よく使うパターンマッチ
パターン | 説明 |
---|---|
"*.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
や再帰が必要。