Fazer um loop por todas as subpastas usando o VBA

Eu estou procurando um script VBA que irá percorrer todas as subpastas de uma pasta especificada. Quando digo todas as subpastas, quero dizer cada pasta dentro da pasta especificada, e cada pasta dentro dela, e cada pasta dentro dela … em teoria, pode haver subpastas aninhadas infinitas, mas na verdade ela provavelmente não vai além de 3 ou 4. Estou usando os objects VBA Scripting Runtime, para que, quando eu fizer o loop na pasta, eu possa verificar as propriedades de alguns arquivos (mas eu sei como fazer essa parte).

Obrigado pela ajuda!

Essa questão é diferente das questões “semelhantes” listadas nas perguntas anteriores contidas em diretórios conhecidos, enquanto a necessidade aqui era encontrar diretórios conhecidos e desconhecidos. Também precisava de várias camadas de subdiretórios. Vocês realmente deveriam ler a pergunta antes de triggersr “duplicado”.

   

Apenas uma simples pasta detalhada.

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 

E para complementar a resposta recursiva de Rich, um método não recursivo.

 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 

Você pode usar uma fila para o comportamento FIFO (mostrado acima) ou pode usar uma pilha para o comportamento LIFO que processaria na mesma ordem que uma abordagem recursiva (substitua Set oFolder = queue(1) por Set oFolder = queue(queue.Count) e replace queue.Remove(1) com queue.Remove(queue.Count) , e provavelmente renomeie a variável …)