Liste triée de fichiers en VBA
Dans l’article d’hier, vous avez pu voir comment trier une liste de chaînes grâce à l’algorithme QuickSort. Mais on s’était arrêté sur un exemple un peu théorique. Aujourd’hui, on va se servir de cette méthode pour obtenir une liste triée des fichiers d’un dossier précis.
Le problème
VBA propose une commande (Dir
) pour extraire le nom de tous les fichiers d’un dossier. Mais rien ne garantit que cette liste soit triée alphabétiquement.
Pour tester, recopiez ce qui suit dans un module standard de votre base de données, et exécutez-le. Vous verrez une liste de fichiers dans la fenêtre Exécution (Ctrl
+ G
), et cette liste sera triée… ou pas !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
' --- ' LISTE NON TRIEE DE FICHIERS ' --- Sub FileListDemo() ' Quelques variables... Dim strPath As String Dim strFile As String ' Un chemin pour tester... strPath = "C:\Users\Hervé\Documents\AccessBackup*.accdb" ' Afficher la liste (non triée) des fichiers ' correspondant à l'extension donnée strFile = Dir(strPath) While strFile <> "" Debug.Print strFile strFile = Dir Wend End Sub |
Parfois, vous n’aurez pas besoin d’une liste triée, et le programme ci-dessus suffira. Mais si les fichiers doivent être triés, vous devrez :
- Soit trier les noms de fichiers par la procédure QuickSort (ou une méthode de tri équivalente).
- Soit stocker les fichiers dans une table, puis trier celle-ci par requête.
On suppose ici que les noms de fichiers ne doivent pas être stockés. On va donc s’attaquer à la solution 1 !
Le code
On doit donc écrire une variante de ce qui précède, mais cette fois :
- En stockant les noms de fichiers (leur chemin complet, en fait) dans un tableau VBA.
- En appelant la procédure
QuickSort
pour trier ce tableau.
Pour faire tout ça :
- Vérifiez que votre base de données comporte la fonction AddBackSlash().
- Vérifiez aussi que vous disposez de la procédure QuickSort.
- Recopiez ce qui suit dans un module standard de votre base. La fonction renvoie un tableau trié des chemins de fichiers.
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 |
' --- ' LISTE TRIEE DES FICHIERS D'UN DOSSIER PRECIS ' --- Public Function FileList( _ ByVal strPath As String, _ ByVal strExtension As String) _ As String() ' Quelques variables... Dim astrFiles() As String Dim strFile As String Dim lngIndex As Long ' Ajouter un au chemin par sécurité strPath = AddBackslash(strPath) ' Obtenir la liste (non triée) des fichiers ' correspondant à l'extension donnée lngIndex = 1 strFile = Dir(strPath & strExtension) While strFile <> "" ReDim Preserve astrFiles(1 To lngIndex) astrFiles(lngIndex) = strPath & strFile lngIndex = lngIndex + 1 strFile = Dir Wend ' Trier la liste par ordre alphabétique QuickSort astrFiles, 1, UBound(astrFiles) ' Résultat final FileList = astrFiles End Function |
Tester
Pour tester tout ça :
- Recopiez également le code qui suit dans votre module standard.
- Modifiez le chemin et/ou l’extension passés à la fonction
FileList()
. - Exécutez-le code.
1 2 3 4 5 6 7 8 9 |
Public Function ListeAlphaFichiers() Dim astrFiles() As String Dim varPath As Variant astrFiles = FileList("C:\Users\Hervé\Documents\AccessBackup", "*.accdb") For Each varPath In astrFiles Debug.Print varPath Next End Function |
Bonjour,
Comment faire la même chose, mais en affectant chaque ligne de résultat dans une table, par exemple dans une table avec les champs NomFichierComplet (chemin absolu = répertoire absolu + nom fichier + extension fichier) | NomFichier (nom fichier + extension fichier), et insérer dans le même ordre d’idées par exemple la durée (fichiers multimédia) ?
Merci par avance
L’article Stocker tous les fichiers d’un répertoire dans une table Access est sans doute très proche du résultat souhaité. On peut aussi obtenir facilement des informations comme la date et la taille du fichier.
Par contre, pour la notion de durée d’un morceau, de résolution d’une image, etc., il n’y a pas d’outil natif, il faut sans doute extraire les méta-informations du fichier ou passer par des bibliothèques tierces, qui doivent exister.