VBA Dir 関数:ファイルやフォルダの一覧を取得する

はじめに

Excel VBA マクロの Dir 関数からファイルやフォルダの一覧を取得する方法を紹介します。

Dir 関数は、指定したパターンに一致するファイルやフォルダの名前を返します。

Dir("D:\t*.txt") なら、t から始まるファイルで拡張子が .txt のファイルを返します。

Dir("D:\", vbDirectory) なら、D ドライブ直下のフォルダを返します。

ファイルやフォルダの存在確認や一覧を取得できます。

Dir 関数は使用しない

Dir 関数より高機能な「FileSystemObject」があります。「ファイルの存在確認」や「ファイルの一覧を取得」など、すべてのファイル操作ができます。

Dir 関数は不便なことが多くあるので使用しません。

  • 目次
    • Dir 関数
    • 解説
    • 使用例

Dir 関数

Dir(パターン, 属性)
パターン属性が一致する最初のファイルやフォルダの名前を取得します。

Dir()
Dir(パターン, 属性) の結果が複数のファイルやフォルダと一致するとき、次の名前を取得します。

引数「パターン」省略できます。ファイルやフォルダのパスを指定します。
ワイルドカードを指定できます。
引数「属性」省略できます。取得するファイルの属性を組み合わせて指定します。
戻り値の型文字列型 (String)

引数「属性」

名前 属性
vbNormal (既定)0標準ファイル
vbReadOnly1読み取り専用ファイル
vbHidden2隠しファイル
vbSystem4システム ファイル
vbVolume8ボリューム ラベル。この値を指定すると、すべての属性は無効になります。
vbDirectory16フォルダ

解説

Dir 関数より高機能な「FileSystemObject」があるので、通常はそちらを使用します。

引数「パターン」にフルパスを指定したときは、その存在確認ができます。ワイルドカードやフォルダのパスを指定したときは、そのファイルやフォルダの一覧を取得できます。

パターンについて

引数「パターン」に指定したパスは標準ファイルを検索します。フォルダを検索するには引数「属性」に vbDirectory を指定する必要があります。

引数「パターン」に一致するファイルが見つかったときは ファイル名.拡張子 の形式で返します。拡張子が存在しないファイルの時は ファイル名 を返します。

引数「パターン」が相対パスならカレントディレクトリを基準にします。カレントディレクトリは変化するので、相対パスでは指定しません。

引数「パターン」に使用できるワイルドカードには次のものがあります。

パターン 説明 使用例 一致例
*任意の長さの文字 (0 文字以上)あ*あ, あい, あいう
?任意の1文字 または 0 文字あ?あい, あか, あき

ワイルドカードを使用して複数のファイルが一致するときは、最初のファイルを返します。

指定したフォルダにあるファイル一覧を取得するには D:\Tips\ のように、パスの最後に \ マークを付けます。その直下の最初のファイルを返します。引数「属性」に vbDirectory を指定すると最初のフォルダを返します。

ワイルドカードやフォルダのパスを指定したときに一覧の次のファイルを取得するには、引数を省略して Dir() で呼び出します。呼び出すたびに次のファイルを取得できます。取得する順番はファイル名の昇順になっています。エクスプローラーの昇順とは異なります。

属性について

引数「属性」を省略するか vbNormal なら「標準ファイル」が条件になります。標準ファイルとはフォルダ以外のファイルのことです。読み取り専用や隠しファイルなど、他の属性が設定されているファイルは対象外です。

引数「属性」が vbDirectory なら「フォルダ」と「標準ファイル」が条件になります。

引数「属性」が vbReadOnly なら「読み取り専用ファイル」と「標準ファイル」が条件になります。

引数「属性」を組み合わせるには Or 演算子を使用します。 vbReadOnly Or vbHidden なら「読み取り専用ファイル」または「隠しファイル」と「標準ファイル」が条件になります。

常に「標準ファイル」が対象になるので「フォルダ」だけ返すようなことはできません。

「標準ファイル」と同様に常に「読み取り専用ファイル」も対象になっている気がします。

「GetAttr 関数」を使用して、そのファイルやフォルダの属性を判定できます。

その他

ファイルが見つからないときは、空文字 "" を返します。

引数を省略してファイル一覧をすべて取得した後は、空文字 "" を返します。

引数「パターン」に空文字 """." などの文字を指定すると、カレントディレクトリのパスを指定したことになります。これは意図した結果ではないため使用しない方がいいです。カレントディレクトリの既定値は、Excel のオプションから保存の「既定のローカルファイルの保存場所」です。

引数「パターン」に空白 " " を指定すると「エラー 53 ファイルが見つかりません。」になります。

使用例

ファイルを存在確認する。

Dim s As String
s = Dir("D:\test.txt") ' 存在する
Debug.Print(s) ' test.txt

s = Dir("D:\test")     ' 存在しない
Debug.Print(s) ' ""

s = Dir("test.txt")    ' 相対パスに存在する、カレントディレクトリを基準にする
Debug.Print(s) ' test.txt

フォルダを存在確認する。標準ファイルも含まれます。

Dim s As String
s = Dir("D:\Tips", vbDirectory)  ' 存在する
Debug.Print(s) ' Tips

s = Dir("D:\Tips2", vbDirectory) ' 存在しない
Debug.Print(s) ' ""

指定した属性のファイルを取得する。常に標準ファイルも含まれます。

Dim filePath As String
filePath = "D:\test.txt"

Dim s As String

' test.txt が標準ファイルまたは読み取り専用のとき
s = Dir(filePath, vbReadOnly)
Debug.Print(s) ' test.txt

' test.txt が標準ファイルまたは読み取り専用または隠しファイルのとき
s = Dir(filePath, vbReadOnly Or vbHidden)
Debug.Print(s) ' test.txt

Dim b As Boolean

' 読み取り専用かチェック
s = Dir(filePath, vbReadOnly)
If s <> "" Then
    b = (GetAttr(filePath) And vbReadOnly) <> 0
End If
Debug.Print(b) ' True: 読み取り専用、False: その他

' 隠しファイルかチェック
s = Dir(filePath, vbHidden)
If s <> "" Then
    b = (GetAttr(filePath) And vbHidden) <> 0
End If
Debug.Print(b) ' True: 隠しファイル、False: その他

ファイルやフォルダの一覧を取得する。

Dim s As String

' t から始まるファイルで拡張子が .txt のファイル
s = Dir("D:\t*.txt")
Do While s <> ""
    Debug.Print(s)
    s = Dir ' 次のファイル名を取得
Loop

' t のみまたは t で始まる二文字のファイルで拡張子が .txt のファイル
s = Dir("D:\t?.txt")
Do While s <> ""
    Debug.Print(s)
    s = Dir ' 次のファイル名を取得
Loop

' D ドライブ直下のファイル一覧を出力
s = Dir("D:\")
Do While s <> ""
    Debug.Print(s)
    s = Dir ' 次のファイル名を取得
Loop

' D ドライブ直下のフォルダ一覧を出力、標準ファイルも含まれる
s = Dir("D:\", vbDirectory)
Do While s <> ""
    Debug.Print(s)
    s = Dir ' 次のフォルダ名を取得
Loop