Je recherche un script VBA permettant de parcourir tous les sous-dossiers d’un dossier spécifié. Quand je parle de tous les sous-dossiers, je veux dire chaque dossier du dossier spécifié, et chaque dossier de ce dossier, et chaque dossier de ce dossier ... en théorie, il pourrait y avoir une infinité de sous-dossiers imbriqués, mais en réalité, il ne sera probablement pas supérieur à 3 ou 4. J'utilise les objets d'exécution de script VBA, de sorte qu'une fois que je boucle dans le dossier, je puisse vérifier les propriétés de certains fichiers (mais je sais comment faire cette partie).
Merci de votre aide!
Cette question est différente des questions "similaires" répertoriées dans les questions précédentes qui contenaient des annuaires connus, alors qu'il était nécessaire de trouver des annuaires connus et inconnus. Aussi nécessaire plusieurs couches de sous-répertoires. Vous devriez vraiment lire la question avant de lancer "dupliquer".
Juste un simple dossier, descendez.
sub sample()
Dim FileSystem As Object
Dim HostFolder As String
HostFolder = "C:\"
Set FileSystem = CreateObject("Scripting.FileSystemObject")
DoFolder FileSystem.GetFolder(HostFolder)
end sub
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
Et pour compléter la réponse récursive de Rich, une méthode non récursive.
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
Vous pouvez utiliser une file d'attente pour le comportement FIFO (illustré ci-dessus)) ou une pile pour un comportement LIFO) qui serait traité dans le même ordre qu'une opération récursive. approche (remplacez Set oFolder = queue(1)
par Set oFolder = queue(queue.Count)
et remplacez queue.Remove(1)
par queue.Remove(queue.Count)
et renommez probablement la variable ...)