VBA ファイルやフォルダの確認、ファイル一覧の取得(Dir関数)

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

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

複数の属性を組み合わせることもできます:

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

■ 注意点

  1. Dirは状態を保持する関数
    • Dirで取得を開始すると、VBAはその状態を記憶し、次のDir()で続きから取得します。
    • 別のDir(path)を呼ぶと状態がリセットされる。
  2. ネットワーク・クラウドパスでは動作が不安定な場合あり
    • OneDriveやSharePoint上のファイルは反応しないことがあります。
  3. フォルダパスの末尾の\忘れに注意
    • パス連結時のエラー防止のため、 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)
タイトルとURLをコピーしました