Imbrication de Dir en VBA
L’instruction Dir
En VBA, la commande Dir
permet de lister les fichiers ou les sous-dossiers d’un répertoire précis. Généralement, le principe consiste à écrire une boucle qui va extraire, à chaque « tour », le nom d’un nouveau fichier, jusqu’à ce que VBA n’en trouve plus.
La boucle, le tour ? Non, aucun rapport avec le Tour de France… 😉
Le problème est que plusieurs instructions
Dir
ne peuvent pas être imbriquées les unes dans les autres. En d’autres termes : si vous utilisezDir
à l’intérieur d’une boucle, cette boucle ne peut pas elle-même appeler un autre bout de code qui ferait unDir
différent.
Un petit exemple
Pour rafraîchir, les idées, voici un petit exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub TestDir1() Dim strDossier As String Dim strFichier As String ' Le dossier à analyser strDossier = "C:\Users\Hervé\Desktop" ' Trouver tous les fichiers strFichier = Dir(strDossier & "\*.*", vbNormal) While strFichier <> "" ' Afficher le nom du fichier dans la fenêtre Exécution Debug.Print strFichier ' Fichier suivant strFichier = Dir Wend End Sub |
Comme d’habitude, vous pouvez :
- Recopier ce code dans un module standard de votre base de données.
- Modifier la variable
strDossier
en fonction de votre propre machine. - Faire apparaître la fenêtre Exécution (là où vont s’afficher les noms de fichiers).
- Placer votre curseur quelque part dans le code.
- Cliquer sur l’icône Exécuter Sub/UserForm.
Imbrication = complications !
Comme il a été dit en introduction, le problème est que plusieurs instructions Dir
ne peuvent pas être imbriquées les unes dans les autres. Pour illustrer le principe, dupliquez la procédure Sub / End Sub
précédente (dans le même module), modifiez le nom TestDir1
en TestDir2
, et changez également le dossier à analyser. Vous obtenez quelque chose comme ceci :
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 |
Sub TestDir1() Dim strDossier As String Dim strFichier As String ' Le dossier à analyser strDossier = "C:\Users\Hervé\Desktop" ' Trouver tous les fichiers strFichier = Dir(strDossier & "\*.*", vbNormal) While strFichier <> "" ' Afficher le nom du fichier dans la fenêtre Exécution Debug.Print strFichier ' Fichier suivant strFichier = Dir Wend End Sub Sub TestDir2() Dim strDossier As String Dim strFichier As String ' Le dossier à analyser strDossier = "C:\Users\Hervé\Documents" ' Trouver tous les fichiers strFichier = Dir(strDossier & "\*.*", vbNormal) While strFichier <> "" ' Afficher le nom du fichier dans la fenêtre Exécution Debug.Print strFichier ' Fichier suivant strFichier = Dir Wend End Sub |
- Placez le curseur dans le premier bloc, exécutez : ça marche.
- Placez le curseur dans le second bloc, exécutez : ça marche aussi ! 🙂
Mais on n’a encore rien imbriqué : les deux blocs s’exécutent séparément…
Maintenant, modifiez le code pour que la procédure 1 appelle la procédure 2 (cf. lignes surlignées, dans le code ci-dessous) :
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 |
Sub TestDir1() Dim strDossier As String Dim strFichier As String ' Le dossier à analyser ' \ final obligatoire ici strDossier = "C:\Users\Hervé\Desktop" ' Trouver tous les fichiers strFichier = Dir(strDossier & "\*.*", vbNormal) While strFichier <> "" ' Afficher le nom du fichier dans la fenêtre Exécution Debug.Print strFichier ' Fichier suivant strFichier = Dir ' Appeler TestDir2 TestDir2 Wend End Sub Sub TestDir2() Dim strDossier As String Dim strFichier As String ' Le dossier à analyser ' \ final obligatoire ici strDossier = "C:\Users\Hervé\Documents" ' Trouver tous les fichiers strFichier = Dir(strDossier & "\*.*", vbNormal) While strFichier <> "" ' Afficher le nom du fichier dans la fenêtre Exécution Debug.Print strFichier ' Fichier suivant strFichier = Dir Wend End Sub |
Placez le curseur dans le premier bloc, exécutez : ça ne marche plus ! 🙁
Dans un prochain article on verra une solution parmi d’autres pour traiter ce problème.