Passa attraverso tutte le sottocartelle usando VBA

Sto cercando uno script VBA che eseguirà il ciclo di tutte le sottocartelle di una cartella specificata. Quando dico tutte le sottocartelle, intendo ogni cartella all’interno della cartella specificata, e ogni cartella all’interno di quella, e ogni cartella all’interno di quella … in teoria ci potrebbero essere sottocartelle annidate infinite, ma in realtà probabilmente non andrà oltre 3 o 4. Sto usando gli oggetti VBA Scripting Runtime, in modo che una volta il ciclo nella cartella posso controllare le proprietà di alcuni file (ma so come fare quella parte).

Grazie per l’aiuto!

Questa domanda è diversa dalle domande “simili” elencate nelle domande precedenti contenevano le directory conosciute, mentre la necessità qui era di trovare le directory conosciute e sconosciute. Necessari anche più livelli di sottodirectory. Voi ragazzi dovreste davvero leggere la domanda prima di sparare “duplicati”.

Basta una semplice cartella di 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 

E per completare la risposta ricorsiva di Rich, un metodo non ricorsivo.

 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 

È ansible utilizzare una coda per il comportamento FIFO (mostrato sopra), oppure è ansible utilizzare uno stack per il comportamento LIFO che verrebbe elaborato nello stesso ordine di un approccio ricorsivo (sostituire Set oFolder = queue(1) con Set oFolder = queue(queue.Count) e sostituire queue.Remove(1) con queue.Remove(queue.Count) , e probabilmente rinominare la variabile …)