サブフォルダを含むフォルダとファイル名の一覧をソートして取得

サブフォルダを含むフォルダとファイルの一覧をソートして取得する。

VBAで指定したフォルダ内にあるすべてのフォルダとファイル名の一覧をソートした状態で取得します。

フォルダ内のサブフォルダを含めたすべてのフォルダ、ファイル名を取得にはGetFolderメソッドのSubFoldersプロパティを再帰的に呼び出して使うことですべてのフォルダ、ファイル名を取得していますが、そのままの処理ではフォルダ、ファイル名の一覧はサブフォルダから親フォルダにさかのぼって取得される形になります。
(下記のページにソート無し版のコードを掲載しています。)
  サブフォルダを含めたフォルダとファイル名の一覧を取得

そのためこのページで記載しているサンプルコードは対象の親フォルダから順番に表示するように配列と配列のソート処理を利用して取得させています。ソートはクイックソートで処理しています。

'******************************************************************
' サブフォルダを含めたフォルダ、ファイルを一覧を取得
'******************************************************************
Sub getAllFileList_Sort()

    '対象のフォルダを指定
    Dim sRootFolder  As String
    sRootFolder = "C:\VBA\List\"
    
    'FileSystemObjectオブジェクトの作成
    Dim oFso As Object
    Set oFso = CreateObject("Scripting.FileSystemObject")
    
    'ファイル一覧取得対象となるフォルダパスを配列に格納
    Dim vAryDir() As Variant
    Dim lAryCnt As Long
    Call getTargetDir(oFso.GetFolder(sRootFolder), vAryDir, lAryCnt)

    '取得したフォルダパスを格納した配列をソート
    Call sortQuick_Asc(vAryDir, LBound(vAryDir), UBound(vAryDir))
    
    'ソートしたフォルダパス順に格納されているファイル名を取得
    Dim vAryList() As Variant
    Call getFileList(vAryDir, vAryList)
    
    'フォルダ、ファイルの一覧を出力
    Dim i As Long
    For i = 1 To UBound(vAryList)
        Debug.Print vAryList(i)
    Next
    
End Sub

'******************************************************************
' フォルダチェック(サブフォルダがあれば再帰的に呼び出して実行)
'------------------------------------------------------------------
'  第1引数:フォルダオブジェクト
'  第2引数:配列(フォルダパス)
'  第3引数:配列要素数
'******************************************************************
Sub getTargetDir(getObjDir As Object, getAryDir() As Variant, lAryCnt As Long)

    '対象フォルダにサブフォルダがあれば再帰的に処理し情報を取得
    Dim oSubDir As Object
    For Each oSubDir In getObjDir.SubFolders
        Call getTargetDir(oSubDir, getAryDir(), lAryCnt)
    Next
    
    '検査対象のフォルダパスを配列に格納
    lAryCnt = lAryCnt + 1
    ReDim Preserve getAryDir(1 To lAryCnt)
    getAryDir(lAryCnt) = getObjDir.Path
    
End Sub

'******************************************************************
' フォルダ内のファイルを一覧で取得(GetFolder使用)
'------------------------------------------------------------------
'  第1引数:配列(フォルダパス)
'  第2引数:配列(フォルダ、ファイル名)
'******************************************************************
Sub getFileList(getAryDir() As Variant, ByRef rtnAryList() As Variant)

    'FileSystemObjectオブジェクトの作成
    Dim oFso As Object
    Set oFso = CreateObject("Scripting.FileSystemObject")

    Dim lAryCnt As Long
    lAryCnt = 0
    
    'フォルダパスを格納した配列をループで処理
    Dim i As Long
    For i = 1 To UBound(getAryDir())
        
        'フォルダパスを返り値用の配列に格納
        lAryCnt = lAryCnt + 1
        ReDim Preserve rtnAryList(1 To lAryCnt)
        rtnAryList(lAryCnt) = getAryDir(i)
        
        'ファイルの情報を取得
        Dim oDir As Object
        Set oDir = oFso.GetFolder(getAryDir(i))
        
        'ファイル一覧の作成
        Dim oFile As Object
        For Each oFile In oDir.Files
            'ファイル名を返り値用の配列に格納
            lAryCnt = lAryCnt + 1
            ReDim Preserve rtnAryList(1 To lAryCnt)
            rtnAryList(lAryCnt) = " └" & oFile.Name
        Next
    Next

    Set oFso = Nothing

End Sub

'******************************************************************
' 配列をソートする/昇順(クイックソート)
'------------------------------------------------------------------
'  第1引数:配列
'  第2引数:配列の開始要素数
'  第2引数:配列の終了要素数
'******************************************************************
Sub sortQuick_Asc(ByRef vAryData() As Variant, lLow As Long, lUp As Long)
    
    '基準値(中央値)
    Dim vStd  As Variant
    vStd = vAryData(Int((lLow + lUp) / 2))
    
    Dim i As Long
    i = lLow
    
    Dim j As Long
    j = lUp
    
    Dim vTemp As Variant
    Do
        '基準値より小さい間はループ
        Do While vAryData(i) < vStd
            i = i + 1
        Loop
        
        '基準値より大きい間はループ
        Do While vAryData(j) > vStd
            j = j - 1
        Loop
        
        'ループ終了判定
        If i >= j Then
            Exit Do
        End If
        
        vTemp = vAryData(i)
        vAryData(i) = vAryData(j)
        vAryData(j) = vTemp
        i = i + 1
        j = j - 1
    Loop
    
    '再帰呼び出し
    If (lLow < i - 1) Then
        Call sortQuick_Asc(vAryData, lLow, i - 1)
    End If
    
    If (lUp > j + 1) Then
        Call sortQuick_Asc(vAryData, j + 1, lUp)
    End If
    
End Sub

 ■実行結果