■ 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) |
