lundi 4 juin 2012

Réalisez une barre d'avancement pour vos programmes


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)
Sélectionnez Label1 et Label2 et procédez à leur alignement en utilisant la fonction "Aligner" du menu "Format" de l'éditeur de code : sélectionner "Centre" puis "Milieu". Ainsi, Label 1 étant légèrement plus grand que Label2, on obtient ainsi un effet d'inclusion de Label 2 dans 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

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.

Téléchargez le fichier

Enluminez vos formulaires avec un fond dégradé


Vous avez pu constater l'effet lumineux d'un remplissage dégradé de cellules dans le tutoriel Oubliez les remplissages en aplats : privilégiez les dégradés.

Voici à présent un rapide tutoriel qui vous démontrera que l'usage des dégradés dans vos UserForms peut aussi redonner vie à vos formulaires.
Pour commencer, nous allons réaliser une image de fond pour le formulaire. Créez sous PowerPoint un rectangle sans bordure et à remplissage dégradé de la couleur de votre choix. Enregistrez-le comme image au format BMP comme l'indique l'illustration ci-dessous.


Dans un nouveau classeur, rendez-vous à l'éditeur de code VBA et créez deux UserForms :
  • UserForm1 : laissez le fond gris par défaut, on ne modifiera rien.
  • UserForm2 : appliquez une image de fond que vous aurez pris de soin de réaliser sous PowerPoint. Dans la fenêtre de propriétés du UserForm (raccourci F4), veillez à bien renseigner le paramètre PictureSizeMode en lui attribuant la valeur 1 - fmPictureSizeModeStretch.

Dans la fenêtre d'exécution (raccourci Ctrl+G), lancez l'affichage des deux formulaires en tapant successivement les requêtes suivantes suivies d'un appui sur la touche "Enter" :
UserForm1.Show (0) 
puis remplacez cette ligne par
UserForm2.Show (0) 

En retournant dans le classeur et en déplaçant les fenêtres de formulaire de sorte à ce qu'elles ne se chevauchent pas,  vous allez alors pouvoir constater par vous-mêmes la nette amélioration de rendu qu'apporte le fond dégradé du UserForm2.


Cette solution est certes quelque peu couteuse en termes de taille de fichier, mais n'est pas rédhibitoire pour le fonctionnement fluide de vos formulaires.