Partage
  • Partager sur Facebook
  • Partager sur Twitter

VBA compter des fichiers dans des sous dossiers

Sujet résolu
    9 mai 2022 à 14:27:00

    Bonjour,

    Mon objectif est de compter le nombre de fichier Excel dans un dossier.

    Cependant, dans ce dossier se trouve enormement de sous-dossiers, dans ces sous-dossiers peuvent se trouver :

    -des sous-dossiers uniquement

    -des sous-dossiers ainsi que des fichiers excels (que je dois compter)

    -des fichiers excels uniquement (que je dois compter egalement)

    Je debute en VBA et j'ai un code qui fonctionne seulement pour un sous-dossier mais pas plus.

    J'ai egalement une fonction permettant de compter le nombre de sous-dossier dans un dossier (ma strategie etant d'effectuer une boucle While : tant qu'il y a un sous dossier disponible, je vais dedans) mais je n'arrive pas a effectuer cette boucle.

    J'espere que vous allez me comprendre, si c'est le cas pourriez-vous m'aider ? Merci d'avance

    PS : desole pour le manque d'accent, je suis dans un pays etranger et je n'ai pas de clavier francais

    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2022 à 15:24:17

      Tu utilises quoi ? la fonction vba dir ou celle du FileSystemObject ? 

      Compter le nombre de sous-dossier  dans un dossier n'a pas beaucoup d'intéret, ce qui est important c'est de savoir que c'est un sous-dossier pour pourvoir y aller et chercher les fichiers.

      Le nombre que tu cherches à avoir c'est le nombre global de fichier dans l'arborescence (dans le dossier truc et ses sous-dossiers il y 652 fichiers excels) ou par dossier (dans le dossier truc, il y 20 fichiers excel, dans le dossier truc\machin, il y a 35 fichiers excel, ...)

      En principe, on fonctionne avec une méthode récursive: on écrit une fonction qui recherche les fichiers (avec un dir()) si le retour est un fichier d'extension xls* (excel) on le compte, on passe au suivant; si le retour est un répertoire, on "s'auto-appelle" en passant en le nouveau chemin en paramètre et on ajoute le résultat au compteur de fichier; si on a finit d'explorer le répertoire, on retourne le nombre de fichier.

      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2022 à 15:34:00

        J'utilise la fonction VBA Dir.

        Merci pour ton explication de la methode recursive, mais comment identifie-t-on que le retour est un repertoire ? Les fichiers excel sont facilement identifiables, mais je ne sais pas comment reconnaitre un sous-dossier

        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2022 à 16:14:02

          En fait, avec dir, on peut passer après le chemin, un paramètre d'attribut pour lister les répertoires en plus des fichiers.

          Function cherche_fichier(chemin As String, extension As String, recursif As Boolean)
              Dim cpt As Long
              Dim chemin_sec As String
              cpt = 0
              chemin_sec = Dir(chemin + "\*." + extension, vbDirectory)
              Do
                  cpt = cpt + 1
                  Debug.Print chemin_sec
                  If recursif Then
                      If chemin_sec <> "." And chemin_sec <> ".." And GetAttr(chemin_sec) = vbDirectory Then
                          cpt = cpt + cherche_fichier(chemin & "\" & chemin_sec, extension, recursif)
                      End If
                  End If
                  chemin_sec = Dir()
              Loop While chemin_sec <> ""
              cherche_fichier = cpt
          End Function



          • Partager sur Facebook
          • Partager sur Twitter
            10 mai 2022 à 8:36:28

            Merci pour cette fonction mais il y a beaucoup de choses que je ne comprends pas... Serait-il possible d'ajouter des commentaires ? Par exemple la signification des "." et ".." , le 'If recursif" 

            De plus, dans mon programme je souhaiterai que l'utilisateur choisisse le dossier qu'il veut fouiller en cliquant dessus, j'ai alors ajouté  la procedure suivante :

            Sub utiliserlafonction()
             Dim xFidialog As FileDialog
             Dim xFolder As String
             Dim compteur As Long
             Set xFidialog = Application.FileDialog(msoFileDialogFolderPicker)
             If xFidialog.Show = -1 Then
             xFolder = xFidialog.SelectedItems(1)
             End If
             compteur = cherche_fichier(xFolder, "xls", True)
             MsgBox ("There are " & compteur & " excel files in " & xFolder)
            End Sub
            

            Mais quand j'effectue le test, j'obients le message d'erreur suivant "Run-time error '53' : File not found avec la ligne suivante surlignee en jaune : 

            If chemin_sec <> "." And chemin_sec <> ".." And GetAttr(chemin_sec) = vbDirectory Then



            Apres avoir effectue pluieurs tests, je crois que c'est ce Dir qui ne marche pas :

            chemin_sec = Dir(chemin & "\*." & extension, vbDirectory)

            Si dans le dossier chemin se trouve un sous dossier ainsi qu'un fichier excel, dir prendra le fichier excel.

            Si dans le dossier chemin se trouve uniquement un sous dossier, chemin_sec sera vide.

            Or si j'ai bien compris cette ligne, le Dir est censé selectionner le premier element de chemin, que ce soit un fichier excel ou un sous-dossier ?

            -
            Edité par yamak9 10 mai 2022 à 14:34:45

            • Partager sur Facebook
            • Partager sur Twitter
              10 mai 2022 à 16:51:57

              c'est vrai que j'ai été avare en commentaire.

              "." et ".." ce sont 2 valeurs qui peuvent être retourné par le dir (comme la commande en invite de commandes): "." est un "alias" pour le répertoire en cours, et ".." pour le répertoire parent (répertoire contenant le répertoire courant); on peut les exclure du traitement de la recherche pour éviter de compter en double les éléments du répertoire courant (".") et de remonter dans les répertoires parents ("..").

              j'ai rajouté la variable booléenne "recursif" dans ma fonction pour indiquer si l'on veut ou pas faire une recherche/un comptage dans les sous-répertoires (ma fonction peut ainsi répondre au 2 cas)

              Le problème vient effectivement du fait qu'il n'y a pas de fichiers de l'extension recherché dans le répertoire initial. 

              Donc, il faudrait faire le dir sur le chemin sans ajouter l'extension, et ensuite de vérifier si l'extension du fichier retourné est celui recherché.
              Initialement, j'avais pensé à 2 boucles: une sur les fichiers uniquement et une seconde sur les répertoires.

              Function cherche_fichier2(chemin As String, extension As String, recursif As Boolean)
                  Dim cpt As Long, cpt_parcours As Long, i As Long
                  Dim chemin_sec As String
                  cpt = 0
                  chemin_sec = Dir(chemin + "\*." + extension)
                  While chemin_sec <> ""
                      cpt = cpt + 1
                      chemin_sec = Dir
                  Wend
                  If recursif Then
                      chemin_sec = Dir(chemin & "\", vbDirectory)
                      While chemin_sec <> ""
                          cpt_parcours = cpt_parcours + 1
                          Debug.Print chemin_sec
                          If chemin_sec <> "." And chemin_sec <> ".." And GetAttr(chemin & "\" & chemin_sec) = vbDirectory Then
                              cpt = cpt + cherche_fichier2(chemin & "\" & chemin_sec, extension, recursif)
                          End If
                          DoEvents
                          'on repositionne l'état du dir, car il a perdu la dernière position avant l'appel récursif
                          chemin_sec = Dir(chemin & "\", vbDirectory)
                          For i = 0 To cpt_parcours - 1
                              chemin_sec = Dir
                          Next i
                      Wend
                  End If
                  cherche_fichier2 = cpt
              End Function

              PS: le DoEvents c'est pour éviter un blocage en cas de boucle infini (le DoEvents permet de gérer les évènements, donc éventuellement un arrêt de la macro pendant la boucle infinie

              • Partager sur Facebook
              • Partager sur Twitter
                13 mai 2022 à 12:42:29

                Ca marche ! Merci beaucoup pour votre aide
                • Partager sur Facebook
                • Partager sur Twitter

                VBA compter des fichiers dans des sous dossiers

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown