web-dev-qa-db-fra.com

Boucle dans tous les sous-dossiers à l'aide de VBA

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".

27
Jake

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
80
Rich

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 ...)

31
Cor_Blimey