web-dev-qa-db-ja.com

VBAを使用してすべてのサブフォルダーをループする

指定したフォルダーのすべてのサブフォルダーをループするVBAスクリプトを探しています。すべてのサブフォルダーと言うとき、指定されたフォルダー内の各フォルダー、その中の各フォルダー、およびその中の各フォルダーを意味します...理論的には、ネストされたサブフォルダーは無限にありますが、実際にはおそらく3を超えませんまたは4. VBA Scripting Runtimeオブジェクトを使用しているため、フォルダーにループしたら、いくつかのファイルのプロパティを確認できます(ただし、その部分の実行方法は知っています)。

ご協力ありがとうございました!

この質問は、既知のディレクトリを含む以前の質問にリストされた「類似の」質問とは異なりますが、ここでの必要は、既知および未知のディレクトリを見つけることでした。サブディレクトリの複数のレイヤーも必要でした。 「重複」を発動する前に、質問を読んでください。

27
Jake

簡単なフォルダをドリルダウンします。

sub sample()
    Dim FileSystem As Object
    Dim HostFolder As String

    HostFolder = "C:\"

    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    DoFolder FileSystem.GetFolder(HostFolder)
end  sub

Sub DoFolder(Folder)
    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
    Next
    Dim File
    For Each File In Folder.Files
        ' Operate on each file
    Next
End Sub
80
Rich

また、Richの再帰的な答え、非再帰的な方法を補完するために。

Public Sub NonRecursiveMethod()
    Dim fso, oFolder, oSubfolder, oFile, queue As Collection

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set queue = New Collection
    queue.Add fso.GetFolder("your folder path variable") 'obviously replace

    Do While queue.Count > 0
        Set oFolder = queue(1)
        queue.Remove 1 'dequeue
        '...insert any folder processing code here...
        For Each oSubfolder In oFolder.SubFolders
            queue.Add oSubfolder 'enqueue
        Next oSubfolder
        For Each oFile In oFolder.Files
            '...insert any file processing code here...
        Next oFile
    Loop

End Sub

FIFO動作にキューを使用するか(上記参照)、または再帰アプローチと同じ順序で処理されるLIFO動作にスタックを使用できます(Set oFolder = queue(1)Set oFolder = queue(queue.Count)queue.Remove(1)queue.Remove(queue.Count)で置き換え、おそらく変数の名前を変更します...)

31
Cor_Blimey