特定のフォルダの中に、さらにどのようなフォルダ(サブフォルダ)が存在するのかを調べ、その一覧をExcelシートに書き出したい、という場面は、ファイルの整理や集計作業の前処理としてよく発生します。
FileSystemObject(FSO)のFolderオブジェクトが持つ**.SubFoldersプロパティ**を使えば、この処理を簡単に行うことができます。
この記事では、指定したフォルダの直下にあるサブフォルダの一覧を取得する基本的な方法と、さらにその中のフォルダもすべて洗い出す応用テクニックを解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール > 参照設定を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード(直下のサブフォルダのみ取得)
以下は、このマクロが書かれているExcelファイルと同じ場所にあるフォルダを対象に、その直下にあるサブフォルダの名前をすべてアクティブシートのA列に書き出すVBAコードです。
'参照設定: Microsoft Scripting Runtime
Sub ListImmediateSubfolders()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim targetFolder As Folder
Dim subFolder As Folder
Dim rowIndex As Long
'--- 1. 親となるフォルダのオブジェクトを取得 ---
Set targetFolder = fso.GetFolder(ThisWorkbook.Path)
' 書き出し先のシートをクリアし、ヘッダーを設定
ActiveSheet.Cells.ClearContents
ActiveSheet.Range("A1").Value = "サブフォルダ名"
rowIndex = 2
'--- 2. .SubFoldersコレクションをループ処理 ---
For Each subFolder In targetFolder.SubFolders
'--- 3. サブフォルダの情報をシートに書き出す ---
ActiveSheet.Cells(rowIndex, "A").Value = subFolder.Name
ActiveSheet.Cells(rowIndex, "B").Value = subFolder.Path
rowIndex = rowIndex + 1
Next subFolder
ActiveSheet.Columns("A:B").AutoFit ' 列幅を自動調整
MsgBox "サブフォルダの一覧取得が完了しました。"
' オブジェクトを解放
Set subFolder = Nothing
Set targetFolder = Nothing
Set fso = Nothing
End Sub
コードのポイント解説
① fso.GetFolder(パス)
まず、起点となる親フォルダの情報をFolderオブジェクトとして取得します。
② .SubFolders プロパティ
For Each subFolder In targetFolder.SubFolders
これが処理の核心部分です。Folderオブジェクトの.SubFoldersプロパティは、そのフォルダの直下にあるすべてのサブフォルダの集まり(コレクション)を返します。
For Eachループを使ってこのコレクションを巡回させることで、各サブフォルダをFolderオブジェクトとして一つずつ変数(subFolder)に取り出し、処理を行うことができます。
③ サブフォルダの情報を書き出す
ループの中で、変数subFolderもFolderオブジェクトであるため、.Name(名前)や.Path(フルパス)、.DateCreated(作成日時)といった様々なプロパティにアクセスして、その情報をシートに書き出すことができます。
【応用】すべての階層のサブフォルダを再帰的に取得する
.SubFoldersは直下のフォルダしか取得しません。もし、サブフォルダのさらにその中にある孫フォルダ、ひ孫フォルダ…と、すべての階層のフォルダをリストアップしたい場合は、**「再帰処理」**というテクニックを使います。
'--- 実行の起点となるメインのSub ---
Sub ListAllSubfoldersRecursively()
Dim fso As New FileSystemObject
Dim startFolder As Folder
Set startFolder = fso.GetFolder(ThisWorkbook.Path) ' 開始フォルダを設定
ActiveSheet.Cells.ClearContents
' 再帰処理を呼び出す
GetSubfolders startFolder, 0
MsgBox "すべての階層のサブフォルダ一覧を取得しました。"
End Sub
'--- 自分自身を呼び出す再帰処理のSub ---
Private Sub GetSubfolders(ByVal parentFolder As Folder, ByVal indentLevel As Integer)
Dim subFld As Folder
' 親フォルダの直下のサブフォルダをループ
For Each subFld In parentFolder.SubFolders
' インデントを付けてフォルダ名を出力
ActiveSheet.Range("A" & Rows.Count).End(xlUp).Offset(1).Value = _
String(indentLevel * 4, " ") & subFld.Name
' ★自分自身を呼び出し、さらに下の階層を検索
GetSubfolders subFld, indentLevel + 1
Next subFld
End Sub
GetSubfoldersというプロシージャの中で、さらに自分自身を呼び出しています。これにより、見つかったサブフォルダを起点に、さらにその中のサブフォルダを探しにいく、という処理がフォルダがなくなるまで繰り返され、すべての階層をリストアップできます。
まとめ
- フォルダの直下にあるサブフォルダの一覧を取得するには、
Folderオブジェクトの**.SubFolders**コレクションをFor Eachループで処理する。 - すべての階層を対象にしたい場合は、**「再帰処理」**というテクニックで
SubFoldersの探索を繰り返す。
FSOの.SubFoldersプロパティを使いこなすことで、複雑なフォルダ構造の分析や、複数階層にわたるファイルの検索といった高度な処理を自動化できます。
副業から独立まで「稼げる」Webスキルを習得する(PR)
ここまで読んでいただきありがとうございます。 最後に宣伝をさせてください。
「副業を始めたいが、何から手をつければいいかわからない」「独学でスキルはついたが、収益化できていない」という悩みを持つ方には、マンツーマン指導のWebスクール**「メイカラ」**が適しています。
このスクールは、単に技術を教えるだけでなく、**「副業として具体的にどう稼ぐか」**という実務直結のノウハウ提供に特化している点が特徴です。
講師陣は、実際に「副業Webライターから1年で独立して月収100万円」を達成したプロや、現役で利益を出し続けているブロガーなど、確かな実績を持つプレイヤーのみで構成されています。そのため、机上の空論ではない、現場で通用する戦術を学ぶことができます。
副業に特化した強み
- 最短ルートの提示: 未経験からでも実績を出せるよう、マンツーマンで指導。
- AI活用の習得: 副業の時間対効果を最大化するための、正しいAI活用スキルも網羅。
- 案件獲得のチャンス: 運営がWebマーケティング会社であるため、実力次第で社内案件の紹介など、仕事に直結する可能性があります。
受講者の多くは、「在宅でできる仕事を探している」「副業を頑張りたい」という20代・30代・40代が中心です。
受講前には、講師による無料説明が行われます。無理な勧誘はなく、自分に合った副業スタイルやプランを相談できるため、まずは話を聞いてみることから始めてみてはいかがでしょうか。
