Подтвердить что ты не робот

Петля через все подпапки с использованием VBA

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

Благодарим за помощь!

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

4b9b3361

Ответ 1

Просто простая папка развернется.

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

И чтобы дополнить Rich recursive answer, нерекурсивный метод.

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) и, возможно, переименуйте переменную...)