VB6・VBA関数メモ:Dir関数

Dir関数についてメモしておきます。

この関数はフォルダ内のフォルダやファイルの名前を取得する際に使用します。

指定パスが存在しない場合には空白文字を返します。
これを利用してファイルの存在有無のチェックにも利用することもできます。
(寧ろこちらの方が多く使うかも)

第一引数にはワイルドカード(*や?)による絞り込みが可能です。
また第二引数を指定することで属性による絞り込みも可能です。

Dir関数を使用中に、他の処理でDir関数を同時に使用することはできないので注意です。


概要

Dir([PathName], [Attributes As VbFileAttribute = vbNormal]) As String
機能 フォルダ内のフォルダやファイルの名前を取得
引数 PathName フォルダやファイルのパス
(省略時は次のファイル・フォルダを取得)
Variant型
Attributes 絞り込む属性
Orで複数指定可能
(省略時はvbNormal)
VbFileAttribute列挙型
戻り値 フォルダやファイルの名前
対象がない場合は""(空白文字)
String型


VbFileAttribute列挙型

定数名 説明
vbNormal 0 標準ファイルを取得
vbReadOnly 1 読み込み専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システムファイル (Macintosh不可)
vbVolume 8 ボリュームラベル (この値は他の属性と同時に使用できない) (Macintosh不可)
vbDirectory 16 フォルダ
vbAlias 64 エイリアス ファイル (Macintoshのみ)


使用例

説明 記述例 出力
以下の例では、右のようなフォルダ構造になっているとします。
E¥:
 Dir¥
  SubDir1¥
   File11.txt
   File12.txt
  SubDir2¥
   File21.txt
   File22.txt
  File1.txt
  File2.txt	(読み取り専用)
  File3.txt	(隠しファイル)
  Excel.xls
  Image.bmp
フォルダ内の標準ファイルの名前を取得
Dim fileName As String

'先頭の要素を取得
fileName = Dir("E:¥Dir¥")

'要素が取得できる限りループ
Do While fileName <> ""

    Debug.Print fileName
    
    '次の要素を取得
    fileName = Dir
Loop
Excel.xls
File1.txt
File2.txt
Image.bmp
フォルダ内の標準ファイルとフォルダの名前を取得
※自フォルダ(.)と親フォルダ(..)の相対パスも取得します
Dim fileName As String

'先頭の要素を取得
fileName = Dir("E:¥Dir¥", vbDirectory)

'要素が取得できる限りループ
Do While fileName <> ""

    Debug.Print fileName
    
    '次の要素を取得
    fileName = Dir
Loop
.
..
Excel.xls
File1.txt
File2.txt
Image.bmp
SubDir1
SubDir2
フォルダ内の標準ファイルと読み取り専用ファイルと隠しファイルの名前を取得
Dim fileName As String

'先頭の要素を取得
fileName = Dir("E:¥Dir¥", vbReadOnly Or vbHidden)

'要素が取得できる限りループ
Do While fileName <> ""

    Debug.Print fileName
    
    '次の要素を取得
    fileName = Dir
Loop
Excel.xls
File1.txt
File2.txt
File3.txt
Image.bmp
フォルダ内のテキストファイルの名前のみを取得
Dim fileName As String

'先頭の要素を取得
fileName = Dir("E:¥Dir¥*.txt")

'要素が取得できる限りループ
Do While fileName <> ""

    Debug.Print fileName
    
    '次の要素を取得
    fileName = Dir
Loop
File1.txt
File2.txt
フォルダ内の任意の文字を含むファイルの名前のみを取得
Dim fileName As String

'先頭の要素を取得
fileName = Dir("E:¥Dir¥File?.txt")

'要素が取得できる限りループ
Do While fileName <> ""

    Debug.Print fileName
    
    '次の要素を取得
    fileName = Dir
Loop
File1.txt
File2.txt
ファイルの有無をチェック
If Dir("E:¥Dir¥File1.txt") <> "" Then
    Debug.Print "ファイルが存在します"
Else
    Debug.Print "ファイルが存在しません"
End If
ファイルが存在します
If Dir("E:¥Dir¥NoExists.txt") <> "" Then
    Debug.Print "ファイルが存在します"
Else
    Debug.Print "ファイルが存在しません"
End If
ファイルが存在しません
フォルダの有無をチェック
If Dir("E:¥Dir", vbDirectory) <> "" Then
    Debug.Print "フォルダが存在します"
Else
    Debug.Print "フォルダが存在しません"
End If
フォルダが存在します
If Dir("E:¥NoExistsDir", vbDirectory) <> "" Then
    Debug.Print "フォルダが存在します"
Else
    Debug.Print "フォルダが存在しません"
End If
フォルダが存在しません


動作検証

説明 記述例 出力
最初から引数なしで
実行するとエラー
On Error Resume Next

Dim fileName As String
fileName = Dir

'エラー時は出力
If Err > 0 Then Debug.Print Error
プロシージャの呼び出し、または引数が不正です。
Dir関数を使用中に、他の処理でDir関数を使用してはいけない
On Error Resume Next

Dim dirPath   As String
Dim dirPath2  As String
Dim fileName  As String
Dim fileName2 As String

'先頭の要素を取得
dirPath = "E:¥Dir¥"
fileName = Dir(dirPath, vbDirectory)

'要素が取得できる限りループ
Do While fileName <> ""
    '自フォルダ、親フォルダは無視
    If fileName = "." Or fileName = ".." Then
        GoTo NEXT_LOOP
    End If

    'フォルダの場合
    If (GetAttr(dirPath & fileName) _
         And vbDirectory) = vbDirectory Then
    
        dirPath2 = dirPath & fileName & "¥"
        fileName2 = Dir(dirPath2)
        Do While fileName2 <> ""
            Debug.Print fileName2

            fileName2 = Dir
        Loop
        
    End If
    
NEXT_LOOP:

    fileName = Dir  '←ここで取得ができない
    
    'エラー時は出力
    If Err > 0 Then
    	Debug.Print Error
    	Exit Do
    End If
Loop
File11.txt
File12.txt
プロシージャの呼び出し、または引数が不正です。


コメント
コメントする








    
この記事のトラックバックURL
トラックバック