Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Barre de progression VBA Word
A l'occasion de l'
astuce VBA Word précédente, nous avons conçu une petite application permettant de
convertir tous les fichiers PDF d'un dossier au format Word . L'objectif était de pouvoir reproduire des versions modifiables à partir de vues instantanées figées. Mais lorsque les fichiers à convertir sont nombreux, une indication manque. Il s'agit de l'indice de progression du traitement.
Dans l'exemple finalisé illustré par la capture, nous avons amélioré la solution. Une
barre de progression rend instantanément compte de l'état d'avancement des conversions entreprises dans le dossier désigné par l'utilisateur. Et lorsque la procédure est terminée, la
barre de progression reste figée à 100% tandis qu'un message de confirmation apparaît.
Document source
Pour embarquer cette nouvelle solution à développer, nous proposons d'agir à partir du
document Word offrant déjà ce
formulaire réalisant ces
conversions de masse .
Comme vous pouvez le voir, nous débouchons sur un document vierge. Mais ce qui nous intéresse est ce qui se trame derrière.
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word ,
Dans l'explorateur de projet sur la gauche, déployer le dossier nommé Feuilles ,
Puis, double cliquer sur l'icône convertirTousPDF ,
Nous affichons ainsi le
UserForm en mode conception au centre de l'écran. C'est lui qui permet de
convertir tous les fichiers PDF d'un dossier en
versions modifiables Word . Un clic sur le bouton à l'icône du dossier, en haut à droite du formulaire, permet à l'utilisateur de
sélectionner un dossier contenant les
fichiers PDF Ã convertir . Ensuite, un clic sur le bouton Convertir en bas du formulaire permet de lancer le traitement.
Enfoncer la touche F5 du clavier pour exécuter le formulaire ,
Désigner un dossier contenant des fichiers PDF en cliquant sur le bouton à l'icône du dossier,
Puis, cliquer sur le bouton Convertir pour procéder,
Comme vous pouvez l'apprécier, le processus prend un certain temps, mais vous voyez défiler tour à tour les contenus des
documents PDF sur le
document Word en cours. A l'issue du traitement, la vue reste figée sur le dernier contenu importé. Et si vous affichez le dossier en question dans l'explorateur Windows, vous avez le plaisir de constater la présence de toutes les
versions modifiables de ces
documents PDF au
format Word .
La barre de progression
Avant toute chose, nous devons commencer par implanter une
barre de progression sur le
UserForm . Mais contre toute attente, le
progressBar n'est pas un contrôle disponible par défaut dans la
boîte à outils . Cependant, il est accessible en référence externe. Et c'est ce que nous proposons de démontrer.
Revenir dans l'éditeur VBA Word ,
Cliquer sur le formulaire en conception pour le sélectionner explicitement,
Cette action a pour effet d'afficher la
boîte à outils avec ses contrôles. Et effectivement, celui du
ProgressBar n'est pas présent. Si cette boîte à outils n'est pas visible malgré tout, vous pouvez la rendre disponible par le biais du
menu Affichage .
Cliquer droit sur un emplacement vide de cette boîte, par exemple à droite du dernier contrôle,
Dans le menu contextuel, choisir la commande Contrôles supplémentaires ,
Une boîte de dialogue apparaît. Tous les contrôles disponibles supplémentaires sont organisés par ordre alphabétique.
Cocher la case du contrôle Microsoft ProgressBar ,
Puis, valider l'ajout par le bouton Ok,
Comme vous pouvez le voir, ce
contrôle du ProgressBar apparaît en dernière position dans la
boîte à outils .
Cliquer sur ce nouveau contrôle pour le sélectionner,
Puis, le tracer à l'horizontale au-dessus des boutons Convertir et Quitter,
La barre de progression est ainsi matérialisée. Ses attributs apparaissent listés dans la
fenêtre Propriétés . Là encore, si elle n'est pas visible, vous pouvez la rendre disponible par le biais du
menu Affichage .
Dans sa propriété (Name) , remplacer le nom par défaut par l'intitulé Barre ,
Deux autres propriétés vont nous intéresser très vite. Il s'agit des
attributs Max et Min . La seconde est déjà bien calibrée. La première doit être étalonnée sur le
nombre de fichiers détectés dans le dossier à traiter. Cette information, nous devons l'obtenir par le
code . En conséquence, nous règlerons cette propriété dynamique, aussi par le
code VBA .
Compter les fichiers d'un dossier
Comme nous venons de l'expliquer, nous devons obtenir l'information sur le
nombre de fichiers à convertir . Pour cela, nous proposons de créer une fonction indépendante. Elle devra être appelée par la
procédure du bouton Convertir afin de récolter l'indication au moment opportun.
Sur le formulaire en conception, double cliquer sur le bouton Quitter ,
Nous basculons ainsi dans la procédure de code VBA associée au bouton Quitter (Quitter_Click).
Sous cette procédure, après le End Sub, créer la fonction Compte comme suit :
Function compte()
End Function
Dans les bornes de cette fonction, ajouter les déclarations de variables suivantes :
...
Dim objFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
Dim compteur As Integer
compteur = 0
...
Il s'agit exactement des mêmes techniques que celles que nous avons exploitées et expliquées lors du volet précédent pour parcourir les fichiers d'un dossier. C'est la raison pour laquelle nous commençons par déclarer trois
variables objets . Nous les affecterons par la suite. La
variable compteur porte bien son nom. Elle est destinée Ã
compter les fichiers parcourus . C'est pourquoi nous la déclarons comme un
entier (Integer) puis nous l'initialisons à zéro.
Nous devons maintenant instancier la classe permettant de manipuler les fichiers et dossiers du disque. Et pour cela, comme nous l'avons fait là encore dans le volet précédent, nous allons employer la
fonction VBA CreateObject avec l'
argument scripting.filesystemobject .
A la suite du code de la fonction, ajouter les deux initialisations suivantes :
...
Set objFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objFichier.GetFolder(Chemin.Value)
...
En instanciant cette classe, l'
objet objFichier hérite de ses
propriétés et
méthodes . C'est ainsi que nous appelons sa
méthode GetFolder en lui passant le chemin d'accès désigné par l'utilisateur et mémorisé dans la
zone de saisie Chemin . De fait, l'
objet leDossier représente désormais le répertoire à scanner.
C'est grâce à cette
variable leDossier que nous allons maintenant pouvoir passer en revue tous les
fichiers contenus dans le dossier . Et pour cela, nous avons besoin d'une
boucle For Each .
A la suite du code, créer la boucle For Each comme suit :
...
For Each chaqueFichier In leDossier.Files
Next chaqueFichier
...
Nous le savons, c'est la
propriété Files de l'objet ainsi hérité qui fournit la
collection des fichiers dans le dossier qu'il représente. Et grâce à la
variable chaqueFichier ainsi amorcée par la
boucle For Each , nous les parcourons tous.
Ensuite, le compteur ne doit être incrémenté que dans la mesure où il s'agit bien de
fichiers PDF . Un test s'impose. Et pour cela, une
instruction conditionnelle est nécessaire.
Dans la boucle For Each, ajouter l'instruction conditionnelle suivante :
...
If (Right(chaqueFichier, 4) = ".pdf") Then
compteur = compteur + 1
End If
...
C'est donc dans la mesure où les
quatre derniers caractères du nom du fichier correspondent bien à l'
extension Pdf que nous
incrémentons la variable compteur . Il est à noter que le
langage VBA est très permissif. Nous aurions dû préciser la
propriété Name pour la
variable chaqueFichier afin d'obtenir le nom de l'élément en cours. Mais il s'agit de la
propriété par défaut . Et dans ces conditions, en l'absence de précision, le
VBA plonge sur cette dernière.
Il ne nous reste plus qu'Ã
retourner la valeur calculée à l'issue du traitement de la
boucle . Et pour cela comme vous le savez en
VBA , c'est le
nom même de la
fonction qui doit être utilisé.
Après la boucle For Each , ajouter l'affectation suivante :
Function compte()
Dim objFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
Dim compteur As Integer
compteur = 0
Set objFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objFichier.GetFolder(Chemin.Value)
For Each chaqueFichier In leDossier.Files
If (Right(chaqueFichier, 4) = ".pdf") Then
compteur = compteur + 1
End If
Next chaqueFichier
compte = compteur
End Function
Etalonner la barre de progression
Désormais, dans la procédure associée au
bouton Convertir , nous devons appeler cette
fonction Compte avant que le traitement des fichiers PDF ne commence. Nous récupèrerons ainsi l'information sur le nombre total d'éléments à traiter. Nous pourrons donc étalonner la
valeur max de la
barre de progression et l'incrémenter à chaque fichier converti pour la faire progresser. Elle rendra ainsi parfaitement compte de l'état d'avancement du processus.
Sur le formulaire en conception, double cliquer sur le bouton Convertir ,
Nous basculons ainsi dans le
code VBA Word entre les bornes de la
procédure Convertir_Click .
Au début de la première instruction conditionnelle , ajouter les deux lignes VBA suivantes :
...
If Chemin.Value <> "" Then
Barre.Max = compte
Barre.Value = 0
Set objFichier = CreateObject("scripting.filesystemobject")
...
En effet, cette procédure, avant d'entamer le processus de
conversion des fichiers PDF s'assure tout d'abord qu'un
chemin d'accès a bien été indiqué par l'utilisateur. Ce chemin est stocké dans la zone de saisie nommée
chemin . C'est par sa
propriété Value que nous accédons à son contenu.
Nous affectons le résultat retourné par la
fonction compte à la
propriété Max du
ProgressBar nommé
Barre . Ainsi, il dispose automatiquement du même
nombre de graduations qu'il y a de fichiers à traiter. Puis, nous initialisons la valeur de départ à zéro, puisque le traitement n'a pas encore été amorcé.
Maintenant, nous devons faire évoluer la
barre de progression d'une unité supplémentaire à chaque fois qu'un
fichier PDF a été converti. L'intégration du code doit donc se faire à la
fin de l'instruction conditionnelle encapsulée dans la
boucle For Each .
A la fin de l'instruction conditionnelle du For Each , ajouter la ligne VBA suivante :
...
ActiveDocument.SaveAs2 Replace(leChemin, ".pdf", ""), wdFormatDocumentDefault
docPDF.Close
Barre.Value = Barre.Value + 1
End If
Next chaqueFichier
...
Après chaque enregistrement d'un fichier PDF au format Word modifiable, nous rendons donc compte de la
progression en incrémentant la
valeur de la barre de progression . C'est à chaque fois une graduation supplémentaire qui apparaîtra en couleur.
Il nous reste un petit réglage à peaufiner, question d'ergonomie. Il s'agit d'afficher un message de confirmation au-dessus de la
barre de progression , dans l'étiquette nommée
zoneMessage . Bien sûr, cette indication doit apparaître seulement lorsque le traitement de conversion est intégralement abouti. Le code doit donc être intégré
après la boucle For Each .
Avant le End If de la première instruction conditionnelle, ajouter la ligne VBA suivante :
...
instanceW.Quit
Set docPDF = Nothing
Set instanceW = Nothing
zoneMessage.Caption = "Conversions terminées !"
End If
End Sub
...
C'est en effet la
propriété Caption qui permet d'affecter le contenu d'une étiquette (Label).
Enregistrer les modifications (CTRL + S) et exécuter le formulaire (F5),
Désigner un dossier contenant des fichiers PDF à l'aide du bouton à l'icône d'un dossier,
Puis, cliquer sur le bouton Convertir pour démarrer la conversion de masse,
Comme vous pouvez l'apprécier, les contenus des fichiers PDF sont importés tour à tour. Et avant que l'un ne passe la main au suivant, les
graduations colorées de la barre de progression avancent rendant parfaitement compte du travail déjà accompli et du travail restant à faire. A l'issue, la vue reste figée sur le dernier contenu, la barre de progression est pleine et le message de confirmation apparaît.