formateur informatique

Barre de progression sur un formulaire en VBA Word

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Barre de progression sur un formulaire en VBA Word
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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.

Barre de progression ProgressBar sur formulaire VBA Word

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.
  • Télécharger le document barre-progression-formulaire.docm en cliquant sur ce lien,
  • Double cliquer alors sur le fichier réceptionné pour l'ouvrir dans Word,
  • Ensuite, cliquer sur le bouton Activer la modification du bandeau de sécurité,
  • Enfin, cliquer sur le bouton Activer les macros de l'alerte, si nécessaire,
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.

Formulaire VBA Word pour convertir les fichiers PDF dans un dossier
  • 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,
Chercher des contrôles supplémentaires pour un formulaire VBA Word

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,
Ajouter un contrôle ProgressBar sur un formulaire VBA Word

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,
Propriétés de la barre de progression en VBA Word

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,
Barre de progression VBA Word qui grandit au fur et à mesure du traitement par le code

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.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn