Loop Through All Subfolders Using VBA [duplicate]

2019-01-01 03:44发布

问题:

This question already has an answer here:

  • Cycle through sub-folders and files in a user-specified root directory [duplicate] 3 answers

I\'m looking for a VBA script that will loop through all subfolders of a specified folder. When I say all subfolders, I mean each folder inside the specified folder, and each folder inside of that, and each folder inside of that...in theory there could be infinite nested subfolders, but in actuality it will probably not go above 3 or 4. I\'m using the VBA Scripting Runtime objects, so that once I loop into the folder I can check properties of some files (but I know how to do that part).

Thank you for your help!

This question is different from the listed \"similar\" questions in the previous questions contained known directories, whereas the need here was to find known and unknown directories. Also needed multiple layers of subdirectories. You guys really should just read the question before you fire off \"duplicate\".

回答1:

Just a simple folder drill down.

Dim FileSystem As Object
Dim HostFolder As String

HostFolder = \"C:\\\"

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

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


回答2:

And to complement Rich\'s recursive answer, a non-recursive method.

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

You can use a queue for FIFO behaviour (shown above), or you can use a stack for LIFO behaviour which would process in the same order as a recursive approach (replace Set oFolder = queue(1) with Set oFolder = queue(queue.Count) and replace queue.Remove(1) with queue.Remove(queue.Count), and probably rename the variable...)