Цикл через все подпапки с помощью VBA [duplicate]

этот вопрос уже есть ответ здесь:

Я ищу скрипт VBA, который будет проходить через все подпапки указанной папки. Когда я говорю все подпапки, я имею в виду каждую папку внутри указанной папки и каждая папка внутри этого, и каждая папка внутри этого...теоретически могут быть бесконечные вложенные подпапки, но на самом деле она, вероятно, не будет превышать 3 или 4. Я использую объекты среды выполнения сценариев VBA, так что, как только я зайду в папку, я могу проверить свойства некоторых файлов (но я знаю, как это сделать).

Спасибо за помощь!

этот вопрос отличается от перечисленных "похожих" вопросов в предыдущих вопросах, содержащихся в известных каталогах, а здесь нужно было найти известные и неизвестные каталоги. Также необходимо несколько слоев подкаталогов. Вы, ребята, действительно должны просто прочитать вопрос, прежде чем запускать "дубликат".

2 ответов


просто папку детализации.

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

и в дополнение к рекурсивному ответу Рича, нерекурсивный метод.

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, который будет обрабатывать в том же порядке, что и рекурсивный подход (replace Set oFolder = queue(1) С Set oFolder = queue(queue.Count) и заменить queue.Remove(1) С queue.Remove(queue.Count), и, вероятно, переименовать переменную...)