Цикл через все подпапки с помощью 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)
, и, вероятно, переименовать переменную...)