エクセルVBAで使うコードの備忘録。VBAで指定フォルダ内のファイル数を取得するコード。Dir関数を使ってフォルダ内のファイルを数える方法と、ファイルシステムオブジェクトを使ってダイレクトに取得する方法を紹介します。サブフォルダ内も含めてすべてのファイル数を取得する場合についてはこちらをご覧ください。
Dir関数を使ってファイル数を数える
Dir関数は指定したファイルが存在するかどうかを判定する関数です。ファイルが存在した場合はそのファイル名を返し、存在しない場合は空文字列を返します。これだけ聞くと、フォルダ内に存在するすべてのファイルの名前を知らないと、Dir関数でファイル数を数えるのは無理なように聞こえますが、実はDir関数はワイルドカードを指定することができます。ファイル名として「*」を指定すれば、すべての拡張子のファイルを取得してくれます。ちなみに、拡張子が.xlsxのファイルだけを数えたい場合には、ファイル名として「*.xlsx」を指定してやればOKです。
Dir関数を使う上でのもう一つの注意点は、Dir関数を引数なしで使用すると「直前に指定したファイル名かつまだ検索にかかっていないファイル」の名前が返されます。下記のサンプルコードではこの性質を利用して、フォルダ内のすべてのファイルを数えています。
なお、サンプルコードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。
サンプルコード
Public Sub GetFileCount()
'--- ファイル数を知りたいフォルダのパス ---'
Dim folderPath As String
folderPath = "[フォルダのパス]"
'--- ファイル名(ワイルドカードを使用) ---'
Dim fileName As String
fileName = "*"
'--- ファイル数を格納する変数 ---'
Dim i As Long
i = 0
'--- Dir関数の戻り値を格納する変数 ---'
Dim tmp As String
'--- ファイル数をカウント
tmp = Dir(folderPath & "\" & fileName)
Do While tmp <> ""
i = i + 1
tmp = Dir()
Loop
End Sub
ファイルシステムオブジェクトを使う
Dir関数を使うよりもスマートな方法は、ファイルシステムオブジェクトを使う方法です。ファイルシステムオブジェクトを使えば、指定したフォルダの情報を格納するフォルダオブジェクトが取得できるので、フォルダオブジェクトに含まれるファイルオブジェクトの要素数をCountプロパティで取得してやることでファイル数を取得することが可能です。
なお、特定の拡張子を持つファイルの数を数えるには、下記のサンプルコードのようにフォルダ内にあるすべてのファイルを一度取得したうえで、それぞれのファイルに対して拡張子を判定してファイル数を数えてやる必要があります(詳細はこちらをご覧ください)。
こちらも、サンプルコードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。
サンプルコード
Public Sub GetFileCountFso()
'--- ファイル数を知りたいフォルダのパス ---'
Dim folderPath As String
folderPath = "[フォルダのパス]"
'--- ファイルシステムオブジェクト ---'
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
'--- ファイル数を格納する変数 ---'
Dim i As Long
i = fso.GetFolder(folderPath).Files.Count
End Sub