shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Excel VBA】指定フォルダ内の全てのサブフォルダを一覧表示するコード例

VBAで、指定フォルダ内にある全てのサブフォルダを一覧表示するコード例。何かの処理目的で「フォルダ情報だけ一覧にしたい」「全てのフォルダを対象に処理をしたい」といったケースで、再帰プロシージャの基本サンプルです。

事例の前提

Excelファイル内に「フォルダ一覧」というシートがあり、シートのデータを全て削除後、リストを作成する。

VBAサンプル

Option Explicit
    Dim fs As Object 'FileSystemObjectのオブジェクト変数を宣言'
    Dim 対象フォルダ  As String
    Dim サブフォルダ As Object
    Dim 出力シート As Worksheet
    Dim 行 As Long

Sub 全てのサブフォルダ一覧の作成()
'初期設定'
    Set 出力シート = Sheets("フォルダ一覧")
    行 = 1
    出力シート.Cells.Delete Shift:=xlUp

'対象フォルダの設定'
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "一覧にしたいフォルダが存在するフォルダを選択してください。"
        If .Show <> -1 Then Exit Sub
        対象フォルダ = .SelectedItems(1)
    End With
    
'FileSystemObjectの利用準備'
    Set fs = CreateObject("Scripting.FileSystemObject")
        
    Call 全てのサブフォルダの一覧化(fs.GetFolder(対象フォルダ))
    
'終了処理'
    MsgBox "完了しました。"

End Sub

Function 全てのサブフォルダの一覧化(ByRef フォルダ As Object)
    
    For Each サブフォルダ In フォルダ.SubFolders
        出力シート.Cells(行, 1).Value = サブフォルダ.Name
        出力シート.Cells(行, 2).Value = サブフォルダ.Path
        行 = 行 + 1
        Call 全てのサブフォルダの一覧化(サブフォルダ)'再帰処理'
    Next サブフォルダ
    
End Function

事例の補足説明

細かな点の備忘録として、上記の再帰処理の箇所は、 Call を省略するとエラーになる。括弧なしであればCall を省略可。

learn.microsoft.com

 

以上、VBAで、指定フォルダ内にある全てのサブフォルダを一覧表示するコード例でした。