■ Dir関数とは?
Dir
関数は、指定されたパス(ファイル名またはフォルダ名)に一致する最初のファイル名またはフォルダ名を返す関数です。
Dir[(pathname[, attributes])]
引数の意味
引数 | 説明 |
---|---|
pathname | ファイルまたはフォルダのパス(例:”C:\Test*.txt”) |
attributes | ファイル属性(省略可) |
■ 基本例:ファイルの存在確認
Sub ファイル存在確認()
Dim filePath As String
filePath = "C:\Test\sample.xlsx"
If Dir(filePath) <> "" Then
MsgBox "ファイルは存在します"
Else
MsgBox "ファイルは見つかりません"
End If
End Sub
Dir
が空文字列(""
)を返す場合はファイルが存在しないと判断できます。
■ 基本例:フォルダの存在確認
Sub フォルダ存在確認()
Dim folderPath As String
folderPath = "C:\TestFolder"
If Dir(folderPath, vbDirectory) <> "" Then
MsgBox "フォルダは存在します"
Else
MsgBox "フォルダは存在しません"
End If
End Sub
vbDirectory
属性を指定することで、フォルダの存在確認ができます。
■ ファイル一覧の取得(ワイルドカード使用)
Sub ファイル一覧表示()
Dim folderPath As String
folderPath = "C:\Test\"
Dim fileName As String
fileName = Dir(folderPath & "*.xlsx")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
End Sub
ポイント
- 初回の
Dir(path & "*.拡張子")
で検索を開始。 - 以降の
Dir()
(引数なし)で次のファイルを取得。 - 最後は
""
が返ってくるので、ループ終了。
■ フォルダ一覧の取得
Sub フォルダ一覧表示()
Dim folderPath As String
folderPath = "C:\Test\"
Dim folderName As String
folderName = Dir(folderPath, vbDirectory)
Do While folderName <> ""
If folderName <> "." And folderName <> ".." Then
If (GetAttr(folderPath & folderName) And vbDirectory) = vbDirectory Then
Debug.Print folderName
End If
End If
folderName = Dir()
Loop
End Sub
"."
と".."
は現在・親フォルダなので除外。GetAttr()
関数で属性チェックを行うのがポイント。
■ 属性の指定一覧(Dir関数の第2引数)
定数 | 値 | 説明 |
---|---|---|
vbNormal | 0 | 通常ファイル(省略可) |
vbReadOnly | 1 | 読み取り専用ファイル |
vbHidden | 2 | 隠しファイル |
vbSystem | 4 | システムファイル |
vbDirectory | 16 | ディレクトリ(フォルダ) |
vbArchive | 32 | アーカイブファイル |
複数の属性を組み合わせることもできます:
Dir("C:\Test\*", vbHidden + vbSystem)
■ 応用:存在しなければフォルダ作成
Sub フォルダがなければ作成()
Dim folderPath As String
folderPath = "C:\Test\NewFolder\"
If Dir(folderPath, vbDirectory) = "" Then
MkDir folderPath
MsgBox "フォルダを作成しました"
Else
MsgBox "フォルダはすでに存在しています"
End If
End Sub
■ 注意点
- Dirは状態を保持する関数
Dir
で取得を開始すると、VBAはその状態を記憶し、次のDir()
で続きから取得します。- 別の
Dir(path)
を呼ぶと状態がリセットされる。
- ネットワーク・クラウドパスでは動作が不安定な場合あり
- OneDriveやSharePoint上のファイルは反応しないことがあります。
- フォルダパスの末尾の
\
忘れに注意- パス連結時のエラー防止のため、
folderPath & "\" & fileName
のように明示。
- パス連結時のエラー防止のため、
■ まとめ
目的 | 使用方法例 |
---|---|
ファイル確認 | If Dir("C:\A\B.txt") <> "" Then |
フォルダ確認 | If Dir("C:\A", vbDirectory) <> "" Then |
ファイル一覧 | Dir("C:\A\*.xlsx") → Do While Dir() <> "" |
フォルダ一覧 | Dir("C:\A", vbDirectory) +GetAttr で絞込 |
属性指定 | Dir("C:\A", vbHidden + vbSystem) |