この記事ではDir関数の使い方と注意点について解説します。
他のよく使うVBA関数一覧はこちら。
Dir関数の使い方と注意点
Dir関数は、ファイルやフォルダの存在確認や一覧取得を行うための関数です。
指定パスにファイルが存在するかどうかをチェックしたり、複数ファイルを順に取得する際によく使われます。
Dir関数は状態を内部的に保持する特殊な関数です。
使い方を誤ると、想定と異なるファイルを取得したり、取得が途中で止まったりすることがあります。
特に複数フォルダを扱うときは注意が必要です。
構文
Dir[(パス[, ファイル属性])]
- パス : ファイル名またはパターン(ワイルドカード * や ? を含むことが可能)
- ファイル属性 : ファイル属性の組み合わせを表す定数(vbDirectory, vbHidden など)。省略可能。
-
戻り値 : 条件に一致する
ファイル名またはフォルダ名、それ以外は""
ファイル属性を表す定数
| 定数 | 値 | 説明 |
|---|---|---|
| vbNormal | 0 | 通常のファイル(デフォルト)。 |
| vbReadOnly | 1 | 読み取り専用ファイル。 |
| vbHidden | 2 | 隠しファイルや隠しフォルダ。 |
| vbSystem | 4 | システムファイルやシステムフォルダ。 Macintoshでは使用できません。 |
| vbVolume | 8 | ボリュームラベル。Macintoshでは使用できません。 |
| vbDirectory | 16 | フォルダを対象とする(ファイルではなくディレクトリ)。 |
| vbAlias | 64 | エイリアスファイル。Macintoshでのみ使用できます。 |
使用例
ファイルの存在確認
Sub Sample()
If Dir("C:\Temp\sample.txt") <> "" Then
Debug.Print "ファイルは存在します"
Else
Debug.Print "ファイルは存在しません"
End If
End Sub
▶ 出力結果(ファイルが存在する場合)
ファイルは存在します
特定フォルダ内のファイル一覧を取得
Sub ExportFileListToExcel()
Dim folderPath As String
Dim fileName As String
Dim row As Long
' 対象フォルダのパス(最後にバックスラッシュを忘れずに)
folderPath = "C:\Temp\"
' 最初のファイルを取得
fileName = Dir(folderPath & "*.*")
row = 1
Do While fileName <> ""
Cells(row, 1).Value = fileName ' ファイル名
Cells(row, 2).Value = folderPath & fileName ' フルパス
row = row + 1
fileName = Dir() ' 次のファイル
Loop
End Sub
▶ 出力結果
最初のDir()呼び出しではパスを指定し、2回目以降は引数なしで呼び出す必要があります。
これはDir関数が内部状態を保持して次のファイルを返す仕組みのためです。
隠しファイルやフォルダを含める
Sub Sample()
Dim fname As String
fname = Dir("C:\Temp\*", vbHidden Or vbSystem)
Do While fname <> ""
Debug.Print fname
fname = Dir()
Loop
End Sub
▶ 出力結果(隠しファイル「hidden_sample.txt」)
hidden_sample.txt
sample_01.txt
sample_02.txt
sample_03.txt
Dir("パス", 属性) の属性指定は厳密なフィルタではありません。
指定した属性(例:vbHidden)に一致するファイルを1件でも取得すると、
その後の Dir() で通常ファイル(vbNormal)まで取得される挙動があります。
属性で厳密に制御したい場合は、FileSystemObject を使って .Attributes を明示的に判定する方法をおすすめします。
⚠️注意
複数回使用するときは状態保持に注意
Dirは状態を共有しているため、別のDir呼び出しで状態が上書きされます。
Sub Sample()
Dim TextFiles As String, LogFiles As String
TextFiles = Dir("C:\Temp\*.txt") ' ← 状態1
LogFiles = Dir("C:\Logs\*.log") ' ← 状態2で上書き
Debug.Print "TextFile : " & TextFiles
Debug.Print "LogFile : " & LogFiles
Debug.Print "NextFile : " & Dir() ' ← 状態2の続きが出力される
End Sub
▶ 出力結果([C:\Temp]内に複数のtxtファイル、[C:\Logs]内に複数のlogファイル)
TextFile : sample01.txt
LogFile : sample.log
NextFile : sample02.log
複数のディレクトリや拡張子を扱いたい場合は、ループを完全に終えてから次のDirを使うようにしましょう。
Dir "" を実行することで、Dir関数の状態を明示的にリセットできます。
これにより、次の Dir() は空文字を返すようになります。
戻り値はファイル名のみ
Sub Sample()
Dim fname As String
fname = Dir("C:\Temp\sample.txt")
Debug.Print fname
End Sub
▶ 出力結果
sample.txt
フルパスが必要な場合は、自分で結合します。
Sub Sample()
Dim fullPath As String
fullPath = "C:\Temp\" & Dir("C:\Temp\sample.txt")
Debug.Print fullPath
End Sub
▶ 出力結果
C:\Temp\sample.txt
ファイルが存在しないと空文字が返る
Sub Sample()
Dim result As String
result = Dir("Z:\NotExist\file.txt")
If result = "" Then
Debug.Print "存在しません"
End If
End Sub
▶ 出力結果
存在しません
その他のVBA関数
【Excel VBA】VBAでよく使う関数一覧&基本の使い方
