エクセルVBAで使うコードの備忘録。VBAで指定フォルダ内のファイル数をサブフォルダ内も含めて取得するコード。サブフォルダ一覧を取得する関数と指定フォルダ内のファイル数(サブフォルダ除く)を組み合わせて実現しています。サブフォルダを含めない場合についてはこちらをご覧ください。
サンプルコード
下記に指定フォルダ内の全ファイル数を取得するコードのサンプルを記載します。コードは3つの部分からなるので下記では分けて記載しています。使用する際はすべてをコピーしてください。
ファイル数をカウント際の手順としては、まず指定したフォルダに含まれるサブフォルダ一覧を取得します。その後、すべてのサブフォルダに対して含まれるファイル数を順次カウントしていき、その値を足し上げてすべてのファイル数を求めるという感じになっています。
なお、サンプルコードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。
サブフォルダ内も含め含まれるすべてのファイル数をカウントする
フォルダパスを指定して、まずサブフォルダ一覧を取得します(取得関数は後述のサンプルコードを参照)。サブフォルダ一覧が取得できたら後はそれぞれのフォルダに対して含まれているファイル数を順次取得して足し上げていきます(ファイル数を取得する関数は後述)。
Public Sub CountAllFiles()
'--- 含まれるフォルダ数を知りたいフォルダのパス ---'
Dim folderPath As String
folderPath = "[フォルダパス]"
'--- サブフォルダパス一覧を格納する変数 ---'
Dim subFolders() As String
subFolders = GetFolderPath(folderPath)
'--- ファイルシステムオブジェクト ---'
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
'--- ファイル数を格納する変数 ---'
Dim n As Long
n = fso.GetFolder(folderPath).Files.Count
'--- サブフォルダ内のファイル数を加算 ---'
Dim tmp As Variant
For Each tmp In subFolders
n = n + fso.GetFolder(tmp).Files.Count
Next tmp
End Sub
指定フォルダ内のサブフォルダパス一覧を返す関数
下記は、引数として指定したフォルダのサブフォルダ一覧を返す関数です。再帰的に同じ関数を呼び出して最下層までサブフォルダを探しに行きます。関数の詳細についての説明を知りたい場合はこちらをご覧ください。
'--- サブフォルダを再帰的に取得する関数 ---'
Public Function GetFolderPath(folderPath As String) As String()
'--- ファイルシステムオブジェクト ---'
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
'--- フォルダ数を格納する変数 ---'
Dim n As Variant
n = fso.GetFolder(folderPath).subFolders.Count
If (0 < n) Then
'--- フォルダパスを格納する配列 ---'
Dim str() As String
ReDim str(1 To n)
'--- フォルダパスを格納 ---'
Dim i As Long
Dim j As Long
Dim m As Long
i = 1
Dim strTmp() As String
'フォルダパスを指定してすべてのサブフォルダを取得
Dim f As Object
For Each f In fso.GetFolder(folderPath).subFolders
str(i) = f.Path
strTmp = GetFolderPath(str(i)) '再帰的呼び出し
If (Not IsEmptyArray(strTmp)) Then
m = UBound(strTmp, 1)
Else
m = 0
End If
'サブフォルダ内にさらにフォルダがあればその分だけ配列を拡張
n = UBound(str, 1)
ReDim Preserve str(1 To n + m)
For j = 1 To m
str(i + j) = strTmp(j)
Next j
i = i + m + 1
Next f
End If
GetFolderPath = str
End Function
'--- 配列が空かどうかを判定する関数 ---'
Public Function IsEmptyArray(arrayTmp As Variant) As Boolean
On Error GoTo ERROR_
If (0 < UBound(arrayTmp, 1)) Then
IsEmptyArray = False
End If
Exit Function
ERROR_:
IsEmptyArray = True
End Function
指定フォルダのファイル数を返す関数(サブフォルダ内を除く)
引数として指定したフォルダに含まれるファイル数を返す関数です。ファイルシステムオブジェクトを使って含まれるファイル数を取得しています(ファイルシステムオブジェクトを使わない方法についてはこちらをご覧ください)。
Public Function GetFileCountFso(folderPath As String) As Long
'--- ファイルシステムオブジェクト ---'
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
'--- ファイル数を取得 ---'
GetFileCountFso = fso.GetFolder(folderPath).Files.Count
End Function