Boucle sur des sous-dossiers

Bonjour tout le monde !

Je me remet un peu au code, et je bute sur un truc tout bête.

J'ai l'intension de lister les fichiers dans différents dossiers et leurs sous-dossiers, mais je peine à faire une boucle pour "creuser" dans ces sous-dossiers. Résultat : quand j'ai des fichiers dans un "sous-sous(-sous...)-dossier, il n'est pas listé.

Voilà mon code. J'ai une feuille "Index" qui liste les dossiers à scanner avec la feuille sur laquelle je veux avoir cette liste.

Option Explicit
Sub Listing()
    Dim i%, j%, derligne%, feuille$, repertoire$, col%, k%
    Dim repFSO As Object, objFSO As Object, objFile As Object, sousrep As Object

    derligne = ThisWorkbook.Sheets("Index").Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To derligne 'On parcourt la liste des dossiers à scanner
        feuille = ThisWorkbook.Sheets("Index").Range("A" & i).Value
        derligne = ThisWorkbook.Sheets(feuille).Range("A" & Rows.Count).End(xlUp).Row
        ThisWorkbook.Sheets(feuille).Range("A2:C" & derligne + 1).Delete 'Deletion des infos dans la feuille traitée
        ThisWorkbook.Sheets(feuille).Range("A2:C" & derligne + 1).Interior.ColorIndex = xlColorIndexNone 'Effacement des couleurs présentes dans la feuille traitée
        repertoire = ThisWorkbook.Sheets("Index").Range("B" & i).Value 'Acquisition de l'adresse du répertoire à scanner
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        Set repFSO = objFSO.GetFolder(repertoire)

        With ThisWorkbook.Sheets(feuille)
             j = 1
                For Each objFile In repFSO.Files 'Pour chaque fichier dans le répertoire
                If objFile.Size > 1000000 Then 'Si taille > 1 Mo
                    .Cells(j + 1, 1) = objFile.Name 'Ajout du nom du fichier dans la colonne A
                    .Hyperlinks.Add Anchor:=.Cells(j + 1, 1), Address:=objFile.Path 'Ajout lien hypertexte
                    .Cells(j + 1, 2) = Round(objFile.Size / 1048576, 0) & " Mo" 'Taille en Mo du fichier dans la colonne B
                    j = j + 1 'On descend d'une ligne
                End If
            Next objFile
            col = 19 'Index couleur
            k = j + 1
            For Each sousrep In repFSO.subfolders
                For Each objFile In sousrep.Files
                    If objFile.Size > 1000000 Then
                    .Cells(j + 1, 1) = objFile.Name
                    .Hyperlinks.Add Anchor:=.Cells(j + 1, 1), Address:=objFile.Path
                    .Cells(j + 1, 2) = Round(objFile.Size / 1048576, 0) & " Mo"
                    j = j + 1
                End If
                Next objFile
                If j > k Then
                    .Range(.Cells(k, 1), .Cells(j, 3)).Interior.ColorIndex = col 'Couleur pour chaque sous-dossier
                    col = col + 1 'Passage à la oculeur suivante
                    If col > 20 Then col = 19 'Alternance entre les deux couleurs (Index 19 et 20) pour les sous-dossiers consécutifs
                    k = j + 1
                End If
            Next sousrep
            .Cells.EntireColumn.AutoFit 'Mise à la taille des colonnes
        End With
    Next i
End Sub

Je ne suis pas à l'aise dans la manipulation de fichiers et dossiers via VBA, donc votre aide sera la bienvenue

bonjour

le mieux est d'utiliser une fonction récursive ... voici un exemple que je fais dans un vbs...et j'ecris dans un fichier csv de sortie mais la structure est la même

le but étant de donné le dossier de départ au code et ensuite de l'appeler récursivement

fred

'Déclaration des constantes pour la lecture et l’écriture dans les fichiers
Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8

CheminScriptActuel = "c:\test"
CheminFichierResultat = CheminScriptActuel & "\" & "listing.csv"
'wscript.echo CheminFichierResultat
'Création des objets
Set objFSO = CreateObject("Scripting.FileSystemObject")
'On fait un objet qui représente le répertoire à explorer
Set objFolder = objFSO.GetFolder(CheminScriptActuel)
Set objTextFile = objFSO.OpenTextFile(CheminFichierResultat, ForWritting, True)

ListDirectory objFolder 
objTextFile.close

Sub ListDirectory(objFolder)

  objTextFile.WriteLine objFolder.path & "\"

  For Each objFile In  objFolder.Files
  objTextFile.WriteLine ";" & (objFile.Name)
  Next
  For Each objSubFolder In objFolder.SubFolders
    'objTextFile.WriteLine "sous-dossier : " & (objSubFolder.Name)
    ListDirectory(objSubFolder )
  Next
End Sub

Bonjour,

bonjour fred

une autre proposition basée sur le même principe

Sub Listing()
    Dim i%, j%, derligne%, feuille$, repertoire$, col%, k%
    Dim repFSO As Object, objfso As Object, objFile As Object, sousrep As Object

    derligne = ThisWorkbook.Sheets("Index").Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To derligne 'On parcourt la liste des dossiers à scanner
        feuille = ThisWorkbook.Sheets("Index").Range("A" & i).Value
        derligne = ThisWorkbook.Sheets(feuille).Range("A" & Rows.Count).End(xlUp).Row
        ThisWorkbook.Sheets(feuille).Range("A2:C" & derligne + 1).Delete 'Deletion des infos dans la feuille traitée
        ThisWorkbook.Sheets(feuille).Range("A2:C" & derligne + 1).Interior.ColorIndex = xlColorIndexNone 'Effacement des couleurs présentes dans la feuille traitée
        repertoire = ThisWorkbook.Sheets("Index").Range("B" & i).Value 'Acquisition de l'adresse du répertoire à scanner
        Set objfso = CreateObject("Scripting.FileSystemObject")
        scansousrept objfso, feuille, repertoire
    Next i
End Sub

Sub scansousrept(objfso, feuille, repertoire, Optional col = 1)
        Set repFSO = objfso.GetFolder(repertoire)
        col = col + 1
        For Each sousrep In repFSO.subfolders
        scansousrept objfso, feuille, sousrep, col
        Next
        With ThisWorkbook.Sheets(feuille)
             j = 1
                For Each objFile In repFSO.Files 'Pour chaque fichier dans le répertoire
                If objFile.Size > 1000000 Then 'Si taille > 1 Mo
                    .Cells(j + 1, 1) = objFile.Name 'Ajout du nom du fichier dans la colonne A
                    .Hyperlinks.Add Anchor:=.Cells(j + 1, 1), Address:=objFile.Path 'Ajout lien hypertexte
                    .Cells(j + 1, 2) = Round(objFile.Size / 1048576, 0) & " Mo" 'Taille en Mo du fichier dans la colonne B
                    j = j + 1 'On descend d'une ligne
                End If
            Next objFile
            .Cells.EntireColumn.AutoFit 'Mise à la taille des colonnes
        End With
End Sub
Rechercher des sujets similaires à "boucle dossiers"