top of page

UserForm Excel VBA

  • 28 juil.
  • 7 min de lecture

Un UserForm est une boîte de dialogue personnalisée : une véritable fenêtre sur laquelle on place des contrôles (zones de texte, listes déroulantes, boutons, cases à cocher…) et à laquelle on associe du code VBA. Là où MsgBox et InputBox restent limités, le UserForm offre une interface complète et professionnelle pour saisir des données, guider l’utilisateur ou construire un menu d’accueil.


Pour crée un UserForm vous devez faire un clic droit dans votre Interface VBE puis crée puis UserForm

Vous devriez avoir l'image ci dessous



Les événements du UserForm

Le fonctionnement d'un userform est événementiel : chaque action (ouverture du formulaire, clic, changement de valeur) déclenche une procédure.


Les évènements permettent l'interaction entre votre programme et l'utilisateur.

Il s'agit de procédures qui se déclenchent automatiquement lorsqu'une action prédéfinie survient dans

  • L'application Excel

  • Le classeur (Workbook)

  • La feuille de calcul (Worksheet)

  • Les graphiques

  • Les UserForm

  • Les contrôles


Un formulaire réagit à plusieurs événements, écrits dans son propre module de code. Les plus utiles :

Événement

Quand il se déclenche

UserForm_Initialize

Avant l’affichage — idéal pour préparer valeurs et listes

UserForm_Activate

Quand le formulaire prend le focus

UserForm_Click

Au clic sur le fond du formulaire

UserForm_QueryClose

À la fermeture — annulable via Cancel

UserForm_Terminate

Tout dernier événement, fermeture non annulable

 

L’événement Initialize est le plus important : il s’exécute avant l’affichage, c’est donc là qu’on prépare le formulaire (titre, champs vides, remplissage des listes).


Pour trouver l'événement, vous devez aller dans la code de votre Userform, puis à droite selectionnez INITIALIZE.

Un code va apparaitre, dans votre userForm (et non dans votre module)


Exemple UserForm_Initialize


Private Sub UserForm_Initialize()      ' Se déclenche AVANT l'affichage

    ' Endroit idéal pour les valeurs par défaut et les listes

    Me.Caption = "Saisie d'un client"  ' Titre de la fenêtre

    Me.TextBox1.Value = ""             ' Champ vidé au démarrage

End Sub



Exemple UserForm_QueryClose

QueryClose permet, lui, de contrôler la fermeture — par exemple pour forcer l’utilisateur à passer par un bouton plutôt que par la croix :

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    ' CloseMode = 0 signifie une fermeture via la croix

    If CloseMode = vbFormControlMenu Then

        Cancel = True                  ' Annule la fermeture

        MsgBox "Merci d'utiliser le bouton Quitter."

    End If

End Sub




UserForm VBA exemple

On crée un formulaire dans l’éditeur VBA (VBE) via Insertion > UserForm. La fenêtre Propriétés (touche F4) permet de régler l’essentiel : Name (nom interne), Caption (titre affiché), Height et Width (dimensions). On dépose ensuite depuis la boîte à outils une zone de texte et un bouton, puis on double-clique sur le bouton pour écrire son code. Exemple : recopier la saisie dans la cellule A1, puis fermer le formulaire.

Private Sub CommandButton1_Click()     ' Au clic sur le bouton Valider

    ' On copie le contenu de la zone de texte dans la cellule A1

    Range("A1").Value = TextBox1.Value

    Unload Me                          ' Ferme et décharge le formulaire

End Sub


Pour afficher le formulaire depuis un module ou un bouton de la feuille, on utilise la méthode Show :

Sub AfficherFormulaire()

    UserForm1.Show          ' Mode modal par défaut : la feuille est bloquée

End Sub

Par défaut, le formulaire s’affiche en mode modal : l’utilisateur ne peut pas toucher aux feuilles tant qu’il ne l’a pas fermé. Pour le rendre non modal (feuille accessible en parallèle), on ajoute vbModeless. Enfin, Unload Me ferme et libère le formulaire de la mémoire, tandis que Me.Hide le masque en conservant ses données.

    UserForm1.Show vbModeless   ' Non modal : on garde l'accès à la feuille


UserForm VBA liste déroulante

Deux contrôles servent à proposer une liste de choix : la ComboBox (liste déroulante) et la ListBox (zone de liste). Leurs propriétés sont quasiment identiques ; on les remplit avec AddItem (élément par élément), avec List (depuis une plage) ou avec RowSource. Un point à retenir : les éléments sont indexés à partir de 0, et ListIndex vaut -1 lorsqu’aucune valeur n’est sélectionnée.


La ComboBox

La ComboBox affiche une liste déroulante d’où l’utilisateur choisit une seule valeur. On la remplit typiquement dans l’événement Initialize :

Private Sub UserForm_Initialize()

    ' Remplissage élément par élément avec AddItem

    Me.ComboBox1.AddItem "Paris"

    Me.ComboBox1.AddItem "Lyon"

    Me.ComboBox1.AddItem "Marseille"

    Me.ComboBox1.ListIndex = 0         ' Présélectionne le 1er élément (index 0)

End Sub


Pour une liste issue d’une plage de cellules, deux raccourcis évitent la boucle :

    Me.ComboBox1.List = Range("A1:A20").Value   ' Alimente depuis une plage

    Me.ComboBox1.RowSource = "Feuil1!A1:A20"    ' Ou lie la source directement

On récupère ensuite le choix de l’utilisateur au clic sur un bouton, en vérifiant qu’une valeur a bien été sélectionnée :


Private Sub CommandButton1_Click()

    ' ListIndex = -1 signifie qu'aucune valeur n'est choisie

    If Me.ComboBox1.ListIndex = -1 Then

        MsgBox "Veuillez choisir une ville."

    Else

        MsgBox "Ville choisie : " & Me.ComboBox1.Value

    End If

End Sub




La ListBox

La ListBox ressemble à la ComboBox mais affiche plusieurs lignes en permanence et — surtout — autorise la multisélection via la propriété MultiSelect. On l’alimente exactement de la même façon :

Private Sub UserForm_Initialize()

    ' Une ListBox affiche plusieurs lignes visibles en même temps

    Me.ListBox1.List = Range("A1:A10").Value

    Me.ListBox1.MultiSelect = fmMultiSelectMulti  ' Autorise la multisélection

End Sub

Pour lire une multisélection, on parcourt les lignes et on teste la propriété Selected de chacune :

Private Sub CommandButton1_Click()

    Dim i As Integer

    ' On parcourt chaque ligne (index 0 à ListCount - 1)

    For i = 0 To Me.ListBox1.ListCount - 1

        ' Selected(i) renvoie True si la ligne est cochée

        If Me.ListBox1.Selected(i) Then

            MsgBox "Sélectionné : " & Me.ListBox1.List(i)

        End If

    Next i

End Sub



UserForm VBA design

Un formulaire efficace est d’abord un formulaire lisible. Quelques principes de design font toute la différence.

Nommer ses contrôles — Renommez systématiquement vos contrôles avec un préfixe clair (via la propriété Name). Un code où l’on lit cmbVille ou txtNom est bien plus maintenable que ComboBox1 et TextBox3. Convention courante :

Préfixe

Contrôle

Préfixe

Contrôle

txt

TextBox

lbl

Label

cmb

ComboBox

chk

CheckBox

lst

ListBox

opt

OptionButton

cmd / btn

CommandButton

fra

Frame

 

Organiser et aligner — Regroupez les champs liés dans des cadres (Frame), alignez les contrôles et espacez-les régulièrement. Réglez l’ordre de tabulation avec la propriété TabIndex pour que la touche Tab suive un parcours logique. Enfin, préfixez toujours vos contrôles par Me. dans le code : c’est plus lisible et l’éditeur propose l’autocomplétion.

Ne pas surcharger — Un formulaire lisible vaut mieux qu’un formulaire exhaustif : limitez le nombre de contrôles visibles, quitte à répartir sur plusieurs onglets (contrôle MultiPage). On peut aussi poser une image de fond avec LoadPicture. Astuce pratique : un bouton « Réinitialiser » qui vide tous les contrôles en une seule boucle.


Private Sub btnReset_Click()

    Dim ctrl As Control

    ' Remet tous les contrôles à zéro en une seule boucle

    For Each ctrl In Me.Controls

        Select Case TypeName(ctrl)     ' Traite chaque type de contrôle

            Case "TextBox"

                ctrl.Value = ""

            Case "ComboBox", "ListBox"

                ctrl.ListIndex = -1    ' -1 = aucune sélection

        End Select

    Next ctrl

End Sub



Afficher un UserForm à l’ouverture d’Excel

Pour qu’un formulaire s’affiche automatiquement dès l’ouverture du classeur, on utilise l’événement Workbook_Open. Point crucial, souvent source d’erreur : ce code doit être placé dans le module ThisWorkbook (et non dans un module standard).


' À placer dans le module "ThisWorkbook", pas un module standard

Private Sub Workbook_Open()

    UserForm1.Show      ' S'affiche automatiquement à l'ouverture

End Sub


Pour un véritable écran d’accueil qui masque Excel derrière le formulaire, on peut rendre l’application invisible — à condition de la réafficher à la fermeture (dans QueryClose et via une gestion d’erreurs), sous peine de laisser l’utilisateur avec un Excel invisible :


Private Sub Workbook_Open()

    Application.Visible = False   ' Masque la fenêtre Excel...

    UserForm1.Show               ' ...pour ne montrer que le formulaire

End Sub


Bon à savoir : maintenir la touche Maj enfoncée pendant l’ouverture du fichier empêche l’exécution de Workbook_Open — pratique en phase de développement.




Les événements du Workbook

Les événements du classeur vivent tous dans le module ThisWorkbook. Ils permettent de déclencher du code aux moments clés de la vie du fichier :

Événement

Déclenchement

Workbook_Open

À l’ouverture du classeur

Workbook_BeforeClose

Avant la fermeture — annulable via Cancel

Workbook_BeforeSave

Avant l’enregistrement

Workbook_BeforePrint

Avant l’impression

Workbook_SheetActivate

Au changement de feuille active

 

Certains événements (ceux préfixés Before) disposent d’un paramètre Cancel. En lui affectant True, on annule l’action associée — par exemple empêcher la fermeture du fichier tant qu’une saisie n’est pas complète :

' Dans le module "ThisWorkbook"


Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Dim reponse As Integer

    reponse = MsgBox("Enregistrer avant de quitter ?", vbYesNo)

    If reponse = vbYes Then

        ThisWorkbook.Save        ' Sauvegarde juste avant la fermeture

    End If

End Sub


Les événements du Worksheet

Les événements de feuille s’écrivent dans le module de la feuille concernée (et non dans ThisWorkbook). Ils réagissent aux actions de l’utilisateur sur cette feuille :

Événement

Déclenchement

Worksheet_Change

Quand le contenu d’une cellule est modifié

Worksheet_SelectionChange

Quand la sélection change

Worksheet_BeforeDoubleClick

Au double-clic sur une cellule

Worksheet_Activate

Quand la feuille devient active

 

L’événement Change reçoit un paramètre Target : la cellule qui vient d’être modifiée. Attention à un piège classique : modifier une cellule à l’intérieur de Change relance l’événement, créant une boucle infinie. On la désamorce en désactivant temporairement les événements avec

Application.EnableEvents :

' Dans le module de la feuille (ex : "Feuil1")

Private Sub Worksheet_Change(ByVal Target As Range)

    ' Target = la cellule qui vient d'être modifiée

    If Target.Column = 1 Then

        Application.EnableEvents = False    ' Évite de relancer l'événement

        Target.Value = UCase(Target.Value)  ' Passe la saisie en majuscules

        Application.EnableEvents = True      ' Réactive les événements

    End If

End Sub



En résumé

Le UserForm transforme une macro en une petite application : on crée le formulaire, on prépare ses contrôles dans Initialize, on remplit ComboBox et ListBox, on récupère les choix au clic, puis on l’affiche à l’ouverture via Workbook_Open. En articulant les événements du formulaire, du classeur et des feuilles, vous obtenez une interface fluide et robuste — le vrai saut qualitatif entre une macro utilitaire et un outil que vos utilisateurs prennent plaisir à utiliser.

 
 

📈 Évaluer votre niveau

Débutant, intermédiaire ou avancé : quel est votre niveau Excel ?

✅Découvrez notre test pour progresser efficacement !

Test d'évaluation de niveau professionnel

Gratuit et sans prise de contact inutile

🎓 Formez vous

​En présentiel dans votre entreprise ou à distance.

Formez vous à Excel et améliorez vos compétences

Présence nationale, avec des formateurs locaux.

Programme adapté à votre niveau et vos besoins

Notre Organisme de Formation :

Excel formation est une marque de Kronoscope organisme de formation certifié QUALIOPI, spécialiste en formation Excel, Excel VBA, Power Query et Power BI.

 

Nous accompagnons entreprises et particuliers avec des programmes adaptés à tous les niveaux, finançables via votre OPCO ou votre CPF.

Prêt à booster vos compétences ?

  • Formation en présentiel ou à distance (formateurs locaux, sans frais de déplacement)

  • Possibilité de travailler sur vos outils d'entreprise pendant la formation !

  • Un formateur juste pour vous qui avance à votre rythme et répond à toutes vos questions :)

  • Formation par session de 2h ou 3h à distance

Vous êtes débutant ? Intermédiaire ? avancé ? 

Testez votre connaissance sous Excel à travers un test Excel gratuit et avec correction !

🚀 Formez vous avec le CPF

Vous êtes débutant et vous avez besoin d'un accompagnement personnalisé ?

Vous êtes une entreprise et vous souhaitez évaluer vos équipes ?

Contactez nous et améliorez vos compétences Excel 

Présence nationale, avec des formateurs locaux. Devis gratuit en moins 7h

bottom of page