【VBAリファレンス】Excel VBAでサブフォルダ数を瞬時に特定する:FileSystemObjectによる効率的なファイルシステム操作術

スポンサーリンク

概要

Excel VBAを活用した業務自動化において、ファイル操作は避けて通れない領域です。特に、大量のデータが格納されたディレクトリ構造を解析する際、「特定のフォルダの中にいくつのサブフォルダが存在するのか」を正確にカウントする必要に迫られる場面は少なくありません。手作業でプロパティを確認するのは非効率的であり、ヒューマンエラーの温床となります。本稿では、VBAにおけるファイルシステム操作の標準的なライブラリである「Microsoft Scripting Runtime」のFileSystemObject(FSO)を活用し、サブフォルダの数を高速かつ正確に取得する手法を徹底解説します。

詳細解説:FileSystemObjectの構造を理解する

VBAでフォルダやファイルを扱う際、従来からある「Dir関数」を用いる手法は、シンプルですが再帰的な処理や複雑な属性判定には不向きです。対して、FileSystemObject(FSO)はオブジェクト指向の設計思想に基づいており、フォルダを一つのオブジェクトとして扱い、その配下に存在するサブフォルダを「SubFoldersコレクション」として保持しています。

このSubFoldersコレクションは、その名の通り、特定のフォルダ直下に存在するすべてのフォルダを格納した集合体です。このオブジェクトが持つ「Countプロパティ」にアクセスするだけで、面倒なループ処理を書くことなく、瞬時にサブフォルダの総数を取得することが可能です。

FSOを利用するメリットは主に3点あります。
1. 階層構造の探索が容易:オブジェクトのプロパティを辿るだけで、親フォルダから子、孫へとアクセスが可能です。
2. 型の明確化:フォルダとファイルを明示的に分けて扱えるため、意図しないファイルまでカウントしてしまうリスクを排除できます。
3. 高速な処理:OSレベルのインターフェースに近い動作をするため、数千個単位のフォルダが存在する場合でも、極めて高いパフォーマンスを発揮します。

ただし、注意点として「隠し属性」や「システム属性」を持つフォルダの扱いです。通常、SubFoldersコレクションはこれらを含めてカウントしますが、特定の業務要件によってはこれらを除外したい場合もあります。その際は、コレクションを一つずつイテレーション(繰り返し)し、Attributesプロパティを確認するロジックを追加する必要があります。

サンプルコード:サブフォルダ数を取得する実装

以下に、指定したフォルダ内のサブフォルダ数を取得するための標準的なコードを提示します。このコードを実行する前に、VBAエディタの「ツール」メニューから「参照設定」を開き、「Microsoft Scripting Runtime」にチェックを入れてください。これにより、インテリセンス(入力候補表示)が機能し、開発効率が飛躍的に向上します。


Option Explicit

' 指定したフォルダ内のサブフォルダ数を取得するプロシージャ
Sub GetSubFolderCount()
    Dim fso As FileSystemObject
    Dim targetFolder As Folder
    Dim folderPath As String
    
    ' 調査対象のフォルダパスを指定
    folderPath = "C:\Your\Target\Path"
    
    ' FSOオブジェクトの生成
    Set fso = New FileSystemObject
    
    ' パスの存在確認
    If Not fso.FolderExists(folderPath) Then
        MsgBox "指定されたフォルダは存在しません。", vbCritical
        Exit Sub
    End If
    
    ' フォルダオブジェクトを取得
    Set targetFolder = fso.GetFolder(folderPath)
    
    ' SubFoldersコレクションのCountプロパティで数を取得
    MsgBox "フォルダ [" & targetFolder.Name & "] 内のサブフォルダ数は " & _
           targetFolder.SubFolders.Count & " 個です。", vbInformation
           
    ' オブジェクトの解放
    Set targetFolder = Nothing
    Set fso = Nothing
End Sub

このコードのポイントは、`targetFolder.SubFolders.Count`の一行に集約されています。複雑なループを回す必要がないため、コードの可読性が非常に高く、メンテナンスも容易です。

実務アドバイス:大規模環境での最適化

実務でこの技術を応用する際、直面しがちなのが「階層が深い場合」や「アクセス権限がないフォルダ」への対応です。

まず、再帰的な探索が必要な場合、単純なCountプロパティだけでは不十分です。サブフォルダの下にある「孫フォルダ」まで含めてカウントするには、再帰処理(Recursive)を実装する必要があります。再帰関数を作成し、各フォルダを巡回する際にカウンタ変数をインクリメントしていくロジックを組みます。

また、ネットワークドライブや共有フォルダを扱う際、権限のないフォルダにアクセスしようとすると「実行時エラー 70:書き込み権限がありません」や「アクセスが拒否されました」が発生します。これを回避するために、必ずエラーハンドリングを導入してください。


' エラーハンドリングを用いた再帰的なカウント例
Function CountAllFolders(fld As Folder) As Long
    Dim subFld As Folder
    Dim count As Long
    
    On Error Resume Next ' 権限エラーを無視する設定
    count = fld.SubFolders.Count
    
    If Err.Number <> 0 Then
        ' エラーが発生した場合は0として扱うか、ログを出力する
        count = 0
        Err.Clear
    End If
    On Error GoTo 0
    
    ' 各サブフォルダを再帰的に巡回
    For Each subFld In fld.SubFolders
        count = count + CountAllFolders(subFld)
    Next subFld
    
    CountAllFolders = count
End Function

このように、`On Error Resume Next`を適切に配置することで、システム停止を防ぎつつ、全階層を網羅的に調査することが可能になります。実務においては、処理結果をイミディエイトウィンドウに出力したり、ログファイルに書き出したりすることで、調査の証跡を残すことも重要なプロフェッショナルスキルです。

まとめ

Excel VBAにおけるサブフォルダの取得は、FileSystemObjectを習得することで、極めてシンプルなコードで実現可能です。Countプロパティを活用する基本手法から、再帰呼び出しを用いた深い階層の探索まで、状況に応じて柔軟に使い分けることが重要です。

プロフェッショナルとして開発を行う際は、単に「動くコード」を書くのではなく、「例外処理が考慮されているか」「メモリ管理(オブジェクトの解放)は適正か」「大規模データに対するパフォーマンスは考慮されているか」という視点を常に忘れないでください。今回解説したFSOの知識をベースに、皆様の業務自動化プロジェクトがより洗練されたものになることを期待しています。ファイルシステム操作は奥が深い領域ですが、この技術をマスターすることで、Excelは単なる表計算ソフトから、強力なファイル管理ツールへと進化を遂げるでしょう。

タイトルとURLをコピーしました