【VBA】フォルダ内のファイル数を取得する(サブフォルダ内を含む)

エクセル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