Créer ses propres boîtes de dialogue
ou interface graphique

Accueil     VBA5  plus loin avec  Userforms    Communiquer avec un port série (RS232)

auteur:    Christian Herbé
date:       mai 2000
MAJ:      juin 2001


Si vous maîtrisez les bases de VBA et que vous êtes pressé, allez voir le résumé à la fin de cette page !

vous pouvez être amené à créer des boîtes de dialogue pour rendre vos programmes plus conviviaux ou pour faciliter le dialogue avec l'utilisateur notamment dans le cas de choix multiples.
Les boîtes sont crées à partir d'un "USERFORM" . Comme pour les modules, VBA ne les crée pas automatiquement; il faut les insérer dans le projet:

En plus de la grille (le userform) vous remarquez qu'une nouvelle fenêtre est apparue; elle s'appelle "Boîte à outils" ; votre écran devrait ressembler à ceci:


 

La boîte à outils contient les éléments que vous pouvez utiliser depuis le userform. Nous allons décrire brièvement les principaux; il suffit de passer avec le curseur de la souris sur chaque icône pour que le nom s'affiche.
 
 

Intitulés   Vous permettent d'afficher un texte (ex: un titre pour un objet)
Zone de texte Peuvent recevoir un texte entré par l'utilisateur 
Zone de liste modifiable Permettent à l'utilisateur de choisir un ou plusieurs éléments dans une liste
Case à cocher Pour faire un choix de type "oui ou non" 
Cadre Pour encadrer un ou plusieurs objets
Bouton de commande On les utilise généralement pour lancer une procédure

Si vous souhaitez plus d'informations, cliquez sur l'outil et glissez le sur le userform puis appuyez sur la touche F1 du clavier pour obtenir de l'aide.
Vous pouvez ajouter d'autres objets à la boîte à outils par un clic droit sur celle-ci et sélectionner "Contrôles supplémentaires. Je vous conseille d'ajouter tout de suite l'objet "RefEdit.Ctrl"; il permet à l'utilisateur de sélectionner une plage de cellules dans la feuille Excel et au programme d'utiliser ultérieurement les références de cette plage.
Pour qu'un programme contenant une boîte de dialogue personnalisée fonctionne, il doit contenir un module et un userform. Si votre projet ne contient pas encore de module, insérez le maintenant. Le rôle du module peut être limité à lancer le userform mais ce rôle est  obligatoire dans la plupart des cas.

Nous allons commencer par écrire un programme très sommaire, le but étant de décrire l'enchaînement des opérations. On va donc se limiter à afficher un message personnalisé de bienvenue.

sub bonjour_toi()
    userform1.show
end sub

la commande "userform1.show" sert à afficher le userform; notre module peut ne contenir que ce programme. Le reste du code sera écrit dans le userform ou dans les objets.
 

Vous êtes dans le code lié au bouton; à chaque fois que l'utilisateur cliquera sur le bouton, c'est ce code qui sera exécuté.
En haut à gauche, vous avez le nom de l'objet: "CommandButton1"; en haut à droite, le type d'événement géré par cette sub. Remarquez aussi le nom de la sub.
Le but du programme étant d'afficher une message de bienvenue, entrez le code suivant :

Private Sub CommandButton1_Click()
    dim utilisateur, bonjour as string
    utilisateur = environ("username")
    bonjour = msgbox(prompt:="Bonjour M ou Mme ou Mlle  " & utilisateur, title:="Ma 1ere boite de dialogue")
    'décommenter la ligne suivante pour que le programme se termine après l'affichage du message
    'unload me
End Sub
(pour afficher le nom d'utilisateur, il faut que vous ayez entré un nom d'utilisateur au démarrage de Windows)
 

Je sens votre impatience! Bien que le programme ne soit pas tout à fait terminé, vous pouvez déjà le tester. Double cliquez sur le bouton; son code apparaît. appuyez sur la touche F5 ou allez dans les menus "Exécution | Exécuter ..." .

Il manque quelque chose sur notre grille non ? Bien que l'on puisse arrêter le programme en cliquant sur la croix en haut à droite de la boite de dialogue, il serait plus élégant de mettre un bouton pour quitter le programme:
 

A partir de là, notre programme est fonctionnel; on peut le démarrer depuis Excel à l'aide des menu:

Mise en forme de la boîte de dialogue personnalisée

Vous l'avez sans doute remarqué, vous pouvez placer les objets n'importe où sur la grille et vous pouvez les redimensionner à l'aide de la souris. Pour des réglages plus fins:

Les propriétés d'un objet peuvent être définies soit:
- depuis la fenêtre des propriétés
- à l'intérieur d'une Sub d'initialisation (choisir l'événement "Initialize" dans la liste en haut à droite de la fenêtre suivante)
- depuis le programme ex: Userform1.caption = "Bla bla bla"


Ou placer le code ?

Tout dépend de ce que vous souhaitez.
Cas des messages d'attente pendant le déroulement d'un programme assez long:
placez le code dans dans le userform en double-cliquant sur la grille.

Dans la liste des événements (en haut à droite) sélectionnez "Activate"; une nouvelle Sub est crée. Effacer les 2 lignes:

Private Sub UserForm_Click()

End Sub

et placez le code de votre programme entre les lignes:

Private Sub UserForm_Activate()

End Sub
(n'oubliez pas de mettre l'instruction "unload me" avant "End sub" si vous voulez que le userform disparaisse de l'écran à la fin du programme)

placer un objet "intitulé" sur le userform; cet intitulé pourrait contenir le texte suivant:
"Veuillez patientez pendant l'exécution du programme!"
Chaque fois que l'instruction "Userform.show" sera exécutée, votre grille s'affichera à l'écran

Cas où l'utilisateur peut faire différents choix ou bien donner des renseignements au programme:
placez sur la grille les objets nécessaires (liste de choix, case à cocher ...) plus un "CommandButton" que vous intitulez "Démarrer" ou "Exécuter" ou comme vous voulez ! Dans ce cas de figure, l'essentiel du code sera dans la Sub:

Private Sub CommandButton_Click()

End Sub
 
 



Résumé

Pour fonctionner, le document doit contenir:
- un module avec le code suivant

sub bonjour_toi()
    userform1.show
end sub
(si vous définissez une variable dans ce module et que souhaitez l'utiliser depuis une Sub du userform, n'oubliez pas de la rendre "PUBLIC" !)

- un userform nommé "userform1" ressemblant à ceci:

Le code du bouton "Quitter" doit contenir ceci (double cliquer le bouton pour entrer le code):

Private Sub CommandButton2_Click()
    unload me
End Sub

Le code du bouton "Démarrer" doit contenir ceci:

Private Sub CommandButton1_Click()
    dim utilisateur, bonjour as string
    utilisateur = environ("username")
    bonjour = msgbox(prompt:="Bonjour M ou Mme ou Mlle  " & utilisateur, title:="Ma 1ere boite de dialogue")
End Sub

Pour qu'un objet réagisse comme on le souhaite, il suffit de le double cliquer et d' y insérer le code nécessaire.



Aller plus loin avec  Userforms