Si vos programmes nécessitent de longues boucles de traitement qui font ramer l'application Excel, faites patienter vos utilisateurs en affichant une barre d'avancement. Celle-ci leur fournira aussi bien le taux d'avancement du programme que l'intitulé des opérations qui s'y déroulent.
Dans un nouveau classeur, rendez-vous à l'éditeur de code VBA et créez un nouveau UserForm.
Renommez le titre du UserForm1 en renseignement le champ Caption par "Veuillez patienter...".
Dans la fenêtre de propriétés (raccource F4), modifiez l'apparence du UserForm1 en lui attribuant des dimensions convenables pour une barre d'avancement (dans cet exemple : 388 x 91 pts) et en appliquant une image de fond si vous le souhaitez (voir tutoriel Enluminez vos formulaires avec un fond dégradé).
Insérez dans UserForm1 un contrôle ActiveX de type Label : il s'appellera par défaut Label1.
Configurez Label1 en lui attribuant les propriétés suivantes :
- BackStyle : 0 - fmBackStyleTransparent
- BorderStyle : 0 - fmBorderStyleNone
- Caption : (vide)
- SpecialEffect : 2 - fmSpecialEffectSunken
- Height : 18 pt
- Width : 360 pt
Insérez dans UserForm1 un second contrôle ActiveX de type Label : il s'appellera par défaut Label2.
Configurez Label2 en lui attribuant les propriétés suivantes :
- BackStyle : 0 - fmBackStyleTransparent
- BorderStyle : 0 - fmBorderStyleNone
- Caption : 100%
- Picture : appliquez par exemple l'image suivante image au format BMP, que vous aurez pris soin de créer sous PowerPoint, ou tout autre image dégradée aux couleurs de votre choix.
- PicturePosition : 12 - PicturePositionCenter
- SpecialEffect : 0 - fmSpecialEffectFlat
- TextAlign : 2 - fmTextAlignCenter
- Height : 16 pt (soit 2 pt de moins que Label1)
- Width : 358 pt (soit 2 pt de moins que Label1)
Insérez dans UserForm1 un troisième contrôle ActiveX de type Label : il s'appellera par défaut Label3.
Placez-le sous les deux précédents labels : il servira à indiquer à l'utilisateur les opérations en cours.
Configurez Label3 en lui attribuant les propriétés suivantes :
- BackStyle : 0 - fmBackStyleTransparent
- BorderStyle : 0 - fmBorderStyleNone
- Caption : Mettez ici vos indications sur l'état d'avancement du programme...
- Picture : (vide)
- SpecialEffect : 0 - fmSpecialEffectFlat
- TextAlign : 2 - fmTextAlignCenter
Passons au codage de la barre d'avancement. Dans votre projet VBA, créez un nouveau module : il s'appellera par défaut Module1. Copiez-collez dans la zone de code de Module1 les lignes suivantes :
Sub MonProgramme()
'============================================
'Initialisation de la barre d'avancement à 0%
'============================================
UserForm1.Label2.Width = 0
UserForm1.Label2 = "0%"
UserForm1.Label3.Caption = "Lancement du programme"
'============================================
'Afficher la fenêtre d'avancement
'============================================
UserForm1.Show (0)
'============================================
'Déroulement graduel du programme
'============================================
'...Remplacer la ligne suivante par votre code...'
MsgBox "Avancement : 0%"
'Avancement à 25% : la largeur totale de la barre d'avancement sera plus petit que la zone de fond de 2 pts
UserForm1.Label2.Width = 0.25 * (UserForm1.Label1.Width - 2)
UserForm1.Label2.Caption = "25%"
UserForm1.Label3.Caption = "Réalisation de l'opération n° 1"
'...Remplacer la ligne suivante par votre code...'
MsgBox "Avancement : 25%"
'Avancement à 50% : la largeur totale de la barre d'avancement sera plus petit que la zone de fond de 2 pts
UserForm1.Label2.Width = 0.5 * (UserForm1.Label1.Width - 2)
UserForm1.Label2.Caption = "50%"
UserForm1.Label3.Caption = "Réalisation de l'opération n° 2"
'...Remplacer la ligne suivante par votre code...'
MsgBox "Avancement : 50%"
'Avancement à 75% : la largeur totale de la barre d'avancement sera plus petit que la zone de fond de 2 pts
UserForm1.Label2.Width = 0.75 * (UserForm1.Label1.Width - 2)
UserForm1.Label2 = "75%"
UserForm1.Label3.Caption = "Réalisation de l'opération n° 3"
'...Remplacer la ligne suivante par votre code...'
MsgBox "Avancement : 75%"
'============================================
'Complétion de la barre d'avancement à 100%
'============================================
UserForm1.Label2.Width = UserForm1.Label1.Width - 2
UserForm1.Label2 = "100%"
UserForm1.Label3.Caption = "Fin du programme"
'============================================
'Fermer la fenêtre d'avancement
'============================================
'...Supprimer la ligne suivante...'
MsgBox "Avancement : 100%"
UserForm1.Hide
End Sub
'============================================
'Initialisation de la barre d'avancement à 0%
'============================================
UserForm1.Label2.Width = 0
UserForm1.Label2 = "0%"
UserForm1.Label3.Caption = "Lancement du programme"
'============================================
'Afficher la fenêtre d'avancement
'============================================
UserForm1.Show (0)
'============================================
'Déroulement graduel du programme
'============================================
'...Remplacer la ligne suivante par votre code...'
MsgBox "Avancement : 0%"
'Avancement à 25% : la largeur totale de la barre d'avancement sera plus petit que la zone de fond de 2 pts
UserForm1.Label2.Width = 0.25 * (UserForm1.Label1.Width - 2)
UserForm1.Label2.Caption = "25%"
UserForm1.Label3.Caption = "Réalisation de l'opération n° 1"
'...Remplacer la ligne suivante par votre code...'
MsgBox "Avancement : 25%"
'Avancement à 50% : la largeur totale de la barre d'avancement sera plus petit que la zone de fond de 2 pts
UserForm1.Label2.Width = 0.5 * (UserForm1.Label1.Width - 2)
UserForm1.Label2.Caption = "50%"
UserForm1.Label3.Caption = "Réalisation de l'opération n° 2"
'...Remplacer la ligne suivante par votre code...'
MsgBox "Avancement : 50%"
'Avancement à 75% : la largeur totale de la barre d'avancement sera plus petit que la zone de fond de 2 pts
UserForm1.Label2.Width = 0.75 * (UserForm1.Label1.Width - 2)
UserForm1.Label2 = "75%"
UserForm1.Label3.Caption = "Réalisation de l'opération n° 3"
'...Remplacer la ligne suivante par votre code...'
MsgBox "Avancement : 75%"
'============================================
'Complétion de la barre d'avancement à 100%
'============================================
UserForm1.Label2.Width = UserForm1.Label1.Width - 2
UserForm1.Label2 = "100%"
UserForm1.Label3.Caption = "Fin du programme"
'============================================
'Fermer la fenêtre d'avancement
'============================================
'...Supprimer la ligne suivante...'
MsgBox "Avancement : 100%"
UserForm1.Hide
End Sub
Enfin, lançons le teste de cette barre d'avancement : placez le curseur de votre souris n'importe où sur les lignes de la procédure MonProgramme() puis appuyez sur la touche F5 pour lancer son exécution.
Vous allez pouvoir observer la progression graduelle de votre barre d'avancement, en répondant à chaque MessageBox qui s'affichera. Pour mieux observer l'avancement, n'hésitez pas à déplacer la MessageBox avant de valider en cliquant "OK".
Voilà une barre d'avancement que vous pourrez configurer et utiliser pour tous vos programmes qui nécessitent un certain temps d'attente (boucles de recherche ligne à ligne, sauvegarde ou copie de fichier, ...). Pour configurer cette barre selon vos propres besoins, n'hésitez pas à me contacter si vous rencontrez des difficultés.
Est il possible d'optimiser le rafraichissement de l'user form ? en effet, lors de l’exécution, la fenêtre reste blanche pendant que la macro s’exécute
RépondreSupprimer