Un second formulaire pas à pas

Construction pas à pas d'un formulaire et utilisation des différents types de contrôles (boutons, listes…) disponibles.
Ce tutoriel a été écrit pour les versions 97-2003 d'excel.
Il a été entièrement réécrit en 2014 pour les versions 2007 et suivantes, mais la lecture de la nouvelle version sera également utile aux utilisateurs des versions antérieures.

Vous pouvez télécharger l'exemple associé

Prérequis

La lecture et la compréhension de ce tutoriel suppose que vous connaissez les notions suivantes:

Notions de base d'Excel

Les cellules et leurs adresses absolues et relatives.

Notions de VBA

Utilisation de l'éditeur, structure de macros simples (boucles, tests conditionnels, formatage de données, écriture par VBA dans la feuille excel).

Définitions

Un formulaire ou userform est une interface que vous créez pour rendre simple d'emploi un classeur Excel.
Au lieu de devoir saisir des informations dans les cases de la feuille Excel, au bon endroit, avec le bon format, les utilisateurs ont en face d'eux une page que vous avez construite sur mesure et qui les guide dans la saisie des données. Vous pouvez même faire en sorte qu'ils ne sachent même pas qu'ils utilisent Excel !

Pour personnaliser cette interface, vous disposez d'une trousse à outils comprenant par exemple un bouton (ou plus !), des boites de saisie de texte, des cases à cocher, des boutons radio. On désigne ces outils sous le nom générique de Contrôles. Vous pouvez colorier votre formulaire, y mettre même des photos, des gifs animés, des vidéos, de telle sorte que votre utilisateur peut même aller jusqu'à ignorer qu'il est sur Excel !

La création d'un userform comporte plusieurs étapes clefs :

  1. la mise au point du cahier des charges. Ceci se fait sans toucher à Excel mais en se posant des questions simples : qui sera l'utilisateur ? De quelles informations doit-il disposer pour remplir le formulaire ? Quelles sont les infos que je veux qu'il rentre et sous quel format ? Que deviennent les données saisies ? L'expérience montre que cette étape est généralement complètement sous estimée par le "userformiste" débutant. C'est pourtant là qu'on peut éviter qu'un truc simple devienne une usine à gaz impossible à modifier.
  2. La réalisation de l'interface. C'est la partie sympa du boulot !
  3. le codage en VBA qui va permettre de traiter les données saisies et les mettre dans les cases d'une feuille Excel pour les stocker et les traiter.
  4. Le débuggage. Aie... lorsque la conception initiale est mauvaise !
  5. Les premiers tests utilisateurs qui trouvent ça "très bien mais si tu pouvais rajouter ceci ou cela...". Il faut le gérer !

Conception

Il est facile de faire évoluer un projet bien structuré, avec des lignes de commentaires qui rappellent le but de telle ou telle partie. Cela prend un peu plus de temps au début mais simplifie considérablement la reprise du code ultérieurement.
Adoptez des noms de macro et de variables explicites : un an après , vous retrouverez plus facilement à quoi correspond la variable dsc1 si vous l'avez appelée DateSaisieCommande.
Adoptez des conventions d'écriture : Par exemple, préfixez txt- tous les contrôles de type boite de texte à saisir, cmd- tous les boutons...

Mettez en forme vos macros pour faire ressortir avec des niveaux d'indentation (vous pouvez utiliser cet excellent freeware) les instructions qui vont ensemble (if, then, end if...).

 

Voyez GRAND mais concevez pas à pas : Mieux vaut un formulaire qui ne fait qu'une partie des fonctions idéales mais qui les fait vraiment qu'un projet terminé à 80% mais qui faute des 20% restant est inutilisable. En pratique cela veut dire qu'il faut concevoir par modules simples et indépendants.

Nous allons commencer par quelque chose de très très basique : un formulaire permettant à un utilisateur de rentrer son nom et son prénom dans une boite de texte. Ce nom et ce prénom seront alors transférés dans la feuille excel.

Du point de vue conception, ça va assez vite. La seule chose à laquelle il convient de penser c'est au mode d'entrée du nom :
En majuscules, en minuscules ? Noms et prénoms séparés ? Déjà en fait on voit que ça vaut le coup d'y réfléchir. Si vous devez ensuite traiter votre fichier pour éditer des étiquettes par exemple, vous voyez que si Jean Dupont ne vous posera pas de difficulté, reconnaître noms et prénoms dans Jean Hugues du Chêne De la Ville c'est déjà plus coton.

De quoi avons nous besoin ?
  • Un cadre
  • Une zone de saisie de texte pour le nom, une pour le prénom.
  • Un bouton permettant à l'utilisateur de valider son enregistrement.
  • Un bouton permettant à l'utilisateur d'annuler la saise de son enregistrement.

Réalisation de la première interface

Ouvrez un nouveau classeur dans Excel et enregistrez le sous "premieruserform.xls.

Ouvrez l'éditeur Visual Basic (alt+F11)
A gauche vous avez une colonne listant les projets VBA actifs.
Repérez celui nommé VBAProject(premieruserform.xls).
Il contient un dossier contenant 3 feuilles Microsoft Excel Objects (si vous avez 3 feuilles par défaut dans vos classeurs) et une nommée "ThisWorkbook"

Nous allons ajouter dans ce projet VBA un formulaire vierge

Clic droit dans le projet/insertion/userForm
Voilà votre cadre qui se crée ! Normalement une boîte à outils est alors disponible. Si ce n'était pas le cas, allez dans affichage/boîte à outils.
Cette boîte à outils contient par défaut certains contrôles.
Dans la fenêtre de gauche vous devez voir ceci ...

Pour des questions de convention d'écriture, il est conseillé de toujours préfixer le nom de vos formulaires de la même façon. Ici nous choisissons frm et notre formulaire s'appellera donc frmCoordonnées. Pour déclarer ce nom, faites un clic droit sur l'objet sélectionné puis dans la fenêtre des propriétés (affichée via le menu affichage ou avec la touche F4), tapez le nom de votre formulaire en regard de la propriété Name (nom).

Pour soigner l'aspect offert à l'utilisateur et l'informer, on peut modifier le titre qui apparait sur le formulaire: tapez "Saisie coordonnées personnelles" en regard de la propriété Caption (titre) qui fera apparaître ce titre sur le formulaire.
VBA est en anglais. Ne soyez pas inquiet si vous maîtrisez mal ou pas du tout cette langue, il n'y a qu'une poignée de mots à connaître et beaucoup se comprennent intuitivement. Pas besoin de dictionnaire ! Leur signification en français est indiquée en vert dans ce texte.

Une fois le cadre créé, il faut ajouter les Contrôles nécessaires : Dans la boîte à outil,    sélectionnez celui qui vous intéresse en cliquant dessus. Cliquez ensuite simplement là où vous souhaitez le placer dans le cadre du formulaire. Créez ainsi :

Pour le Nom
  • Un contrôle Label (Intitulé ou étiquette) et inscrivez Nom en regard de la case Caption dans la fenêtre des propriétés. Un label n'est pas modifiable par l'utilisateur dans le formulaire. Il permet d'afficher des informations, généralement pour aider à la saisie.
  • Un contrôle TextBox (Zone de texte). Ce contrôle sera nommé txtNom (propriété Name). Il recevra la saisie de l'utilisateur.

Pour le Prénom
  • Un LabeL contenant Prénom dans la propriété Caption.
  • Un TextBox nommé txtPrenom (propriété Name).

A présent il faut mettre 2 boutons :

  • un pour valider la saisie
  • ajouter le contrôle Bouton de commande. Ce contrôle sera nommé cmdOK (propriété Name) et nous mettrons Valider ou OK pour la propriété Caption. C'est ce qui apparaîtra comme texte sur le bouton.
  • un pour annuler la saisie
  • ajouter un second Bouton de commande. Nommez le cmdAnnuler (propriété Name) et nous mettrons Annuler ou Quitter pour la propriété Caption.

Si vous avez suivi ce didacticiel, vous devriez arriver au résultat suivant :

Nous verrons par la suite comment le rendre plus attrayant...

Le code VBA associé

Vous venez de terminer la création de votre formulaire.
On résume :

  • Le nom est inscrit puis stocké dans le controle txtNom
  • Le prénom est inscrit puis stocké dans le controle txtPrenom
  • Le bouton Valider se nomme cmdValider
  • Le bouton Annuler se nomme cmdAnnuler

Lorsque vous cliquez sur un des deux boutons de votre formulaire, vous demandez qu'une action soit effectuée.

Comment le bouton perçoit-il votre clic ?

Chaque contrôle possède des événements associés. Lorsque l'utilisateur clique sur un bouton de commande, l'événement associé est l'évenement Click qui déclenche par une macro portant le nom de boutoncommande_Click contenant les actions à effectuer.
Dans notre exemple, nous aurons donc à créer deux macros, cmdValider_Click et cmdAnnuler_Click

Ecriture du code VBA

Que veut-on faire ?
  • Pour le bouton Annuler (ou Quitter), on veut simplement fermer le formulaire.
  • Pour le bouton Valider (ou OK), on veut transférer les informations contenues dans les deux TextBox (txtNom et txtPrenom) vers un endroit de votre feuille de calcul.
  • Faites un double-clic sur le bouton annuler. Excel crée automatiquement les deux lignes suivantes :

Sub cmdAnnuler_Click()

Sub

Le code associé au bouton "fermer"

On veut que lorsque l'utilisateur clique sur ce bouton, les données contenues dans le formulaire soient effacées sans traitement et que le formulaire soit fermé.
Cela implique qu'il faut le décharger de la mémoire.

Le code sera :

Sub cmdAnnuler_Click()
     Unload Me
Sub

Me est un mot clé VBA que l'on peut utiliser pour se référer au formulaire (curseur sur Me et F1 pour l'aide). On aurait pu à la place écrire Unload frmCoordonnées puisque c'est le nom que nous lui avons donné.

Le code associé au bouton "valider"

Cette fois, nous voulons qu'en cliquant sur ce bouton, les données soient transférées du formulaire à la feuille de calcul : le nom dans la colonne A, le prénom dans la colonne B d'une feuille du classeur que nous aurons nommé "Donnees". C'est ce que fait le code ci-dessous :

Sub cmdOK_Click()
    Sheets("Donnees").Range("A1").Value = Me.txtNom.Text
    Sheets("Donnees").Range("B1").Value = Me.txtPrenom.Text
    Unload Me

Sub

Cela fonctionne mais il manque encore beaucoup de choses.

  1.  Vérifier que les textBox ne sont pas vides lors de la validation.
  2. Mettre une majuscule à la première lettre du nom et du prénom.
  3. A chaque validation, mettre les données à la suite des précédentes.

Verification de la saisie

Lors de la validation sur OK ou Valider, on teste si les txtBox sont renseignés (= non vide = différent de " ").
Si l'une des textbox est vide, il faut dans l'ordre

  • afficher un message d'erreur pour l'utilisateur
  • mettre le pointeur dans le textbox invalide
  • interrompre la macro de validation
  • réafficher le formulaire en conservant les données déjà inscrites et valides.

Ce que fait le code suivant :

Sub cmdValider_Click()
   If Me.txtNom.Text = "" Exit End ' On teste la saisie du prénom ...
    Then

        MsgBox "Vous devez entrer un prénom."
        Me.txtPrenom.SetFocus
        Sub
    If
   Sheets("Donnees").Range("A1").Value = Me.txtNom.Text
   Sheets("Donnees").Range("B1").Value = Me.txtPrenom.Text
   Unload Me End Private ' On teste la saisie du nom ...
    Then

        MsgBox "Vous devez entrer un nom."
        Me.txtNom.SetFocus
        Sub
    If
  If Me.txtPrenom.Text = "" Exit End ' Conversion du nom et prénom en NOMPROPRE'
    Nomconverti = Application.WorksheetFunction.Proper(Me.txtnom.Text)
    Prenomconverti = Application.WorksheetFunction.Proper(Me.txtprenom.Text)
    End Private ' On teste la saisie du nom
    Then

        MsgBox "Vous devez entrer un nom."
        Me.txtNom.SetFocus
        Sub
    If
    If Me.txtPrenom.Text = "" Exit End ' Conversion du nom et prénom en NOMPRPRE
    Nomconverti = Application.WorksheetFunction.Proper(Me.txtNom.Text)
    Prenomconverti = Application.WorksheetFunction.Proper(Me.txtPrenom.Text)
    End(xlUp).Offset(1, 0).Value = Nomconverti
    Range("B65536").' On décharge le formulaire

    Unload Me
Sub

Et voilà ! votre premier userform est tout à fait fonctionnel ! il lui manque encore une petite chose pourtant :
quand l'utilisateur ouvre le classeur il se trouve face à une liste de noms et de prénoms mais il ne sait pas comment accéder au formulaire. Nous allons donc mettre un bouton cette fois-ci sur la feuille de calcul qui va lancer le Userform.

Lancer le Userform

Ouvrez le classeur excel (pas VBA cette fois).
Dans le menu affichage > barres d'outils, cochez si ce n'est déjà fait la barre d'outils contrôles.
Cliquez sur le bouton puis dans votre feuille pour l'y placer.

Faites un clic droit sur le bouton pour afficher la fenêtre de ses propriétés. Vous ne serez pas perdu c'est la même que celle que vous avez utilisée ci-dessus. Modifiez le nom du bouton (propriété Name) pour l'appeller lanceFrmcoordonnées par exemple.
Dans la propriété caption tapez "Afficher le formulaire de saisie". Vous voyez que le texte est trop long et ne tient pas sur le bouton. Si vous voulez que la taille du bouton s'ajuste automatiquement, dans la fenêtre propriétés mettez à true la propriété autoSize (il y a un petit menu déroulant). Tant que vous y êtes, mettez un peu de couleur : backcolor (Couleur de fond) sur votre bouton et jouez avec les propriétés font (police de caractères), forecolor (couleur de police)...

Pendant tout ce temps, le bouton sur la feuille est entourée par quatre poignées de redimensionnement matérialisées par des petits cercles blancs.
Double cliquez maintenant sur le bouton.
VBA s'ouvre avec une nouvelle macro prête à remplir.
Ajoutez simplement la ligne de code suivante :

Sub lanceFrmcoordonnées_Click()
   frmCoordonnées.Show
Sub

La méthode Show permet d'afficher le formulaire.

Astuce : Si vous avez nommé votre userform frmCoordonnées avec un C majuscule, tapez le tout en minuscules. si vous n'avez pas fait de faute de saisie (pas oublié l'accent ou un o), excel reconnait que c'est le nom d'un objet que vous avez créé et, dès que vous avez tapé le point, excel ouvre une liste déroulante proposant les propriétés et méthodes associées à ce type d'objet (ici un userform). Si ce menu ne s'ouvre pas c'est que vous avez fait une faute. Dès que vous aurez terminé la saisie, excel la modifiera pour mettre la majuscule au bon endroit.

Revenez dans votre feuille de calcul. dans la barre d'outils contrôles, cliquez sur le premier bouton en haut à gauche en forme d'équerre. Il active/désactive le mode création. Si vous restez en mode création, le double clic vous envoie dans l'éditeur et ne lance pas l'affichage du formulaire.
Vous pouvez maintenant tester votre formulaire : cliquez sur votre joli bouton...

Commentaires

Pour mon premier essai, le formulaire bloque sur l'enregistrement!
Le débogueur me dit que la formule de mise en place des saisies n'est pas juste. Je suis en version 2010, j'ai essayé en partant du nombre de lignes (1048576), j'ai aussi essayé en plaçant devant la formule : " Range("A65536").End(xlUp).Offset(1, 0).Value = Nomconverti" la formule : "Sheets("Données").Range("A65536").End(xlUp).Offset(1, 0).Value = Nomconverti). Tj bloqué , pouvez vous m'aider ?

Bonjour
Dans le chapitre "Format des données saisies" il y a une petite erreur de code
concernant le nom prore
ce qui est écrit
Sheets("Donnees").Range("A1").Value = Me.txtNom.Text
Sheets("Donnees").Range("B1").Value = Me.txtPrenom.Text
code correct
Sheets("Donnees").Range("A1").Value = Nomconverti
Sheets("Donnees").Range("B1").Value = Prenomconverti

A bientôt

bonjour à tous
je suis à peine débutant en vba et je recontre ce problème sans trouver de réponse sur le net:
j'ai inséré une textbox dans mon userform
j'ai mis l'option multiligne à True
mais elle ne prend qu'une seule ligne. (impossible de revenir à la ligne)
Pouvez-vous m'aider ?
Merci


Ce mois-ci sur Excelabo

- Pas de nouvelle page.
- 3 pages modifiées.