【VBA】指定フォルダ内のフォルダ一覧を取得する

エクセルVBAで使うコードの備忘録。VBAで指定フォルダ内に存在するフォルダ一覧を取得するコード。フォルダではなくファイル一覧を取得する場合はこちらをご覧ください。

スポンサーリンク

ファイルシステムオブジェクト

ウィンドウズのフォルダやファイルに関する情報を扱う場合にはFileSystemObject(ファイルシステムオブジェクト)を利用するのが便利です。

ファイルシステムオブジェクトの生成は下記のように行います。

'--- ファイルシステムオブジェクトの生成 ---'
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

このようにして生成された、ファイルシステムオブジェクト(上記の例では変数fso)に対して、GetFolderメソッドを使用すると、引数として与えたパスのフォルダを表すオブジェクトが取得できます。

さらにこのフォルダオブジェクトに対して「SubFolders」というプロパティがそのフォルダに含まれる下部フォルダの集合を表すオブジェクトになります。

サンプルコード

下記のサンプルコードでは、SubFoldersによって取得したフォルダ一覧を文字列配列に順次格納しています。ちなみに、下部フォルダの数を取得するには、SubFoldersに対してCountプロパティを参照してやればOKです。

ちなみに、If文での分岐は、サブフォルダが存在しない時にエラーが発生しないようにするためのものです。

なお、サンプルコードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。

Public Sub GetFolderList()
    
    '--- 含まれるフォルダ名を知りたいフォルダのパス ---'
    Dim folderPath As String
    folderPath = "[フォルダのパス]"
    
    '--- ファイルシステムオブジェクト ---'
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '--- フォルダ数を格納する変数 ---'
    Dim n As Variant
    n = fso.GetFolder(folderPath).subFolders.Count
    
    '--- フォルダ名を格納する配列 ---'
    If (0 < n) Then
        Dim folderList() As String
        ReDim folderList(1 To n)
        
        '--- フォルダ名を格納 ---'
        Dim i As Long
        i = 1
        Dim f As Object
        For Each f In fso.GetFolder(folderPath).subFolders
            folderList(i) = f.Name
            i = i + 1
        Next f
    End If
    
End Sub