Sur l'exemple illustré par la capture, l'utilisateur clique tout d'abord sur un bouton placé sur la droite du tableau. Dans la boîte de dialogue qui suit, il désigne et valide un dossier du disque dur. De retour sur la feuille Excel, il récolte tous les noms des fichiers hébergés par ce dossier avec quelques détails comme les extensions, les tailles et dates de dernières modifications.
Classeur Excel à télécharger
Pour développer cette solution, nous proposons de récupérer un classeur Excel offrant notamment ce bouton de commande.
Double cliquer sur le fichier réceptionné pour l'ouvrir dans Excel,
Puis, cliquer sur le bouton Activer la modification du bandeau de sécurité,
Nous découvrons donc la grille d'importation accompagnée d'un bouton à l'icône d'un dossier sur la droite de la feuille.
La procédure et ses variables
Il existe déjà une procédure attachée au bouton mais elle est vide pour l'instant.
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel,
C'est ainsi que vous découvrez la présence de la procédure dossier_MouseUp. Son code se déclenchera juste après le clic de l'utilisateur sur ce bouton à l'icône du dossier.
Dans les bornes de cette procédure, ajouter les déclarations de variables suivantes :
...
Dim boite As FileDialog: Dim chemin As String: Dim ligne As Integer: Dim leFichier As String
Dim objetFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
Range("B6:F1000").Value = ""
...
Nous déclarons différents types de variables : boite pour instancier la classe des boîtes de dialogue standard, chemin pour reconstituer le chemin d'accès au dossier désigné, leFichier pour construire le chemin d'accès complet jusqu'au fichier en cours d'analyse. Les trois dernières variables sont typées comme des objets. Après instanciation d'une certaine classe, elles permettront de manipuler les fichiers et les dossiers du disque.
Enfin, nous réinitialisons la plage d'extraction sur la feuille (Range("B6:F1000").Value = "") pour la purger de la précédente potentielle importation, avant de procéder à la nouvelle.
La classe des boîtes de dialogue
Maintenant que les variables sont déclarées, nous allons pouvoir les initialiser en commençant par l'instanciation de la classe des boîtes de dialogue standard. C'est en effet par le biais de l'une d'entre elles que l'utilisateur doit désigner un dossier à analyser.
A la suite du code, ajouter les instructions VBA suivantes :
...
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then chemin = boite.SelectedItems(1)
If chemin <> "" Then
ligne = 6
[B3].Value = "Chemin : " & chemin
End If
...
Nous initialisons notre objet boite sur la classe des boîtes de dialogues (Set boite). Il hérite ainsi de ses propriétés et méthodes. Et justement, nous exploitons deux d'entre elles dans l'enchaînement. La méthode Show permet d'afficher la boîte de dialogue. La propriété SelectedItems renvoie la collection des dossiers désignés. Par défaut, le dossier ouvert est situé sur le premier emplacement (1) dans cette collection. Nous stockons son adresse dans la variable chemin.
Avant de poursuivre, nous nous assurons qu'un dossier a bien été désigné (chemin <> ""). Nous calons l'indice de ligne sur la sixième, la première ligne à partir de laquelle doit débuter l'importation. Puis, nous restituons le chemin d'accès en cours d'analyse, dans la cellule B3 fusionnée, en haut de la feuille.
Manipuler les fichiers
Puisque nous connaissons désormais l'adresse du dossier à analyser, il est temps d'instancier la classe permettant de manipuler les fichiers qu'il contient.
A la suite du code de l'instruction conditionnelle, ajouter les instructions VBA suivantes :
...
Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.getfolder(chemin)
For Each chaqueFichier In leDossier.Files
leFichier = chemin & "\" & chaqueFichier.Name
Next chaqueFichier
...
Nous instancions la classe des fichiers pour initialiser l'objet objetFichier (Set objetFichier). Dès lors, grâce à sa méthode héritée getfolder, nous initialisons la variable leDossier (Set leDossier), pour représenter le dossier choisi par l'utilisateur. C'est ainsi que nous pouvons enclencher une boucle destinée à parcourir chaque fichier (For Each chaqueFichier) dans (In) la collection des fichiers hébergés par ce dossier (leDossier.Files). A chaque passage dans cette boucle, nous reconstruisons le chemin d'accès au fichier en cours d'analyse (chemin & "\" & chaqueFichier.Name) et nous le stockons dans la variable leFichier.
Les propriétés des fichiers
Il existe des fonctions VBA bien spécifiques pour récolter les attributs des fichiers parcourus. Et nous proposons de les exploiter avant même de récupérer le nom de chaque fichier. Nous allons comprendre pourquoi.
A la suite du code de la boucle, ajouter les instructions VBA suivantes :
Grâce à la méthode héritée GetExtensionName de notre objet objetFichier, nous récupérons l'extension du fichier en cours d'analyse que nous inscrivons en quatrième colonne de la feuille pour la ligne en cours (Cells(ligne, 4)). C'est ensuite la fonction FileLen qui renseigne sur la taille en octets du fichier qui lui est passé en paramètre. Nous transformons cette taille en Kilos Octets (/ 1000), sans décimales grâce à la fonction Round. Nous l'inscrivons en cinquième colonne du tableau pour la ligne en cours. Enfin, la fonction FileDateTime retourne la date de dernière modification pour le fichier qui lui est passé en paramètre. Nous l'inscrivons en sixième et dernière colonne du tableau pour la ligne en cours. Bien sûr, à chaque passage dans cette boucle, nous n'oublions pas d'incrémenter la variable ligne (ligne = ligne + 1), pour poursuivre l'écriture sur les lignes du dessous, dans le tableau d'importation.
Récupérer le nom du fichier
Ensuite et nous le savons, la propriété Name de l'objet chaqueFichier renseigne sur le nom du fichier en cours d'analyse mais avec son extension. Nous proposons de supprimer cette dernière grâce à la fonction Replace en utilisant l'information désormais détenue par la cellule en quatrième colonne (Cells(ligne, 4).Value).
Au milieu des instructions précédentes, ajouter l'instruction VBA suivante :
Sur le nom du fichier en cours (chaqueFichier.Name), nous remplaçons son extension ("." & Cells(ligne, 4).Value) par une chaîne vide (""), pour la supprimer.
Détruire les objets
Pour terminer, une fois l'analyse des fichiers complétée, nous devons détruire les variables objets afin de soulager la mémoire de l'ordinateur.
A la toute fin du code, ajouter les lignes VBA suivantes :
...
End If
Set boite = Nothing
Set objetFichier = Nothing
Set leDossier = Nothing
Set chaqueFichier = Nothing
End Sub
...
Enregistrer les modifications (CTRL + S) et basculer sur la feuille Excel (ALT + Tab),
Cliquer sur le bouton à l'icône du dossier,
Ouvrir un dossier et cliquer sur le bouton Ok pour revenir sur la feuille,
Comme vous pouvez l'apprécier, tous les noms des fichiers du dossier sont aussitôt rapatriés sur la feuille Excel, avec leurs propriétés.