VBAで指定したフォルダ内のファイル数を取得する方法についてご説明します。
外部のファイルを取得して集計する際などに、いくつファイルがあるか取得したい時があります。
フォルダ内のファイル数を取得する方法は大きく分けて2つあります。
「Dir関数」を使用する方法と、「FileSystemObject(ファイルシステムオブジェクト)」を使用する方法です。
それぞれの特徴を踏まえつつ、サンプルコードを使って説明したいと思います。
その他のフォルダやファイルの操作については下記記事をご覧ください。
- FileSystemObjectでファイルをコピー
- FileSystemObjectでフォルダをコピー
- FileSystemObjectでファイルを移動
- FileSystemObjectでフォルダを移動
- FileSystemObjectでファイルを削除
- FileSystemObjectでフォルダを削除
1.Dir関数を使用してファイル数を取得する方法
まずは「Dir関数」を使用する方法です。
ファイルを扱う際によく出てくる関数です。
Dir関数とは
指定したファイルまたはフォルダの名前を返えす関数です。
「*」といったワイルドカードを使用する事が出来ます。
構文は次のように記述します。
Dir[(PathName[,Attributes])]
「PathName」は省略可能で、ファイル名やフォルダ名を表す文字列を指定します。
引数「Attributes」も省略で、取得するファイルの属性を表す数式もしくは定数を指定します。
指定したファイルが存在した場合はそのファイル名を返し、存在しない場合は空文字列を返します。
引数「Attributes」を省略した場合、直前に指定したファイル名且つ、検索にかかっていないファイル名が返されます。
このDir関数を使ってファイル数を取得する訳ですが、フォルダ名やファイル名を省略でき、ワイルドカードを使用できるという特徴を利用してファイル数を取得します。
ファイル名を「*」と指定するとすべてのファイルを取得し、「*.xlsx」と指定すると拡張子がxlsxのファイルを取得できるようになります。
これだけではイマイチイメージ出来ないのでサンプルコードで説明したいと思います。
Dir関数でファイル数を取得するコード
次のような「Test01~04」というファイル名のExcelファイルと、「マクロ01~02」というマクロのファイルと「メモ帳01~02」というテキストファイルをCドライブに用意しました。
このフォルダ内のファイル数を取得したいと思います。
すべてのファイル数を取得する
すべてのファイルの数を取得するにはファイル名を「*」とワイルドカードのみで指定する事で取得出来ます。
Sub Sample1()
Dim FolderPath As String
Dim FileName As String
Dim FileInt As Long
Dim SetPath As String
FolderPath = "C:\Sample" 'フォルダのパスを指定する
FileName = "*" 'ファイル名をワイルドカードのみで指定する
FileInt = 0 'ファイル数を一度0にする
'指定したフォルダパスとファイル名をセットする
SetPath = Dir(FolderPath & "\" & FileName)
Do While SetPath <> "" 'ファイル名が取得出来なくなるまでループ
FileInt = FileInt + 1
SetPath = Dir()
Loop
MsgBox FileInt
End Sub
簡単にコードの説明です。
「FolderPath = “C:\Sample”」でファイル数を取得したいフォルダのパスを指定します。
「FileName = “*”」でファイル名をワイルドカードのみで指定することですべてのファイルを対象に、ファイル数を取得します。
「FileInt = 0」はフォルダ内をループしてファイル数をカウントアップするための変数として用意しました。
「SetPath = Dir(FolderPath & “\” & FileName)」で指定したフォルダパスとファイル名を結合してフルパスにします。
「Do While SetPath <> “”」でファイル名を取得出来なくなるまでループします。
拡張子を指定してファイル数を取得する
拡張子を指定する事で指定したファイルのファイル数を取得する事も可能です。
Sub Sample2()
Dim FolderPath As String
Dim FileName As String
Dim FileInt As Long
Dim SetPath As String
FolderPath = "C:\Sample" 'フォルダのパスを指定する
FileName = "*.xlsx" 'ファイル名をワイルドカードと拡張を指定する
FileInt = 0 'ファイル数を一度0にする
'指定したフォルダパスとファイル名をセットする
SetPath = Dir(FolderPath & "\" & FileName)
Do While SetPath <> "" 'ファイル名が取得出来なくなるまでループ
FileInt = FileInt + 1
SetPath = Dir()
Loop
MsgBox FileInt
End Sub
コードは「FileName = “*.xlsx”」の部分を「*」のみから「*.xlsx」へと変更しただけです。
これでXlsxという拡張子のExcelファイルのみを指定して取得する事が出来ました。
ファイル名の一部を指定して取得する
拡張だけではなくファイル名の前後にワイルドカードを指定する事で、ファイル名が部分一致したファイル数を取得も出来ます。
Sub Sample3()
Dim FolderPath As String
Dim FileName As String
Dim FileInt As Long
Dim SetPath As String
FolderPath = "C:\Sample" 'フォルダのパスを指定する
FileName = "Test*.xlsx" 'ファイル名をワイルドカードと拡張を指定する
FileInt = 0 'ファイル数を一度0にする
'指定したフォルダパスとファイル名をセットする
SetPath = Dir(FolderPath & "\" & FileName)
Do While SetPath <> "" 'ファイル名が取得出来なくなるまでループ
FileInt = FileInt + 1
SetPath = Dir()
Loop
MsgBox FileInt
End Sub
こちらも同様に「FileName = “Test*.xlsx”」の部分を変更しただけです。
ファイル名に「*」を付ける事で部分一致したファイルのファイル数を取得出来ました。
2.FileSystemObjectでファイル数を取得する
次は「FileSystemObject(ファイルシステムオブジェクト)」を使用する方法です。
「Dir関数」を使うよりもシンプルに取得が可能です。
コードが非常にシンプルになりますが、拡張子の指定やファイル名の部分一致等で取得する場合は、一工夫必要になります。
「FileSystemObject(ファイルシステムオブジェクト)」で条件を指定してファイル数を取得する方法については「FileSystemObjectでファイル数を取得する方法」別記事にてご紹介したいと思います。
FileSystemObjectとは
簡単にですが、「FileSystemObject」オブジェクトについてご説明します。
「FileSystemObject」オブジェクトは、ドライブ、フォルダ、ファイルなどを操作する事ができるオブジェクトです。
FileSystemObjectを使用するには「CreateObject」メソッドを使用して次のように記載します。
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
詳細については「FileSystemObjectでファイルをコピーする」をご覧下さい。
FileSystemObjectでファイル数を取得するコード
それでは「FileSystemObject」を使用したファイル数の取得のサンプルコードです。
先ほどのフォルダとファイルを使用して取得したいと思います。
すべてのファイル数を取得する
「FileSystemObject」では「Files.Count」で指定したフォルダ内のファイルの数を取得出来ます。
ループなども必要ないため、非常にシンプルなコードになります。
Sub Sample4()
Dim FolderPath As String
Dim FileInt As Long
Dim FSO As Object
'ファイルシステムオブジェクトをセットする
Set FSO = CreateObject("Scripting.FileSystemObject")
FolderPath = "C:\Sample" 'フォルダを指定する
FileInt = FSO.GetFolder(FolderPath).Files.Count '指定したフォルダ内のファイル数を取得する
MsgBox FileInt
End Sub
非常にシンプルなコードになりました。
「Set FSO = CreateObject(“Scripting.FileSystemObject”)」でFileSystemObjectを使用できるようにセットします。
「FolderPath = “C:\Sample”」でフォルダパスを指定します。
「Dir関数」と違いファイル名は指定しません。
「FileInt = FSO.GetFolder(FolderPath).Files.Count」で取得したフォルダのファイルを取得して、ファイル数をCountで取得します。
何も条件を考えなければこちらの方がシンプルで、可読性も高いコードです。