IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Lister les fichiers dans les dossiers et sous dossiers [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Points : 164
    Points
    164
    Par défaut Lister les fichiers dans les dossiers et sous dossiers
    Bonjour le forum,

    En parcourant la faq, j'ai trouvé deux codes qui me permettent de résoudre partiellement mon problème.

    Le premier :

    " Comment lister les fichiers contenus dans un répertoire ainsi que dans tous ses sous-répertoires ?"

    http://excel.developpez.com/faq/inde...riptingRuntime
    Le second :

    " Lister, dans la feuille de calcul, l'arborescence des dossiers et sous dossiers d'un répertoire "

    http://excel.developpez.com/sources/...scenceDossiers
    J'essais d'avoir :

    - dans la colonne A le nom des fichiers
    - dans la colonne B le nom du répertoire de recherche

    A partir de la colonne C avoir le nom des différents niveaux de dossiers et sous-dossiers.

    En combinant ces deux codes, voilà ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    Option Explicit
        Dim cible As Byte
     
     
    Sub TestListeFichiers()
        Dim Dossier As String
     
        Dossier = "C:\TestListingFichiers\Tests"
        cible = NbSeparateur(Dossier)
     
        'Appelle la procédure de recherche des fichiers
        ListeFichiers Dossier
     
        'Ajuste la largeur des colonnes A:E en fonction du contenu des cellules.
        Columns("A:E").AutoFit
        MsgBox "Terminé"
    End Sub
     
     
    Sub ListeFichiers(Repertoire As String)
        '
        'Nécessite d'activer la référence "Microsoft Scripting RunTime"
            'Dans l'éditeur de macros (Alt+F11):
            'Menu Outils
            'Références
            'Cochez la ligne "Microsoft Scripting RunTime".
            'Cliquez sur le bouton OK pour valider.
     
        Dim Fso As Scripting.FileSystemObject
        Dim SourceFolder As Scripting.Folder
        Dim SubFolder As Scripting.Folder
        Dim FileItem As Scripting.File
        Dim i As Long
     
     
        Set Fso = CreateObject("Scripting.FileSystemObject")
        Set SourceFolder = Fso.GetFolder(Repertoire)
     
        'Nom des colonnes
        Cells(1, 1) = "Nom Fichier"
        Cells(1, 2) = "Chemin Complet"
     
        'Récupère le numéro de la dernière ligne vide dans la colonne A.
        i = Range("A65536").End(xlUp).Row + 1
     
        'Boucle sur tous les fichiers du répertoire
        For Each FileItem In SourceFolder.Files
     
            'Inscrit le nom du fichier dans la cellule
            Cells(i, 1) = FileItem.Name
     
            'Nom du répertoire
            Cells(i, 2) = FileItem.ParentFolder
     
            'Nombre de séparateurs
            Cells(i, 3) = NbSeparateur(FileItem.ParentFolder)
     
            'Nom du dossier
            Cells(i, NbSeparateur(SubFolder.Path) + 1 - cible) = SubFolder.Name
     
     
            i = i + 1
        Next FileItem
     
     
        '--- Appel récursif pour lister les fichier dans les sous-répertoires ---.
        For Each SubFolder In SourceFolder.SubFolders
            ListeFichiers SubFolder.Path
        Next SubFolder
     
    End Sub
     
     
    Function NbSeparateur(chemin As String) As Byte
        Dim m As Integer
        Dim Nb As Byte
     
        For m = 1 To Len(chemin)
            If Mid(chemin, m, 1) = "\" Then
                Nb = Nb + 1
                m = m + 1
            End If
        Next
     
        NbSeparateur = Nb
    End Function
    J'ai une erreur à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i, NbSeparateur(SubFolder.Path) + 1 - cible) = SubFolder.Name
    Erreur d'exécution '91'
    Variable objet ou variable de bloc non définie
    J'en suis qu'au début mais si vous pouviez me donner quelques indications pour continuer, ça m'aiderait vraiment.

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Changez la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i, NbSeparateur(SubFolder.Path) + 1 - cible) = SubFolder.Name
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i, NbSeparateur(SourceFolder.Path) + 1 - cible) = SourceFolder.Name
    Cordialement.

    PMO

  3. #3
    Membre habitué Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Points : 164
    Points
    164
    Par défaut
    Merci beaucoup PMO2017,

    Je n'ai plus le message d'erreur et j'ai bien le nom de mes dossiers.

    Toutefois, j'ai un pti soucis au niveau de mes premières colonnes.

    Dans la colonne A j'ai le nom du fichier (toto.xls), tout va bien

    Dans la colonne B je dois avoir le chemin du fichier (C:\TestListingFichiers\Tests\Titi\DossierB\DossierB3
    )

    Et à partir de la colonne C j'aurai souhaité avoir le nom du dernier dossier contenant le fichier en cascade.

    La macro m'écrase une partie de ma colone B.

    Auriez-vous une idée pour que la ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           'Nom du dossier
            Cells(i, NbSeparateur(SubFolder.Path) + 1 - cible) = SubFolder.Name
    commence à la colonne C ?

    Merci d'avance
    Doncamelo

    Voici un exemple du résultat que je recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Nom Fichier   **************	Chemin   **********************************************************************	répertoire de recherche   ***********	Niveau 1   ***	Niveau 2   *****	Niveau 3   *****	Niveau 4
    Titi1.xls   *****************	C:\TestListingFichiers\Tests\Titi   ******************************************	Tests   *******************************	Titi   *********			
    Titi2.doc   ****************	C:\TestListingFichiers\Tests\Titi   ******************************************	Tests   *******************************	Titi   *********			
    Titi3.txt   *****************	C:\TestListingFichiers\Tests\Titi   ******************************************	Tests   *******************************	Titi   *********			
    FichierA1.xls   **********	C:\TestListingFichiers\Tests\Titi\DossierA   ******************************	Tests   *******************************	Titi   *********	DossierA   *****		
    FichierA2.doc   **********	C:\TestListingFichiers\Tests\Titi\DossierA   ******************************	Tests   *******************************	Titi   *********	DossierA   *****		
    FichierA3.txt   ***********	C:\TestListingFichiers\Tests\Titi\DossierA   ******************************	Tests   *******************************	Titi   *********	DossierA   *****		
    FichierA11.xls   *********	C:\TestListingFichiers\Tests\Titi\DossierA\DossierA1   ******************	Tests   *******************************	Titi   *********	DossierA   *****	DossierA1   ***	
    FichierA12.doc   ********	C:\TestListingFichiers\Tests\Titi\DossierA\DossierA1   ******************	Tests   *******************************	Titi   *********	DossierA   *****	DossierA1   ***	
    FichierA13.txt   *********	C:\TestListingFichiers\Tests\Titi\DossierA\DossierA1   ******************	Tests   *******************************	Titi   *********	DossierA   *****	DossierA1   ***	
    FichierA21.xls   *********	C:\TestListingFichiers\Tests\Titi\DossierA\DossierA2   ******************	Tests   *******************************	Titi   *********	DossierA   *****	DossierA2   ***	
    FichierA22.doc   ********	C:\TestListingFichiers\Tests\Titi\DossierA\DossierA2   ******************	Tests   *******************************	Titi   *********	DossierA   *****	DossierA2   ***	
    FichierA23.txt   *********	C:\TestListingFichiers\Tests\Titi\DossierA\DossierA2   ******************	Tests   *******************************	Titi   *********	DossierA   *****	DossierA2   ***	
    FichierB1.xls   **********	C:\TestListingFichiers\Tests\Titi\DossierB   *******************************	Tests   *******************************	Titi   *********	DossierB   *****		
    FichierB2.doc   **********	C:\TestListingFichiers\Tests\Titi\DossierB   *******************************	Tests   *******************************	Titi   *********	DossierB   *****		
    FichierB3.txt   ***********	C:\TestListingFichiers\Tests\Titi\DossierB   *******************************	Tests   *******************************	Titi   *********	DossierB   *****		
    FichierB11.xls   *********	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB1   ******************	Tests   *******************************	Titi   *********	DossierB   *****	DossierB1   ***	
    FichierB12.doc   ********	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB1   ******************	Tests   *******************************	Titi   *********	DossierB   *****	DossierB1   ***	
    FichierB13.txt   *********	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB1   ******************	Tests   *******************************	Titi   *********	DossierB   *****	DossierB1   ***	
    FichierB31.xls   *********	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB3   ******************	Tests   *******************************	Titi   *********	DossierB   *****	DossierB3   ****	
    FichierB32.doc   ********	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB3   ******************	Tests   *******************************	Titi   *********	DossierB   *****	DossierB3   ****	
    FichierB33.txt   *********	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB3   ******************	Tests   *******************************	Titi   *********	DossierB   *****	DossierB3   ****	
    FichierB311.xls   ********	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB3\DossierB31   ****	Tests   *******************************	Titi   *********	DossierB   *****	DossierB3   ****	DossierB31
    FichierB312.doc   *******	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB3\DossierB31   ****	Tests   *******************************	Titi   *********	DossierB   *****	DossierB3   ****	DossierB31
    FichierB313.txt   ********	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB3\DossierB31   ****	Tests   *******************************	Titi   *********	DossierB   *****	DossierB3   ****	DossierB31
    FichierB321.xls   ********	C:\TestListingFichiers\Tests\Titi\DossierB\DossierB3\DossierB32   ****	Tests   *******************************	Titi   *********	DossierB   *****	DossierB3   ****	DossierB32
    Toto1.xls   ***************	C:\TestListingFichiers\Tests\Toto   *****************************************	Tests   *******************************	Toto   ********			
    Toto2.doc   **************	C:\TestListingFichiers\Tests\Toto   *****************************************	Tests   *******************************	Toto   ********			
    Toto3.txt   ***************	C:\TestListingFichiers\Tests\Toto   *****************************************	Tests   *******************************	Toto   ********			
    Fichier11.xls   ***********	C:\TestListingFichiers\Tests\Toto\Dossier1   ******************************	Tests   *******************************	Toto   ********	Dossier1   *****		
    Fichier12.doc   **********	C:\TestListingFichiers\Tests\Toto\Dossier1   ******************************	Tests   *******************************	Toto   ********	Dossier1   *****		
    Fichier13.txt   ***********	C:\TestListingFichiers\Tests\Toto\Dossier1   ******************************	Tests   *******************************	Toto   ********	Dossier1   *****		
    Fichier111.xls   *********	C:\TestListingFichiers\Tests\Toto\Dossier1\Dossier11   ******************	Tests   *******************************	Toto   ********	Dossier1   *****	Dossier11   ****

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Essayez avec la ligne modifiée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            'Nom du dossier
             Cells(i, NbSeparateur(SourceFolder.Path) + 3 - cible) = SourceFolder.Name
    Cordialement.

    PMO

  5. #5
    Membre expérimenté Avatar de Vadorblanc
    Profil pro
    Inscrit en
    Février 2008
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 309
    Points : 1 482
    Points
    1 482
    Par défaut
    Bonjour
    Je fais régulièrement des listings de tous les dossiers et sous dossiers d'un lecteur, voici ma méthode:

    Démarrer / Excécuter / cmd et entrée
    Ecrire : Cocument and Setting\Nom>tree/C:/Public>liste100101.xls et entrée
    Ensuite récupérer le fichier crée sous Cocument and Setting\Nom et prendre le fichier Liste100101.xls
    Ouvrir le fichier Liste 100101.xls qui contient toute l'arborecence détaillée de tous les fichiers existants, puis transformer les caractères accentués par:
    Edition / Rechercher / et remplacer par
    ‚ é
    ˆ e
    “ ô
    Pour avoir tous les fichiers écrits correctement.
    Ensuite par un simple Ctrl F je retrouve n'importe quel document dont j'avais perdu l'emplacement.

    Mais l'idéal serait une macro qui le fasse automatiquement dont j'attends l'élaboration sur le forum, mais celà me semble compliqué car un membre très confirmé du forum Qwazerty a déjà déposé dans le dossier Contribuez "Lister fichiers contenu dans un répertoire" une superbe macro qui fonctionne pour lui mais dont je n'arrive pas à faire fonctionner chez moi avec excel 2003.

    J'attends que votre post relance cette recherche.
    Cordialement

  6. #6
    Membre habitué Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Points : 164
    Points
    164
    Par défaut
    Bonjour PMO2017,

    Merci beaucoup pour le coup de pouce, c'était d'une évidence !!!!
    Mais j'avais trop la tête dans le guidon

    Vadorblanc,
    J'ai testé ta manip et ça fonctionne très bien, mais je ne suis pas trop à l'aise avec les commandes DOS.

    Je complète et vous montre le résultat en fin de journée.

    Doncamelo

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour à tous,

    Pour Vadorblanc

    J'ai automatisé la démarche que vous avez fait paraître.
    Comme c'est plutôt difficile à expliquer le mieux est de tester à partir du classeur que je mets en pièce jointe.
    J'ai utilisé un BrowseForFolder pour choisir le dossier désiré.

    Cordialement.

    PMO

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    Pour le plaisir, ton code d'origine modifié et simplifié, avec l'utilisation de la fonction Split pour séparer les différent dossier. j'ai mis des commentaire pour les modifiactions avec '# en préfixe

    Testé -> OK

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    Option Explicit
     
    Sub TestListeFichiers()
        Dim Dossier As String
        Dim cmpt As Integer '# variable ajouté
     
        Dossier = "C:\TestListingFichiers\Tests"
        '# Compte le nombre de sous dossier de départ
        cmpt = IIf(InStr(Dossier, "\") > 0, Len(Dossier) - Len(Replace(Dossier, "\", "")) + 1, 1)
     
        '# déplacé car il n'est pas nécessaire de le réécrire
        '# à chaque itération
        'Nom des colonnes
        Cells(1, 1) = "Nom Fichier"
        Cells(1, 2) = "Chemin Complet"
     
        'Appelle la procédure de recherche des fichiers
        '# ajout de 3 correspondant au 3eme niveau du répertoire(Tests)
        '# les deux premier niveaux ne seront écris dans la feuille
        Call ListeFichiers(Dossier, cmpt)
     
        'Ajuste la largeur des colonnes A:E en fonction du contenu des cellules.
        Columns("A:E").AutoFit
        MsgBox "Terminé"
    End Sub
     
     
     
    Sub ListeFichiers(Repertoire As String, NbRepRacine As Integer) '#ajout de la variable
        '
        'Nécessite d'activer la référence "Microsoft Scripting RunTime"
            'Dans l'éditeur de macros (Alt+F11):
            'Menu Outils
            'Références
            'Cochez la ligne "Microsoft Scripting RunTime".
            'Cliquez sur le bouton OK pour valider.
     
        Dim Fso As Scripting.FileSystemObject
        Dim SourceFolder As Scripting.Folder
        Dim SubFolder As Scripting.Folder
        Dim FileItem As Scripting.File
        Dim i As Long
        '# Ajout de ces variables
        Dim tabSplit() As String, tabIndex As Integer, colonne As Integer
     
        Set Fso = CreateObject("Scripting.FileSystemObject")
        Set SourceFolder = Fso.GetFolder(Repertoire)
     
        'Récupère le numéro de la dernière ligne vide dans la colonne A.
        i = Range("A65536").End(xlUp).Row + 1
     
        'Boucle sur tous les fichiers du répertoire
        For Each FileItem In SourceFolder.Files
     
            'Inscrit le nom du fichier dans la cellule
            Cells(i, 1) = FileItem.Name
     
            'Nom du répertoire
            Cells(i, 2) = FileItem.ParentFolder
     
            ' # -------------------------------------------------#
            ' # gestion de l'écriture 1 repertoire par colonne   #
            tabSplit = Split(FileItem.ParentFolder, "\")        '#
            colonne = 3                                         '#
            For tabIndex = NbRepRacine - 1 To UBound(tabSplit)  '#
              Cells(i, colonne) = tabSplit(tabIndex)            '#
              colonne = colonne + 1                             '#
            Next                                                '#
            ' # -------------------------------------------------#
     
            i = i + 1
        Next FileItem
     
     
        '--- Appel récursif pour lister les fichier dans les sous-répertoires ---.
        For Each SubFolder In SourceFolder.SubFolders
            Call ListeFichiers(SubFolder.Path, NbRepRacine) '#ajout de la variable
        Next SubFolder
     
    End Sub

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Bonjour,

    Avec Excel 2003, il me paraît plus simple d'utiliser FileSearch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub recherche()
        With Application.FileSearch
            .NewSearch
            .RefreshScopes
            .LookIn = "C:\Documents and Settings\adorian\Desktop" 'Ton répertoire
            .Filename = "*.*"
            .SearchSubFolders = True 'Cherche dans les sous-répertoires !
            For Ctr = 1 To .FoundFiles.Count
                Range("A" & Ctr).Value = .Filename
            Next
        End With
    End Sub
    Ces quelques lignes suffisent à remplir ta colonne A. Il suffit de faire la même chose pour le reste.

    A+

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour Dead78

    j'ai essayé le code et ça ne marche pas.

    en ajoutant le .execute qui manquait et en changeant le .Filename de l'écriture dans la cellule par .FoundFiles c'est ok

    ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub recherche()
        With Application.FileSearch
            .NewSearch
            .RefreshScopes
            .LookIn = "E:\vba\" 'Ton répertoire
            .Filename = "*.*"
            .SearchSubFolders = True 'Cherche dans les sous-répertoires !
            .Execute
            For ctr = 1 To .FoundFiles.Count
                Range("A" & ctr).Value = .FoundFiles(ctr)
            Next
        End With
    End Sub

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Effectivement, j'avais oublié le .execute et je m'étais trompé pour la le nom du fichier.

    Attention, si le document a vocation à être ouvert sur Excel 2007 ou supérieur, cela ne marchera pas.

  12. #12
    Membre habitué Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    Désolé pour ce long silence.
    Un grand merci à vous tous pour la résolution de ce post.

    J'ai adapté le code à mon besoin :
    - Un onglet Listing qui affichera les résultats
    - Une boîte de dialogue permettant à l'utilisateur de choisir le répertoire de recherche
    - Quelques avertissements pour l'utilisateur

    et voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    Option Explicit
     
    Sub ProcedurePrincipal()
    'Déclaration des variables
        Dim Dossier As String
        Dim cmpt As Integer '# variable ajouté
     
    'Choix du répertoire :
                With Application.FileDialog(msoFileDialogFolderPicker)
                    'Définit un titre pour la boîte de dialogue
                    .Title = "Sélectionnez le répertoire de recherche:"
                    'Affiche la boîte de dialogue
                    .Show
                    'Affiche le nom du dossier sélectionné
                        If .SelectedItems.Count > 0 Then
                            'MsgBox .SelectedItems(1)
                            Dossier = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
                        Else
                            MsgBox "Aucun répertoire n'a été sélectionné. La procédure va s'arrêter"
                            Exit Sub
                        End If
                End With
     
    'Message de précaution avant suppression de la feuille "Listing"
        If MsgBox("Les informations de la feuille Listing vont être supprimées." & vbCrLf & "Si vous souhaitez les conserver faites une copie avant de poursuivre." & vbCrLf & "Voulez-vous continuer ?", vbYesNo, "Nouveau Listing") = vbYes Then
     
        '# Compte le nombre de sous dossier de départ
        cmpt = IIf(InStr(Dossier, "\") > 0, Len(Dossier) - Len(Replace(Dossier, "\", "")) + 1, 1)
     
    'Selection de la feuille de travail
        Sheets("Listing").Select
     
    'Appel de la procedure SuppressionDesValeurs
        Call SuppressionDesValeurs
     
    'Affectation des libellés de colonnes
        Cells(1, 1) = "Chemin complet"
        Cells(1, 2) = "Nom du fichier"
        Cells(1, 3) = "Repertoire principal"
     
    'Appel de la procédure de listing
        Call ListeFichiers(Dossier, cmpt)
     
    ' Mise en forme des entêtes de colonnes
        'Numérotation des différents niveaux des répertoires
            Dim j As Long
            Dim NumColonne As Long
     
            For j = 4 To 100
                NumColonne = Application.WorksheetFunction.CountA(Columns(j))
                If NumColonne > 0 Then Cells(1, j) = "Niveau " & j - 3
            Next j
     
            Range("A1").Select
            Range(Selection, Selection.End(xlToRight)).Select
     
            With Selection
                .Font.Bold = True
                .Interior.ColorIndex = 44
                .HorizontalAlignment = xlCenter
            End With
     
            Columns("A:IV").AutoFit
     
            MsgBox "Le listing du répertoire :" & vbCrLf & Dossier & vbCrLf & " est terminé !!"
            Sheets("Listing").Select
     
        End If
    End Sub
     
    'Procedure de listing des fichiers
    Sub ListeFichiers(Repertoire As String, NbRepRacine As Integer)
    'Déclaration des variables
        Dim Fso As Scripting.FileSystemObject
        Dim SourceFolder As Scripting.Folder
        Dim SubFolder As Scripting.Folder
        Dim FileItem As Scripting.File
        Dim i As Long
        Dim tabSplit() As String
        Dim tabIndex As Integer
        Dim colonne As Integer
     
        Set Fso = CreateObject("Scripting.FileSystemObject")
        Set SourceFolder = Fso.GetFolder(Repertoire)
     
    'Récupère le numéro de la dernière ligne vide dans la colonne A.
        i = Range("A65536").End(xlUp).Row + 1
     
    'Boucle sur tous les fichiers du répertoire
        For Each FileItem In SourceFolder.Files
     
            'Inscrit le chemin complet du fichier
                Cells(i, 1) = FileItem.ParentFolder & "\"
     
            'Inscrit le nom du fichier
                Cells(i, 2) = FileItem.Name
     
            'Gestion de l'écriture 1 repertoire par colonne
                tabSplit = Split(FileItem.ParentFolder, "\")
                colonne = 3
                    For tabIndex = NbRepRacine - 1 To UBound(tabSplit)
                        Cells(i, colonne) = tabSplit(tabIndex)
                        colonne = colonne + 1
                    Next
     
         i = i + 1
        Next FileItem
     
        '--- Appel récursif pour lister les fichier dans les sous-répertoires ---.
        For Each SubFolder In SourceFolder.SubFolders
            Call ListeFichiers(SubFolder.Path, NbRepRacine)
        Next SubFolder
     
    End Sub
     
    'Procedure de Suppression des données de la feuille "Listing"
    Sub SuppressionDesValeurs()
        Cells.Delete
    End Sub
    Il me reste juste un détail à régler, c'est pouvoir permettre à l'utilisateur d'interrompre la procédure avec la touche "Echap".

    Je vais voir ce que je trouve dans la faq, mais si vous savez comment faire, je suis preneur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Compter les fichiers dans les sous répertoires d'un dossier
    Par Pouknouki dans le forum VB.NET
    Réponses: 9
    Dernier message: 25/02/2012, 13h16
  2. Réponses: 2
    Dernier message: 05/11/2011, 23h35
  3. Rediriger tout les fichiers quel que soit le sous-dossier
    Par DarkChamallo dans le forum Apache
    Réponses: 5
    Dernier message: 22/10/2010, 22h54
  4. Réponses: 4
    Dernier message: 11/09/2006, 16h55
  5. Les liens dans les fichiers.hta
    Par Lorponos dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 19/07/2006, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo