Categories: VBA基礎

EXCEL VBA Dir関数(2)・ファイル操作・フォルダー・サブフォルダー操作(ファイル存在・ファイル一覧)

 

 

EXCEL VBA Dir関数(2)・ファイル操作・フォルダー・サブフォルダー操作(ファイル存在・ファイル一覧)

 

 

●はじめに

今回説明するのは、Dir関数の利用方法を説明いたします。以前、Dir関数の説明(下記リンク)を致しましたが、第2弾として追加でDir関数の利用方法を説明いたします。Dir関数は、ファイルの存在確認やファイル一覧を作成する時などに利用します。VBAでは、主にファイル操作を利用する時に使用します。それでは、Dir関数の利用方法をサンプルプログラムを交えて説明致します。

 

●【EXCEL VBA Dir関数の使い方】については、下記を参照して下さい】

●【Dir関数(Microsoft様)については、下記を参照して下さい】
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dir-function

 

 

●書式の説明

● Dir関数を利用するには、下記の通りに設定を行います。

Dir [ (pathname, [ attributes ] ) ]

・【Dir関数説明】

パーツ説明
pathnameファイル名を指定する文字列式です。ディレクトリまたはフォルダー、及びドライブを含める事が出来ます。 pathname が見つからない場合は、長さ 0 の文字列 ("") が返されます。(省略可能)
attributesファイル属性を指定する定数または数式 (合計によって指定) です。 省略した場合は、pathname に一致する、属性のないファイルが返されます。(省略可能) ※attributesの定数については、下記を参照。

・【attributesの定数説明】

定数説明
vbNormal標準ファイル。(既定値)
vbReadOnly1読み取り専用のファイル。
vbHidden2隠しファイル。
vbSystem4システム ファイル。 ※Macintosh では使用できません。
vbVolume8ボリューム ラベル。※Macintosh では使用できません。
vbDirectory16フォルダー。
vbAlias64エイリアスファイルです。※ Macintosh でのみ使用できます。

 

 

【使用例①】:CドライブのTESTフォルダー内のExcel.xlsxファイルの存在を確認します。

 

'
'
Sub Dir00A()

     Dim Hen As String '変数を設定
     
     Hen = Dir("C:\TEST\Excel.xlsx") 'CドライブのTESTフォルダー内のExcel.xlsxファイルの存在を確認します。
     
     MsgBox Hen 'ファイルの存在結果をメッセージボックスに表示します。

End Sub
'

【実行後】

ファイルが有る場合は、Hen=「Excel.xlsx」がファイル名が変数に入ります。

×ファイルが無い場合は、Hen=「””」が何も入りません。

【使用例②】:CドライブのTESTフォルダー内のファイルをの確認します。

'
'
Sub Dir00B()

    Dim Hen, Files As String  '変数を設定

    Hen = Dir("C:\TEST\*.xlsx")  'CドライブのTESTフォルダー内の拡張子xlsxのファイルの存在を確認します。1件目

    Do While Hen <> ""  'フォルダー内のファイルが無くなるまで繰り返します。
        Files = Files & Hen & vbLf  'フォルダー内のファイルを加算します。
        Hen = Dir()  'ファイルの2件目以降のファイルの存在を確認します。
    Loop
    
    MsgBox Files  'フォルダー内の拡張子(xlsx)ファイル名を表示します。

End Sub
’

 

【実行後】
●フォルダー内の拡張子(xlsx)のファイル一覧がメッセージボックスに表示されました。

 

 

 

EXCEL VBA Dir関数 指定したフォルダー内のファイル数をカウントする。

 

 

●プログラム説明 (サンプル①)

下記のサンプルプログラムは、指定したフォルダー内(C:\Windows)のファイル数をカウントするサンプルプログラムです。
※指定したフォルダーのファイル数をカウントします。フォルダー数はカウントします。

【プログラムの流れ】
① ファイルの数をカウント0にする。
② ファイルをカウントするフォルダー(C:\Windows)を指定・1件目のファイルを読み込む ※(ファイルの種類全て)
③ フォルダー内のファイルが無くなるまで繰り返す。
④ ファイル数をカウントする。
⑤ フォルダー内の次のファイルをカウントする。
⑥ 読み込むファイルが無くなるまで繰り返す③へ
⑦ 全てのファイルをカウントが終わったらメッセージボックスにファイル数を表示します。

 

 

'
'
Sub Dir01()  '指定したフォルダー内ファイル数をカウントします。
    
    Dim CountF As Long
    Dim Files As String
    
    CountF = 0  'カウント0:初期設定
    
    Files = Dir("C:\Windows\*.*")  'ファイル数をカウントするフォルダーの指定
    
    Do While Files <> ""  'フォルダー内のファイルが無くなるまで繰り返す。
        
        CountF = CountF + 1  'ファイル数をカウントする。
        Files = Dir()  '次のファイルを読み込みます。
          '(ファイルが有れば、Files=ファイル名・ファイルが無ければ””:Files=無し)
    
    Loop
    
    MsgBox "ファイルは" & CountF & "個有りました。"  '最後にファイル数を表示します。

End Sub
'

 

 

●実行前~実行後 ※プログラム実行後、指定したフォルダー内(C:¥Windowsフォルダー)のファイル数がメッセージボックスに表示されました。
(画面クリックして拡大)

 

 

 

 

EXCEL VBA Dir関数 指定したフォルダー内のファイル一覧をシートに表示する。(ファイル名・ファイル容量・更新日時)

 

 

●プログラム説明 (サンプル②)

下記のサンプルプログラムは、指定したフォルダー内のファイル名・ファイル容量・ファイルの更新日時をEXCELシートに一覧表示させるサンプルプログラムです。

 

【プログラムの流れ】
① アクティブワークシートのクリアー(文字列削除)
② シートの1行名に表題を作成します。(A1:No・B1:ファイル名・C1:ファイル容量・D1:更新日時)
③ 初期設定:2行目からファイル一覧を表示するように指定
④ 指定したフォルダー内のファイルが無くなるまで繰り返す。
⑤ A列に番号・B列にファイル名・C列にファイル容量・D列にファイル更新日時を表示する。
⑥ ファイル数をカウントする。+1
⑦ 次のファイルを読み込みます。
⑧ フォルダー内の全てのファイルを読み込むまで繰り返します。④へ

 

 

'
'
Sub Dir02() '指定したフォルダー内のファイル一覧をシートに表示する。(ファイル名・ファイル容量・更新日時)
    
    Dim CountF As Long
    Dim Files As String
    
    With ActiveSheet
        .Cells.ClearContents 'ワークシートのクリアー(文字列削除)
        .Cells(1, "A") = "No"
        .Cells(1, "B") = "ファイル名"
        .Cells(1, "C") = "ファイル容量"
        .Cells(1, "D") = "更新日時"
     
    CountF = 2   ':初期設定 2行目
    
    Files = Dir("C:\TEST\*.xls?")  'ファイル数をカウントするフォルダーの指定
    
    Do While Files <> ""  'ファイルが無くなるまで繰り返す。
       
        .Cells(CountF, "A") = CountF - 1  '番号
        .Cells(CountF, "B") = Files  'ファイル名
        .Cells(CountF, "C") = FileLen("C:\TEST\" & Files)  'ファイルの容量
        .Cells(CountF, "D") = FileDateTime("C:\TEST\" & Files) 'ファイルの更新日時
        
        CountF = CountF + 1  'ファイル数をカウントする。
        
        Files = Dir()  '次のファイルを読み込みます。
          '(ファイルが有れば、Files=ファイル名・ファイルが無ければ””:Files=無し)
    Loop

    End With

End Sub
'

 

●実行前~実行後 ※プログラム実行後、指定したフォルダー内(C:\TEST)のファイル名・ファイル容量・更新日時がEXCELシートに一覧表示されました。
(画面クリックして拡大)

 

 

 

EXCEL VBA Dir関数 サブフォルダーを含めて全てのファイル一覧を出力する。※再帰呼び出し

 

 

●プログラム説明 (サンプル③)

下記のサンプルプログラムは、指定したフォルダー内のサブフォルダーを含めて全てのファイル名・ファイル容量・ファイルの更新日時をEXCELシートに一覧表示させるサンプルプログラムです。


【プログラム実行の注意点】
・今回のプログラムは、再帰呼び出しを使い自身のプログラムを何度も繰り返し呼び出す事で、サブフォルダーを含めて全てのファイルを効率よく処理する事が出来ます。

 

【プログラムの流れ】
① アクティブシート(ファイル一覧作成)のクリアーします。
② 1行目に表題を作成(パス・ファイル名・ファイル更新(KB)・更新日時)
③ ファイルを検索するフォルダーを指定(C:\TEST)して【Dir05】を実行します。
④ 指定したフォルダー内の最初のファイルを読み込みます。
⑤ アクティブシートB列の最終行+1を取得します。 ※次のファイルの記述位置を把握します。
⑥ A列にファイルパスを転記します。
⑦ 現在のフォルダー内のファイルを全て読み込むまで繰り返します。※読み込むファイルが無い場合は、⑫へ
⑧ B列にファイル名を転記します。
⑨ C列にファイル容量を転記します。
⑩ D列にファイルの更新日時を転記します。
⑪ 次のファイルを読み込みます。
⑫ 次のフォルダーを指定して、再帰呼び出しで④へ
⑬ 全てのファイル・フォルダーを読み込みましたら終了です。
※ 複数のフォルダーや階層深くのフォルダー・ファイルも再帰呼び出しを利用する事で全てのフォルダー・ファイルを読み込む事が可能になります。

 

 

 

'
'
'
Sub Dir04() 'サブフォルダーを含めて全てのファイル一覧を出力する。※再帰呼び出し(こちらを実行する)

    With ActiveSheet
    
        .Cells.ClearContents
        .Cells(1, "A") = "パス"
        .Cells(1, "B") = "ファイル名"
        .Cells(1, "C") = "ファイル容量(KB)"
        .Cells(1, "D") = "更新日時"
    
    End With
    
    Call Dir05("C:\TEST") 'フォルダーを指定する。

End Sub
'

'---------------------------------------------------------------------------------------------

Sub Dir05(FilePath As String)
    
    Dim Files As String
    Dim Folder As Object
    Dim countf As Long
    
    Files = Dir(FilePath & "\*.*")  '指定したフォルダー内の最初のファイルを取得します。
    
    With ActiveSheet
        countf = .Cells(Rows.Count, "B").End(xlUp).Row + 1  'B列の最終行+1を取得する。
    
        .Cells(countf, "A") = FilePath  'A列にファイルパスを表示します。
        
        Do While Files <> ""  '現在のフォルダー内のファイルを全て読み込むまで繰り返します。
                     
                    .Cells(countf, "B") = Files  'ファイル名
                    .Cells(countf, "C") = FileLen(FilePath & "\" & Files)  'ファイルの容量
                    .Cells(countf, "D") = FileDateTime(FilePath & "\" & Files) 'ファイルの更新日時
                    countf = countf + 1 '転記先の行数を加算する+1
                
            Files = Dir()  '次のファイルを読み込む
        Loop
    
        With CreateObject("Scripting.FileSystemObject")
            For Each Folder In .GetFolder(FilePath).SubFolders  'サブフォルダが無くなるまで繰り返す。
                Call Dir05(Folder.Path)  '次のフォルダーを指定して、再帰呼び出し(Dir05)同プログラムを実行
            Next Folder
        End With
        
    End With
    
End Sub
'
'

 

 

 

●実行前~実行後 ※プログラム実行後、指定したフォルダー(C:¥TEST)内のフォルダー・ファイル名・ファイル容量・更新日時の全てがEXCELシートに一覧表示されました。
(画面クリックして拡大)

 

 

 

最後まで、ご覧いただきまして誠に有難うございました。
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。

 

AKIRA