Les formulaires UserForm en VBA : créer, paramétrer et programmer les contrôles
Un formulaire (UserForm) est une boîte de dialogue que vous dessinez vous-même dans l’éditeur VBA : zones de texte, listes déroulantes, cases à cocher, boutons… Il guide la saisie, contrôle les valeurs et les écrit proprement dans la feuille. Chaque contrôle a des propriétés (Caption, Value, Enabled…) et déclenche des événements (Click, Change…) auxquels vous associez du code. Les simulateurs reproduisent l’éditeur : cliquez sur un contrôle pour lire ses propriétés, exécutez le formulaire, puis utilisez-le comme dans Excel. Voir aussi les boîtes de dialogue MsgBox et InputBox et les événements du classeur.
Créer un formulaire, modifier ses propriétés et l’activer
Dans l’éditeur VBA (Alt + F11), Insertion › UserForm crée un formulaire vide, UserForm1, et affiche la boîte à outils. On y choisit un contrôle, puis on le dessine sur le formulaire. La fenêtre Propriétés (F4) règle le nom, le texte, la couleur, la taille… du contrôle sélectionné. Un double-clic sur un contrôle ouvre le code du formulaire et crée sa procédure d’événement, par exemple CommandButton1_Click. Enfin, une macro d’un module standard affiche le formulaire avec UserForm1.Show.
| Étape | Dans l’éditeur VBA |
|---|---|
| Créer | Insertion › UserForm ; Affichage › Boîte à outils si elle est masquée |
| Dessiner | Cliquer sur un outil (Label, TextBox, CommandButton…), puis tracer le contrôle sur le formulaire |
| Paramétrer | F4 : fenêtre Propriétés. Commencer par (Name) : txtNom, cmdValider… |
| Programmer | Double-clic sur le contrôle, ou F7 : code du formulaire, avec ses procédures d’événement |
| Tester | F5 avec le formulaire sélectionné ; dans Excel, une macro UserForm1.Show affectée à un bouton |
| Instruction ou événement | Effet |
|---|---|
Load UserForm1 | Charge le formulaire en mémoire sans l’afficher : déclenche UserForm_Initialize |
UserForm1.Show | Affiche le formulaire (le charge si besoin) ; modal : la macro attend sa fermeture. Déclenche UserForm_Activate |
UserForm1.Show vbModeless | Affichage non modal : la macro continue, l’utilisateur peut travailler dans Excel |
Me.Hide | Masque le formulaire, qui reste chargé : les valeurs saisies sont conservées |
Unload Me | Ferme et décharge le formulaire : déclenche QueryClose puis Terminate, les valeurs sont perdues |
UserForm_QueryClose(Cancel, CloseMode) | Avant la fermeture ; Cancel = True l’annule. CloseMode vaut vbFormControlMenu (0) pour la croix ✕ |
txt zone de texte, lbl label, cmd bouton, chk case, opt option, cbo liste déroulante, lst zone de liste. Renommez avant d’écrire le code.Hide garde les valeurs pour la macro appelante ; Unload les efface. Lire un contrôle après Unload recharge un formulaire vierge.Me désigne le formulaire lui-même : Me.Caption, Unload Me. Depuis un module, on écrit UserForm1.TextBox1.Bouton de commande, label et zone de texte
Le bouton de commande (CommandButton) lance une action par son événement Click. Le label (intitulé) affiche un texte que l’utilisateur ne modifie pas : sa propriété Caption sert aussi à afficher un résultat. La zone de texte (TextBox) recueille une saisie, lue par sa propriété Value (ou Text) ; son événement Change se déclenche à chaque modification.
| Contrôle | Propriétés utiles | Événements |
|---|---|---|
CommandButton | Caption, Default (touche Entrée), Cancel (touche Échap), Enabled | Click |
Label | Caption, Font, ForeColor, BackStyle, BorderStyle, WordWrap | Click |
TextBox | Value / Text, MaxLength, PasswordChar, MultiLine, Locked, TextAlign ; méthode SetFocus | Change, AfterUpdate, Exit |
"2" + "3" donne 23. Convertissez avec Val, CDbl ou CLng après avoir testé IsNumeric.Cells(Rows.Count, 1).End(xlUp).Row + 1 renvoie la ligne sous la dernière valeur de la colonne A : chaque saisie s’ajoute à la suite.Cases à cocher, boutons d’options, bouton bascule et cadre
Ces contrôles ont une propriété Value qui vaut True ou False. Les cases à cocher (CheckBox) sont indépendantes : on en coche autant qu’on veut. Les boutons d’options (OptionButton) s’excluent : un seul par groupe vaut True. Le groupe est défini par le conteneur, un cadre (Frame), ou par la propriété GroupName. Le bouton bascule (ToggleButton) reste enfoncé ou relâché, comme un interrupteur.
| Contrôle | Rôle | À retenir |
|---|---|---|
CheckBox | Option oui / non indépendante | If CheckBox1.Value Then … ; événements Click et Change |
OptionButton | Un choix parmi plusieurs | Un seul True par cadre ou par GroupName |
ToggleButton | Interrupteur enfoncé / relâché | Value True quand il est enfoncé ; on change souvent sa Caption |
Frame | Cadre qui regroupe des contrôles | Frame1.Controls les parcourt ; Enabled et Visible s’appliquent à tout son contenu |
UserForm_Initialize : le groupe a ainsi toujours une valeur.La liste déroulante (ComboBox) et la zone de liste (ListBox)
La liste déroulante (ComboBox) propose des valeurs dans une liste qui s’ouvre ; la zone de liste (ListBox) les affiche en permanence et peut autoriser plusieurs choix. On les remplit dans UserForm_Initialize, avec AddItem, avec un tableau (List) ou en les reliant à une plage de la feuille (RowSource).
| Membre | Rôle |
|---|---|
.AddItem "Excel" | Ajoute un élément à la fin (ou à une position : .AddItem "Excel", 0) |
.List = Array(…) / .List(i) | Remplit toute la liste / lit l’élément d’index i |
.RowSource = "Feuil1!A2:A6" | Relie la liste à une plage (AddItem, RemoveItem et Clear deviennent impossibles) |
.ListIndex | Index de l’élément choisi, à partir de 0 ; -1 si aucun choix |
.ListCount | Nombre d’éléments |
.Value | Texte de l’élément choisi (ou saisi dans une ComboBox) |
.Style = fmStyleDropDownList | ComboBox fermée : choix dans la liste uniquement |
.RemoveItem i / .Clear | Supprime un élément / vide la liste |
.MultiSelect / .Selected(i) | ListBox à choix multiple / l’élément i est-il sélectionné ? |
ListIndex + 2 : Cells(ComboBox1.ListIndex + 2, 2) lit sa colonne B.Multipage, barre de défilement, toupie et image
Le contrôle multipage (MultiPage) répartit les contrôles sur plusieurs onglets. La barre de défilement (ScrollBar) et la toupie (SpinButton) font varier un nombre entre Min et Max sans saisie au clavier. Le contrôle image (Image) affiche un fichier chargé par LoadPicture.
| Contrôle | Propriétés utiles | Événements |
|---|---|---|
MultiPage | Value = index de la page affichée (à partir de 0), Pages(i).Caption, Pages.Count | Change |
ScrollBar | Min, Max, Value, SmallChange (flèches), LargeChange (clic dans la piste) | Change, Scroll |
SpinButton | Min, Max, Value, SmallChange ; souvent associée à une zone de texte | Change, SpinUp, SpinDown |
Image | Picture = LoadPicture(chemin), PictureSizeMode : Clip (0), Stretch (1), Zoom (3) | Click |
ThisWorkbook.Path & "\logo.jpg" cherche l’image à côté du classeur ; testez sa présence avec Dir(…) <> "" pour éviter l’erreur 53.Exercice : le formulaire d’inscription
Classeur d’exercice (Énoncé et Corrigé)
- Enregistrez le classeur en .xlsm, puis créez le formulaire
frmInscriptionavec les contrôles listés dans la feuille « Formulaire » (noms et propriétés). - Collez le code de la feuille « Code VBA » : la partie formulaire dans le code de frmInscription, la macro
OuvrirInscriptiondans un module standard. - Lancez OuvrirInscription : la liste des formations se remplit depuis la feuille Listes, la toupie règle le nombre de places.
- Inscrivez trois stagiaires : chaque validation ajoute une ligne dans la feuille Stagiaires. Testez les messages d’erreur (nom vide, aucune formation).
- Répondez aux questions de la feuille Contrôle ; le corrigé est dans la feuille Corrigé.