Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Parcourir les fichiers d'un dossier
Avec cette nouvelle
astuce VBA Word, nous allons voir comment dresser le
listing des fichiers d'un dossier, avec attributs restitués sur le document actif. L'objectif est d'apprendre Ã
parcourir tous les éléments contenus dans un
dossier désigné par l'utilisateur, par le biais d'une
boîte de dialogue Office. Et c'est ainsi que dans un prochain volet, nous mettrons en pratique ces acquis pour réaliser la
conversion de tous les fichiers PDF d'un dossier en
fichiers Word modifiables.
Téléchargement des sources
Pour la mise en place de cette nouvelle
astuce, un document vierge fera parfaitement l'affaire. Nous proposons néanmoins de récupérer quelques
fichiers PDF à placer dans un dossier à scruter.
Nous réceptionnons
douze fichiers PDF. Il s'agit d'anciens
supports de formation à Excel. C'est pour cela qu'il sera intéressant de savoir les convertir en masse au
format Word dans le volet suivant. Nous bénéficierons ainsi de versions modifiables pour mettre à jour ces supports. Mais en attendant, nous devons commencer par apprendre Ã
parcourir un dossier à la recherche de ses fichiers.
Procédure et variables
Pour initialiser le traitement, nous devons commencer par créer les
bornes de la procédure de code. Et dans les bornes de cette procédure, nous devons
déclarer les variables nécessaires. Nous avons en effet besoin d'une
boîte de dialogue et de
variables pour
manipuler les fichiers.
- Démarrer Word et créer un nouveau document vierge,
- Puis, l'enregistrer tout de suite au format docm,
En effet, nous choisissons de
coder la macro à l'intérieur de ce nouveau document. Il doit donc être en mesure de prendre en charge les
instructions VBA.
- Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word,
- En haut de l'éditeur VBA, cliquer sur le menu Insertion,
- Dans les propositions, choisir l'option Module,
C'est ainsi qu'un
nouveau module, nommé
Module1, apparaît dans l'arborescence de l'
explorateur de projet sur la gauche de l'écran. Sa feuille de code s'affiche au centre de l'écran. Elle est vide pour l'instant.
- Dans cette feuille de code, créer la procédure listerFichiers comme suit :
Sub listerFichiers()
End Sub
- Dès lors, ajouter les déclarations de variables suivantes :
Sub listerFichiers()
Dim boite As FileDialog: Dim chemin As String
Dim objetFichier As Object: Dim leDossier As Object: Dim chaqueFichier AsObject
End Sub
Nous typons la
variable boite comme un
objet de type FileDialog pour piloter l'une des boîtes standard d'Office. Bien sûr, par le biais de cet objet, nous aurons besoin d'instancier la classe nécessaire pour hériter des propriétés et méthodes utiles. Nous typons la
variable chemin comme un texte (String). Son rôle est de mémoriser le chemin d'accès au dossier que désignera l'utilisateur par le biais de la boîte de dialogue. Enfin, nous typons les trois dernières variables :
objetFichier,
leDossier et
chaqueFichier comme des objets (Object) au sens large. La première doit instancier la classe permettant de
manipuler les fichiers du système. Grâce à ses propriétés héritées, la seconde deviendra un objet représentant le
dossier pointé. La dernière servira Ã
parcourir tous les fichiers dans ce dossier.
Réinitialiser le document
Ensuite, la
macro peut être amenée à être exécutée plusieurs fois de suite. En conséquence, entre deux importations, nous souhaitons purger les anciens
listings pour laisser place aux nouveaux.
- A la suite du code de la procédure, ajouter les deux instructions VBA suivantes :
...
Selection.WholeStory
Selection.Delete
...
La
méthode WholeStory de l'
objet VBA Selection permet de sélectionner l'intégralité du document. Dans l'enchaînement, la
méthode Delete de ce même objet permet d'effacer le contenu sélectionné, soit tout le contenu du document ici.
Boîte de dialogue des dossiers
Maintenant, nous devons afficher la
boîte de dialogue permettant à l'utilisateur de désigner un
dossier à parcourir. Et naturellement, nous devons
mémoriser le chemin d'accès à ce dossier pour les traitements à suivre.
- Toujours à la suite du code, ajouter maintenant les deux instructions VBA suivantes :
...
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then chemin = boite.SelectedItems(1)
...
Grâce à la
collection FileDialog de l'
objet VBA Application, nous instancions (Set) la classe des boîtes de dialogues. Avec le
paramètre msoFileDialogFolderPicker proposé par intelliSense, l'objet boite hérite des propriétés et méthodes pour piloter cette
boîte de dialogue. C'est la raison pour laquelle, nous l'affichons ensuite à l'écran (méthode Show) dans une
instruction conditionnelle. C'est seulement si l'utilisateur a pu s'en servir qu'il a été susceptible de
désigner un dossier. La
méthode SelectedItems de cette classe retourne la
collection des dossiers potentiellement sélectionnés. Ici, nous n'avons pas autorisé la multi sélection. Nous savons donc que le chemin est stocké dans la première rangée de cette collection (1). La suite du traitement ne peut être entreprise que si un
chemin d'accès est bien stocké dans la variable dédiée. Effectivement, l'utilisateur peut cliquer sur le
bouton Annuler pour abandonner la démarche.
- A la suite du code VBA, créer l'instruction conditionnelle suivante :
...
If chemin <> "" Then
End If
...
La suite des actions n'est donc autorisée qu'à partir du moment où la
variable chemin n'est pas vide (<>""), donc à partir du moment où un
chemin d'accès à traiter est bien défini.
La classe des fichiers
Poursuivons ! Le dossier à traiter est certes connu. Mais pour manipuler les fichiers qu'il contient, encore faut-il
instancier la classe donnant les propriétés et méthodes permettant de les dompter.
- Dans les bornes de l'instruction conditionnelle, ajouter les deux lignes VBA suivantes :
...
Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.getfolder(chemin)
...
Nous l'avons déjà appris, c'est la
fonction VBACreateObject qui permet de désigner certaines librairies en référence. Avec le
paramètre scripting.filesystemobject, la
variable objetFichier hérite de ses capacités à manipuler les fichiers du système. Dès lors, elle peut exploiter la
méthode getfolder pour récupérer le dossier désigné par la
variable chemin passée en paramètre. Et c'est ainsi que l'
objet leDossier représente ce répertoire.
Parcourir les fichiers du dossier
C'est grâce à cette
variable objet que nous sommes désormais en capacité de passer en revue tous les
fichiers contenus dans le dossier qu'elle représente. Pour cela et comme nous le savons, une
boucle for each est tout à fait dédiée.
- A la suite du code, toujours dans le If, créer la boucle For Each comme suit :
...
For Each chaqueFichier In leDossier.Files
If (Right(chaqueFichier, 4) = ".pdf") Then
End If
Next chaqueFichier
...
La
propriété Files de l'
objet leDossier renvoie la
collection des fichiers contenus dans l'emplacement désigné. Grâce à notre
variable objet chaqueFichier embarquée dans la
boucle For Each, nous les parcourons tous tour à tour. Mais à chaque passage, ici et spécifiquement pour les besoins du volet qui suivra, nous nous assurons de bien traiter des
fichiers PDF. Pour cela, nous exploitons la
fonction VBA Right qui permet de vérifier que les quatre derniers caractères du nom de fichier correspondent bien à l'
extension d'un document PDF.
Les attributs des fichiers
Pour poursuivre, la
classe que nous avons instanciée offre des
propriétés pour connaître par exemple le
nom du fichier ou encore sa
taille en Octets par exemple. Il est question de dresser un
listing sur le document actif. L'
objet VBA Selection va donc être massivement sollicité. Et pour cela nous l'avons appris, une technique permet d'optimiser et d'organiser le code dans un
bloc With.
- Dans l'instruction conditionnelle de la boucle For Each, créer le bloc With suivant :
...
With Selection
End With
...
C'est en effet l'
objet Selection qui va nous permettre d'insérer les informations les unes à la suite des autres avec des possibilités de mise en forme à la volée. Grâce à ce bloc, nous n'avons plus qu'à lister les propriétés à affecter pour construire l'énumération et donner vie au Listing. La
variable chaqueFichier désigne à chaque tour l'
objet du fichier en cours d'analyse par la
boucle. Et cet
objet offre des
propriétés permettant d'accéder à ses attributs comme son
nom pour commencer.
- Dans l'instruction With, ajouter les lignes VBA suivantes :
...
.Font.Bold = True
.TypeText chaqueFichier.Name & " :" & Chr(11)
.Font.Bold = False
...
Avant d'inscrire quelque qu'information que ce soit, nous prenons soin de passer la trame en
gras, grâce à la
propriété Bold de l'
objet Selection. Ensuite, nous exploitons la
méthode TypeText de ce même objet pour inscrire le
nom du fichier en cours d'analyse, grâce à la
propriété Name de la
classe instanciée. Puis, nous ajoutons par concaténation un
saut de ligne, grâce à la
fonction Chr avec la valeur 11 pour simuler l'action au clavier. Dès lors, nous prenons soin d'enlever l'attribut gras. En effet, sous ce titre représentant le nom du fichier, nous souhaitons lister ses attributs en toute simplicité.
Avant de poursuivre, nous pouvons réaliser un premier test à titre de vérification.
- Enregistrer les modifications (CTRL + S) puis exécuter le code (F5),
- Dans la boîte de dialogue programmée, désigner le dossier du téléchargement,
- Valider par Ok et basculer alors sur le document Word (ALT + Tab),
Comme vous pouvez l'apprécier, les noms de fichiers du dossier sont tous énumérés en gras, les uns en dessous des autres. Pour récupérer leurs attributs comme la taille, tout est une question de propriétés de cette classe instanciée.
- Revenir dans l'éditeur VBA Word (ALT + F11),
- A la suite dans le bloc With, ajouter les instructions VBA suivantes :
...
.TypeText "Taille : " & Round(chaqueFichier.Size / 1000, 0) & " Ko" & Chr(11)
.TypeText "Type : " & chaqueFichier.Type & Chr(11)
.TypeText "Création : " & chaqueFichier.DateCreated & Chr(11)
.TypeText "Modification : " & chaqueFichier.DateLastModified & Chr(13)
...
Très simplement, nous exploitons les
propriétés Size,
Type,
DateCreated et
DateLastModified pour connaître respectivement la
taille du fichier, son
extension et les
dates de création ainsi que de
modification. Notez néanmoins l'emploi de la
fonction Round pour transformer les
Octets divisés par Mille en
Kilos Octets. Cette fonction permet d'
arrondir le résultat. Ici en l'occurrence, avec le
chiffre zéro en second paramètre, nous indiquons que nous souhaitons des
tailles en Kilos Octets arrondies à l'unité.
Listing des fichiers sur le document
Il est temps de contempler le résultat.
- Enregistrer les modifications (CTRL + S) et exécuter le code (F5),
- Dans la boîte de dialogue qui s'invite, désigner le dossier de téléchargement des PDF,
- Puis, cliquer sur le bouton Ok et revenir sur le document Word (ALT + Tab),
Le point d'insertion est placé à la toute fin du document, mais comme vous pouvez le constater en remontant, ce sont bien les
fichiers et leurs attributs qui sont listés dans une présentation tout à fait acceptable.
Maintenant que nous savons
parcourir les fichiers d'un dossier et que nous savons
convertir un fichier PDF en version Word modifiable, grâce à l'
astuce VBA Word précédente, nous verrons dans le prochain volet comment organiser des
conversions de masse automatisées de ces fichiers avec un code unique.