Parcourir dossiers - 1 niveau [VBA]

Résolu
damiens1026 Messages postés 695 Statut Membre -  
damiens1026 Messages postés 695 Statut Membre -
Bonjour,

Je dois actuellement réaliser une macro qui va parcourir des dossier à la recherche de fichiers Excel. Ce que je recherche à faire donc est parcourir 1 seul niveau de sous-dossiers:

Tenant compte de l'arborescence suivante:

Dossier parent\Dossier enfant 1 (1er sous-dossier)

Dossier parent\Dossier enfant 2 (2e sous-dossier)\Dossier enfant 21 (1er sous-sous-dossier)

Dossier parent\Dossier enfant 3

etc...

La macro ne parcourrait que les dossiers enfants 1, 2, 3, etc... mais pas le 21!

Merci d'avance pour votre aide!



--
Meilleures salutations
damiens1026

5 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,
    1- tu as déjà un code ou un embryon de code que l'on pourrait consulter et modifier le cas échéant?
    2- Une piste envisageable :
    la différence entre un dossier, un sous dossier et un sous-sous dossier est le nombre de "\" dans le chemin d'accès.
    Peut être voir cette piste.
    En exemple :
    Dim NbreSlashRacine As Byte, NbreSlashEnfant As Byte 
    
    NbreSlashRacine = UBound(Split("C:\Documents and Settings\Utilisateur001\Bureau", "\")) 
    
    '---- ici ton code servant à parcourir--- 
    
    'auquel tu ajoutes un test : "si le nombre de slash compris dans le chemin  
    'du sous dossier actuel est supérieur à NbreSlash + 1 alors on ne traite pas 
    NbreSlashEnfant = Ubound(Split(CheminActuel, "\")) 
    If NbreSlashEnfant > NbreSlashRacine + 1 Then 
        'ici code "on ne fait rien" 
    Else 
        'ici code on fait... 
    End If

    3- Il existe peut être une méthode VBA toute faite, mais je ne la connais pas...
    Cordialement,
    Franck P
    0
  2. oliv_44 Messages postés 2 Statut Membre
     
    Bonjour,

    Voilà une solution à optimiser (passer par du ubound au lieu d'utiliser un tableau limité à 100 enregistrements par exemple)

    Dim lstRep(100) As String
    Dim i As Integer

    Sub listeRepertoire()

    i = 0
    listeUnRepertoire "D:\temp\"

    End Sub

    Sub listeUnRepertoire(Racine As String)

    Dim strRep As String
    Dim intDeb As Integer
    intDeb = i + 1
    strRep = Dir(Racine, vbDirectory)
    While (strRep <> "")

    If (strRep <> ".") And (strRep <> "..") Then
    If (GetAttr(Racine & strRep) And vbDirectory) <> 0 Then
    i = i + 1
    lstRep(i) = Racine & strRep
    End If
    End If

    strRep = Dir
    Wend
    For intj = intDeb To i
    listeUnRepertoire (lstRep(intj) & "\")
    Next

    End Sub
    0
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour tous,
    Peut-être plus simple ?
    Sub ListerFichiers()
    Dim Rep, sRp, Obj, sRep, F1
    Dim Chem As String
        Chem = "C:\Dossier parent\"
        Set Obj = CreateObject("Scripting.FileSystemObject")
        Set Rep = Obj.Getfolder(Chem)
        For Each sRep In Rep 'Les répertoires enfants 1,2 3 etc...
            'lire les fichiers excel qui sont dans chaque répertoires.
            For Each F1 In sRep
                If Right(F1.Name, 3) = "xls" Then 'à adapter à tes fichiers
                'ICI TU EN FAIT CE QUE TU VEUX,c'est un classeur
                'par exemple
                Workbook.Open (F1.Path & "\" & F1.Name)
                End If
            Next F1
        Next sRep
    End Sub

    J'ai pas tester, si erreur de syntaxe tu dis.
    A+
    0
    1. damiens1026
       
      Je vais essayer tout cela au travail demain, je te tiens au courant directement. Merci beaucoup!
      0
    2. damiens1026
       
      Cela dit, le chemin "C:\Dossier parent\" peut-il etre en relatif: " .\ "
      0
    3. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Toujours risquer de le mettre en relatif, a moins de tester le dossier actif avec ChDir et ChDrive.
      Mais si ce sont des sous dossiers de ton classeur "maître" tu peu dire
      Chem = ThisWorkBook.Path & "\"
      0
    4. damiens1026
       
      Merci beaucoup pour toutes les réponses et en effet, ce sont des sous-dossiers du dossier maître (parent)
      0
    5. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Attention, ne tient pas compte du code ci-dessus mais du code ci-dessous.
      0
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Impossible de modifier mon poste précédant et j'ai été trop vite...
    Rectification et cette fois j'ai tester.. !!
    Sub ListerFichiers()
    Dim Rep, F, Obj, sRep, F1, sf
    Dim Chem As String
        Chem = "C:\Dossier parent\"
        Set Obj = CreateObject("Scripting.FileSystemObject")
        Set Rep = Obj.Getfolder(Chem)
        Set sRep = Rep.subfolders
        For Each sf In sRep 'Les répertoires enfants 1,2 3 etc...
        'Debug.Print sf.Path
            'lire les fichiers excel qui sont dans chaque répertoires.
            Set F = sf.Files
            For Each F1 In F
                If Right(F1.Name, 3) = "xls" Then 'à adapter à tes fichiers
                'ICI TU EN FAIT CE QUE TU VEUX,c'est un classeur
                'par exemple
                'Workbooks.Open (F1.Path )
                'Debug.Print F1.Path
                'Debug.Print F1.Name
                End If
            Next F1
        Next sf
        Set Obj = Nothing
        Set Rep = Nothing
        Set F = Nothing
    End Sub


    A+
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut,
      Il me semblait bien que VBA avait une méthode toute trouvée.
      Merci pour ce rappel.
      A+
      0
    2. damiens1026 Messages postés 695 Statut Membre 32
       
      Une question subsiste, à quoi servent les lignes
      For Each sf In sRep 'Les répertoires enfants 1,2 3 etc...
          'Debug.Print sf.Path
              'lire les fichiers excel qui sont dans chaque répertoires.
              Set F = sf.Files
              For Each F1 In F
                  If Right(F1.Name, 3) = "xls" Then

      Merci d'avance pour la réponse
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Marche à suivre..
    1°) Dans l'IDE (VBA) >> Affichage >> Fenêtre exécution
    2°) Enlever les apostrophes qui sont devant les Debug....
    3°) mettre le curseur sur... For Each sf In sRep
    4°) Taper F9, cette ligne va se surligner en brun.
    5°) Taper F5, Cette ligne va se surligner en jaune, le code est à l'arrêt sur cette ligne et dans la fenêtre du dessous le nom du répertoire sera écrit.
    6°) A chaque appui sur F8 le code sera exécuter et passera à la ligne suivante en affichant ce qui se passe dans la fenêtre exécution.
    Ça devrait t'aider à comprendre.
    Ça s'appel du Pas à pas et permet, entre autre, de comprendre le code.
    A+
    0
    1. damiens1026 Messages postés 695 Statut Membre 32
       
      ah ok, j'arrive à faire le lien avec le C# que je maîtrise nettement mieux alors. Merci!
      0