サイトについて      連絡先   検索

VBA Dir 関数

はじめに

Excel VBA マクロの Dir 関数を紹介します。

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

ファイルやフォルダの存在確認などに使用します。

  • 目次
    • 構文
    • 解説
    • 使用例

構文

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

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

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

引数「属性」

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

解説

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

パターンについて

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

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

引数「パターン」が相対パスならカレントディレクトリを基準にします。

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

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

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

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

ワイルドカードやフォルダのパスを指定した後に、引数をすべて省略して Dir 関数を呼び出すたびに、その次のファイルを取得できます。取得する順番に決まりはありませんが、昇順になっています。

属性について

引数「属性」を省略すると「標準ファイル」が条件になります。

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

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

「読み取り専用ファイル」だけ返したいということはできません。必ず「標準ファイル」や指定した属性が 1 つでも含まれるものが取得されます。

「GetAttr 関数」を使用して、そのファイルやフォルダの属性を調べられます。

その他

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

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

引数「パターン」に空文字"""."などの文字を指定すると、エクセルの「既定のローカルファイルの保存場所」のパスを指定したことになります。これは意図した結果ではないため使用しない方がいいです。

引数「パターン」に空白" "を指定すると「エラー 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 + 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
  • 目次
    • 構文
    • 解説
    • 使用例