Parcourir dossiers - 1 niveau [VBA]

Résolu
damiens1026 Messages postés 563 Date d'inscription   Statut Membre Dernière intervention   -  
damiens1026 Messages postés 563 Date d'inscription   Statut Membre Dernière intervention   -
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!



5 réponses

pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
oliv_44 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
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
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
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
damiens1026
 
Je vais essayer tout cela au travail demain, je te tiens au courant directement. Merci beaucoup!
0
damiens1026
 
Cela dit, le chemin "C:\Dossier parent\" peut-il etre en relatif: " .\ "
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
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
damiens1026
 
Merci beaucoup pour toutes les réponses et en effet, ce sont des sous-dossiers du dossier maître (parent)
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Attention, ne tient pas compte du code ci-dessus mais du code ci-dessous.
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Salut,
Il me semblait bien que VBA avait une méthode toute trouvée.
Merci pour ce rappel.
A+
0
damiens1026 Messages postés 563 Date d'inscription   Statut Membre Dernière intervention   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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
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
damiens1026 Messages postés 563 Date d'inscription   Statut Membre Dernière intervention   32
 
ah ok, j'arrive à faire le lien avec le C# que je maîtrise nettement mieux alors. Merci!
0