こんにちは、VBA講師です。日々の業務で「特定のフォルダの中に、いくつサブフォルダがあるのか」を数えたいという場面はありませんか?例えば、月次報告書が格納された親フォルダから、今月作成されたフォルダの数を確認して進捗を把握するようなケースです。今回は、FileSystemObject(FSO)を用いて、スマートにサブフォルダの数を取得する方法を解説します。
Foldersコレクションという考え方
FSOには、フォルダ内のサブフォルダを管理する「Foldersコレクション」という仕組みがあります。このコレクションには「Count」というプロパティが用意されており、これを使うことでループ処理を回さずに一瞬で数を把握できます。
具体的なコード例
以下のコードは、指定したフォルダ内のサブフォルダ数をイミディエイトウィンドウに表示するシンプルな例です。
Sub GetSubFolderCount()
Dim fso As Object
Dim targetFolder As Object
Dim folderPath As String
folderPath = “C:\TestFolder” ‘ ここに調べたいパスを入力
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ フォルダが存在するか確認
If fso.FolderExists(folderPath) Then
Set targetFolder = fso.GetFolder(folderPath)
‘ Countプロパティで数を取得
Debug.Print “サブフォルダの数: ” & targetFolder.SubFolders.Count
Else
MsgBox “指定したフォルダが見つかりません。”
End If
Set targetFolder = Nothing
Set fso = Nothing
End Sub
実務での応用:条件付きのカウント
単に数を数えるだけなら上記のコードで十分ですが、実務では「特定のキーワードを含むフォルダだけを数えたい」という要望がよくあります。その場合は、Countプロパティではなく、For Eachループを使用して条件分岐を加えるのが正攻法です。
注意点として、Countプロパティはすべてのサブフォルダを無条件で集計します。もし「名前に『2023』を含むフォルダのみ数えたい」といった要件がある場合は、ループ内でIf文を使い、カウント用の変数をインクリメント(加算)していく手法に切り替えてください。
講師からのアドバイス
多くの初心者が「Dir関数」を使ってループ処理を組もうとしますが、階層が深かったり、隠し属性を持つフォルダが混在したりすると、Dir関数では思わぬエラーや漏れが発生することがあります。
実務で安定した動作を求めるなら、FSOのオブジェクトモデルを利用するのが最も堅実です。FoldersコレクションのCountプロパティを使う癖をつけておくと、処理の記述量が減るだけでなく、コードの可読性が格段に向上します。
ぜひ、皆さんの自動化ツールにもこの「Countプロパティ」を組み込んでみてください。些細なことですが、こうした効率的な書き方の積み重ねが、バグの少ないVBAプログラムへの近道ですよ。
