Compter le nombre de sous-dossiers dans un dossier
Voici une petite fonction VBA qui permet de compter le nombre de sous-dossiers dans un dossier particulier. En pratique, cette fonction servira rarement toute seule, mais on verra plus tard comment la réutiliser dans un cas concret.
Le code
Voici le code à recopier dans un module standard de votre base de données :
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 |
' --- ' NOMBRE DE DOSSIERS DANS UN DOSSIER DE DEPART ' --- ' Function CompterSousDossiers(ByVal strDossier As String) As Integer ' Variables Dim strSousDossier As String Dim intSousDossiers As Integer strDossier = AddBackslash(strDossier) intSousDossiers = 0 ' Parcourir les sous-dossiers strSousDossier = Dir(strDossier, vbDirectory) While strSousDossier <> "" If (strSousDossier <> ".") And (strSousDossier <> "..") Then If (GetAttr(strDossier & strSousDossier) And vbDirectory) <> 0 Then intSousDossiers = intSousDossiers + 1 End If End If strSousDossier = Dir Wend CompterSousDossiers = intSousDossiers End Function |
Tester le code
Pour tester rapidement :
- Faites apparaître la fenêtre Exécution (
Ctrl
+G
). - Tapez-y quelque chose comme :
1 |
? CompterSousDossiers("C:\Users\Hervé\Documents") |
Si votre dossier Documents contient des sous-dossiers, vous en verrez le nombre, c’est tout ! 🙂
Explications
La fonction fait appel à l’instruction Dir
dont on a parlé plusieurs fois sur ce blog :
- La ligne 14 (surbrillée plus haut) récupère le nom du premier fichier ou dossier dans la variable
strSousDossier
. - S’il existe quelque chose, on entre dans la boucle, et chaque tour de boucle fournira un fichier ou un dossier.
- La ligne 22 (surbrillée aussi) ne prend cette fois-ci pas d’arguments (pas de parenthèses non plus), et signifie en gros : « récupérer le prochain élément conforme à ce qui a été demandé en ligne 14« .
- A chaque tour de boucle, on exclut déjà les dossiers spéciaux « . » (le dossier en cours) et « .. » (le dossier parent), qui n’ont pas d’intérêt.
- Ensuite, si l’élément trouvé est un dossier, on incrémente notre compteur.
Un point sournois
En écrivant ceci :
1 |
strSousDossier = Dir(strDossier, vbDirectory) |
…on s’attend généralement à ne récupérer que des sous-dossiers (vbDirectory
) du dossier de départ (strDossier
). En fait, c’est un peu plus compliqué que ça :
- L’instruction
Dir
liste toujours, par défaut, les fichiers normaux (vbNormal
). - Le paramètre
vbDirectory
ne fait qu’ajouter à cette liste les sous-dossiers. Donc la boucle parcourt en réalité tous les fichiers ET les sous-dossiers du répertoire de départ ; c’est moyennement élégant… 😉 - C’est pour cette raison que, dans la boucle, on refait un test à l’aide de la fonction
GetAttr()
(Get Attributes) pour vérifier si l’élément trouvé est bien un dossier.