Explication du code VBA utilisé dans le tutoriel Créer un formulaire personnalisé pour saisir des données sur Excel

Explication du code VBA utilisé dans le tutoriel Créer un formulaire personnalisé pour saisir des données sur Excel

Suite aux nombreuses questions qui ont suivi après la publication du tutoriel Créer un formulaire personnalisé pour saisir des données sur Excel, j’ai décidé de réaliser une sorte de suite afin d’expliquer le code utilisé.

Je n’avais pas expliqué le code lors de ce tutoriel, car c’était ma première expérience du langage VBA et j’ai donc testé différentes choses jusqu’à arriver au résultat escompté, mais sans vraiment savoir pourquoi. J’ai commencé à l’apprendre grâce à l’élaboration de ce cours, puis des commentaires qui ont suivi. Désormais, la création de formulaire ou autre en langage VBA fait partie des prestations que je propose. Si vous n’avez aucune connaissance en VBA, je vous conseille fortement de commencer par un tutoriel tel que celui de la création d’un formulaire de saisie de coordonnées afin de vous mettre le pied à l’étrier :).

Je vous rappelle que le code VBA utilisé dans le tutoriel en question se trouve chez Excel-Plus puisqu’il s’agit d’un article invité. À la fin de ce dernier, vous pouvez copier-coller le code pour n’avoir aucune erreur.

Pour suivre ces explications, je vous invite à vous rendre dans la fenêtre Visual Basic dans l’onglet Développeur (si vous ne savez pas comment l’afficher, je vous invite à revoir le début du tutoriel de création) > Visual Basic Visual Basic.

 

Explication du code de l’UserForm1 :

Dans la fenêtre de l’Explorateur de projet (si elle n’apparaît pas, cliquez sur Affichage > Explorateur de projets ou faites Ctrl + R), vous avez par défaut un dossier Microsoft Excel Objets qui contient tous vos onglets et ThisWorkbook. Si vous souhaitez créer une action sur double-clic d’une cellule dans un de vos onglets, vous écrirez le code dans l’onglet correspondant, si vous souhaitez pouvoir effectuer cette action dans n’importe quel onglet, vous l’écrirez dans ThisWorkbook qui peut être aussi utilisé pour faire une action à l’ouverture d’un fichier comme nous l’avons fait dans le tutoriel Créer un message d’alerte à l’ouverture d’Excel.

Dans notre exemple, nous avons ensuite ajouté un UserForm et un Module. Les premiers se trouvent toujours dans un dossier nommé Feuilles et les seconds dans un dossier nommé Modules.

Cliquez droit sur UserForm1 de l’Explorateur de projets > Code. J’avais placé un commentaire devant chaque évènement tel que l’initialisation du formulaire (son ouverture), le changement au niveau de la ComboBox et les clics sur les différents boutons. Ces commentaires sont en vert et commencent toujours par une apostrophe (‘), c’est-à-dire que tout ce qui se trouve derrière une apostrophe ne sera jamais interprété dans votre code. Si vous voulez retirer une action temporairement, au lieu de l’effacer, vous pouvez tout simplement la mettre en commentaire.

Je n’avais pas modifié les noms des différents contrôles (ComboBox1, TextBox1…), mais si vous le faites n’oubliez pas de le modifier dans l’userform et dans le code.

Mon code commence par Option Explicit ce qui veut dire que je vais devoir déclarer toutes mes variables. De cette manière, si vous ne déclarez pas une variable, le mode débug que nous allons voir juste après, vous le signalera et vous évitera de découvrir des erreurs une fois que votre programme sera terminé et qu’il contiendra énormément de données. Si cette ligne vous gêne ou que vous l’oubliez régulièrement, vous pouvez vous rendre dans le menu Outils > Options et cocher la case Déclaration des variables obligatoire dans l’onglet Éditeur :

Déclaration des variables obligatoire

Cette case sera cochée par défaut pour tous vos nouveaux projets.

Il est ensuite suivi de Dim Ws As Worksheet qui est une déclaration de variable que j’aurais pu placer après Private Sub UserForm_Initialize(). Mais une déclaration de variable doit toujours se trouver avant l’utilisation de son nom. Cette déclaration va me servir à utiliser mon onglet Clients.

 

Private Sub UserForm_Initialize() :

À l’ouverture du formulaire, j’ai déclaré J et I comme étant des valeurs numériques. Je peux donner n’importe quel nom à une variable. Un nom, que ce soit de variable ou de macro, peut contenir des lettres minuscules ou majuscules et des chiffres, mais pas d’espaces, de points, de virgules, de traits d’union ou de slashs (évitez les accents) qui seraient mal interprétés par Excel. En clair, restez simple.

ComboBox2.ColumnCount = 1 indique qu’il n’y aura qu’une colonne dans la ComboBox2. Si j’avais souhaité avoir 2, 3, 4 colonnes, il aurait fallu écrire les items de la première colonne, puis la deuxième, etc. pour avoir une liste déroulante du même type que nous avons réalisé dans le tutoriel sur la facturation avec Access.

ComboBox2.List() = Array(«  », « M. », « Mme », « Mlle ») permet de spécifier les données à afficher dans la ComboBox2. Faites attention à la méthode utilisée pour vos formulaires : si les données n’ont pas besoin d’être modifiées et ne sont pas nombreuses, vous pouvez utiliser la méthode Array, mais dans le cas où les données sont amenées à changer souvent, il est préférable qu’elles soient accessibles à une personne novice en VBA et qui pourra les modifier dans son classeur Excel grâce à la méthode AddItem qui suit. Ici, nous avons, la possibilité de ne rien afficher ou de choisir M., Mme ou Mlle.

Set Ws = Sheets(« Clients ») me permet d’attribuer une valeur à la variable que j’ai déclarée plus haut, à savoir que Ws ne traitera que de l’onglet Clients (modifiez-le si vous renommez vos onglets).

Nous avons ensuite un bloc d’instruction qui contient une boucle qui indique que dans la ComboBox1, nous voulons récupérer à partir de la 2e ligne (la première étant la ligne de titre) toutes les cellules se trouvant dans la colonne A de l’onglet Clients. Cette méthode est préférable à Range(« A65536 ») que nous allons voir juste après, car ici nous allons partir de la dernière cellule de l’onglet qui était la 65 536e sur les versions antérieures à 2007, mais a augmenté depuis, puis nous remontons jusqu’à la première cellule non vide. End(xlUp) est préférable, car si nous partions du haut et qu’une cellule était vide dans le tableau, le programme ne prendrait pas en compte les suivantes. Comme il s’agit d’une boucle, si vous lancez le mode débug, vous verrez que l’action se répète le nombre de fois nécessaire pour afficher tous les items (ici, 20 fois pour les 20 lignes du tableau).

En réalisant ce tutoriel, je me suis aperçue que certaines choses n’étaient pas nécessaires dans mon code comme :

For I = 1 To 7
Me.Controls("TextBox" & I).Visible = True
Next I

Il s’agit d’une boucle pour les 7 TextBox (d’où l’intérêt de modifier ce chiffre si vous en ajoutez ou supprimez) qui va les rendre visibles… Or, elles sont, par défaut, visibles. Par la même occasion, la déclaration de I n’est plus indispensable.

Donc si ce code était à refaire, je supprimerais cette boucle ainsi que ComboBox2.ColumnCount = 1 puisqu’une ComboBox contient par défaut au moins une colonne et je supprimerais également le Me. dans With Me.ComboBox1 puisque la ComboBox1 est dans ce même formulaire.

 

Private Sub ComboBox1_Change() :

Sur changement de la ComboBox1, les données vont se mettre à jour dans les autres contrôles du formulaire. Je déclare Ligne et I comme étant des valeurs numériques.

If Me.ComboBox1.ListIndex = -1 Then Exit Sub permet de sortir de la procédure dans le cas où vous ne sélectionnerez aucun numéro client.

Ligne est égale à la ligne de la ComboBox1 (si vous modifiez + 2 en + 1 ou + 3, vous verrez qu’il y a un décalage au niveau des données affichées).

ComboBox2 = Ws.Cells(Ligne, « B ») va ensuite récupérer les données de la ligne en cours à la colonne B (vous remarquerez que je n’ai pas eu besoin de déclarer à nouveau Ws, car il n’est pas dans un Private sub contrairement à I que j’ai dû déclarer de nouveau).

Je fais ensuite une boucle sur toutes les TextBox (7) pour récupérer toutes les données dans chaque contrôle. Chaque contrôle (du 1er au 7e) sera égal à sa ligne et sa colonne dans l’onglet. Je n’ai pas créé de boucle pour la ComboBox2 puisqu’il n’y avait qu’une ComboBox.

On peut faire en sorte que notre liste déroulante se mette à jour lorsque l’on ajoute un numéro client, mais comme l’action devra être utilisée après confirmation de l’ajout d’un client, on va l’ajouter dans l’évènement suivant.

 

Private Sub CommandButton1_Click() :

Sur clic du bouton CommandButton1, je vais ajouter un contact. Pour cela, je déclare L comme étant une valeur numérique dont je donne la valeur juste après, à savoir que c’est la dernière cellule de la colonne A de l’onglet Clients + 1, c’est-à-dire que je me place après la dernière cellule non vide. Comme indiqué plus haut, je remplacerais « a65536 » par « A » & Rows.Count qui signifie exactement la même chose, mais qui pourra être transposable d’un ordinateur à un autre s’ils n’ont pas les mêmes versions.

J’ajoute ensuite une condition grâce à la fonction If qui est si je réponds Oui à mon MsgBox qui est une boîte de dialogue qui me demandera Confirmez-vous l’insertion de ce nouveau contact ?, qui contiendra les boutons Oui et Non et qui aura pour titre Demande de confirmation d’ajout, alors on va effectuer l’action qui se trouve, ici, avant End If.

Personnellement, je rajouterais :

Else
' Rien
ou Exit Sub
(puisque de toute façon l’instruction est terminée après) avant End If pour plus de clarté, mais ça fonctionne quand même sans.

Si je réponds Oui alors ma ComboBox1 va recopier sa valeur dans la colonne A à la dernière ligne non vide + 1, ComboBox2 va recopier dans B et ainsi de suite. Faites attention à l’ordre : c’est toujours la destination qui est égale au départ. L’ordre des propriétés n’a pas d’importance, mais les noms de TextBox et de colonnes oui.

Si vous souhaitez mettre à jour la liste déroulante après ajout, ajouter le code suivant :

Dim J As Long
Dim I As Integer
ComboBox1.Clear
Set Ws = Sheets("Clients") 'Correspond au nom de votre onglet dans le fichier Excel
With Me.ComboBox1
For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("A" & J)
Next J
End With

Ce code correspond au même code que celui de la liste déroulante à l’ouverture avec ComboBox1.Clear. Ce dernier est important, car à la confirmation, la liste des codes client va être rechargée, or si elle n’est pas vidée (Clear), à chaque nouvel ajout, vous aurez votre liste précédente + la nouvelle liste, donc plein de doublons.

 

Private Sub CommandButton2_Click() :

Sur clic du bouton CommandButton2, je veux mettre à jour les données existantes. Pour cela, je déclare une nouvelle fois Ligne et I comme étant des valeurs numériques et je crée une boîte de dialogue Oui/Non qui déclenchera l’action si je clique sur Oui. Le code est quasiment similaire à celui du changement de liste déroulante donc je le simplifie en retirant If Me.Controls(« TextBox » & I).Visible = True Then suivi de son End If puisque les TextBox sont toutes visibles.

Ici aussi, on peut ajouter :

Else
' Rien ou Exit Sub

avant End If.

 

Private Sub CommandButton3_Click() :

Sur clic du bouton CommandButton3, le formulaire en cours (Me) va être déchargé, c’est-à-dire fermé, ce qui libère par la même occasion la mémoire du programme.

 

Retirer la saisie semi-automatique d’une ComboBox sur Excel :

Par défaut, une ComboBox possède la saisie semi-automatique, il s’agit de la propriété MatchEntry. Cela est très pratique lorsque vous avez une liste de noms de clients par exemple pour les retrouver facilement, mais, dans ce tutoriel, la ComboBox1 servait à saisir un numéro client et, forcément, la saisie fait appel aux données déjà enregistrées si l’on commence par un chiffre déjà attribué.

Pour modifier cette propriété, cliquez sur la ComboBox1 en mode Afficher l’objet (clic droit sur l’UserForm1 dans l’Explorateur de projets) et, dans le panneau Propriétés, recherchez la ligne MatchEntry et sélectionnez l’option qui vous intéresse :

  • 0 – fmMatchEntryFirstLetter : affiche le premier item de la liste commençant par la lettre saisie et si l’on appuie sur la lettre, sur le clavier, de manière répétée, les autres items de la liste commençant par cette lettre s’affichent successivement ;
  • 1 – fmMatchEntryComplete : affiche une première suggestion qui peut être modifiée au fil de la saisie ;
  • 2 – fmMatchEntryNone : pas de saisie semi-automatique.

Cette propriété peut être ajoutée via le code en ajoutant cette ligne dans l’initialisation du formulaire par exemple (le code remplace la propriété) :

ComboBox1.MatchEntry = fmMatchEntryNone

Attention : cette propriété ne fonctionne pas sur Mac et provoque une erreur.

 

Explication du code du Module1 :

Ce module est une macro créée dans le but d’appeler le formulaire de saisie. Celle-ci débute par Sub et se termine par End Sub. Dans cet exemple, j’avais appelé cette macro Lancer_formulaire. C’est ce nom que vous retrouverez dans l’onglet Développeur > Macros. Il est également possible de créer un bouton sur votre fichier Excel pour lancer ce formulaire si vous ne souhaitez pas passer par un raccourci. Pour cela, créez une forme soit en passant par l’onglet Développeur > Insérer Insérer développeurBouton ce qui ouvre la boîte de dialogue des macros directement, mais n’offre pas la possibilité de personnaliser le bouton en terme de forme ou de couleur, soit en passant par l’onglet Insertion > Formes Insertion Formes (le bouton pourra être modifié avec l’onglet Format) puis en cliquant droit dessus > Affecter une macro…. Une fois que la boîte de dialogue des macros est ouverte, il vous suffit de sélectionner la macro correspondante au lancement du formulaire.

 

UserForm1.Show affiche le formulaire UserForm1. Étant donné que je n’avais pas changé le nom du formulaire, c’est donc le nom de base, les formulaires suivants seraient UserForm2, UserForm3… sauf si vous les renommez.

 

vbModeless permet d’ouvrir le formulaire en non modal, c’est-à-dire que vous pourrez cliquer en dehors du formulaire, contrairement à vbModal où un clic en dehors du formulaire est impossible tant que celui-ci est ouvert. vbModal n’est pas utile à écrire puisque c’est le fonctionnement pas défaut.

Enfin, vous pouvez parfois avoir une erreur d’exécution sur la ligne affichant le formulaire dans le module. Si le nom de votre formulaire est bien saisi, le problème vient surement de l’initialisation du formulaire dans le code de l’Userform.

 

Utilité du mode débogage :

Le mode débogage permet de vérifier que votre code est bien écrit (absence de fautes de frappe, toutes les variables sont déclarées…). Vous pouvez directement passer par la mise en pratique en lançant votre formulaire et en le testant, mais si beaucoup de scénarios sont possibles, cela peut vous prendre du temps alors qu’il est préférable de ne le faire qu’à la dernière étape de la création de votre programme afin de vérifier que les données sont bien traitées de la manière que vous souhaitez.

Pour lancer ce mode, dans la fenêtre VBA, cliquez sur Débogage > Compiler suivi généralement de VBAProject qui est le nom donné par défaut à votre projet. Il peut être modifié en cliquant droit sur VBAProject (Le nom de votre fichier avec son extension) dans la fenêtre Projet > Propriétés de VBAProject…. Dans le champ Nom du projet, vous pouvez modifier le nom par défaut.

Une fois le mode lancé, s’il ne se passe rien, c’est que votre code est correct. Dans le cas contraire, une fenêtre s’ouvre avec l’erreur. Si par exemple, je supprime la ligne de déclaration de J dans l’initialisation du formulaire (Dim J As Long) et que je lance le mode débug, j’ai bien l’erreur de variable non définie.

Pour terminer, n’hésitez pas à voir ou revoir le tutoriel Comment vider (effacer) un userform après validation sur Excel ? utilisant le même formulaire de saisie.

EDIT : l’explication du code VBA utilisé dans ce tutoriel se trouve ici.

Téléchargez « Explication du code VBA utilisé dans le tutoriel Créer un formulaire personnalisé pour saisir des données sur Excel » au format PDF

Je vous propose un fichier annexe dans l’Espace Membres contenant le code VBA rajouté.

Et si vous souhaitez continuer votre apprentissage du code VBA sur Excel,
cliquez sur ce lien pour découvrir le tutoriel Créer des listes déroulantes en cascade dans un formulaire Excel.

Newsletter

133 réactions au sujet de « Explication du code VBA utilisé dans le tutoriel Créer un formulaire personnalisé pour saisir des données sur Excel »

  1. J’aime bien ce que vous avez fait.
    S’il vous plait, pouvez-vous m’aider : comment je peux envoyer des emails de rappel automatiquement ?

  2. Bonjour,
    Après avoir suivi toutes les procédures, au moment de tester le formulaire, j’obtiens le message suivant : « erreur d’exécution ‘9’ l’indice n’appartient pas à la sélection ».
    Comment y voir plus clair ?
    Merci infiniment.

  3. Bonjour,
    Encore merci pour le partage des connaissances ! J’ai vu toutes vos vidéos et lu les articles, cependant, je n’arrive pas à comprendre comment alimenter une combobox en fonction d’un choix sélectionné sur une autre combobox.
    Les différents choix de la 1ère CB sont dans une colonne A (domaine d’application : jardin, bricolage). En colonne B se trouve la catégorie des outils proposés (tondeuse, cisaille ou tournevis, marteau). En colonne C se trouve le modèle des outils (mle600, mle500 ou …), « l’affinage » des données peut être infini… Bref, voilà, j’ai tout ça dans une feuille de calcul et j’essaye via un formulaire avec des combobox de remplir cette feuille, mais rien ne fonctionne. Je ne comprends pas…
    Merci beaucoup pour le temps que vous m’accorderez.
    Toujours fan de vos vidéos et explications !

  4. Bonjour et merci Lydia.
    Vos explications sont claires et compréhensibles, merci encore du temps que vous prenez pour faire vos tutos.

    Pour le tuto sur le formulaire vba, pouvez-vous me dire ce qu’il faut rajouter pour que les champs s’introduisent en plus sur une autre feuille du classeur ?

    Merci pour votre aide.

    1. Bonjour Cylvain,

      Il faut ajouter ce genre de code à adapter :
      L = .Range("A65536").End(xlUp).Offset(1, 0).Row
      With Sheets("Clients")
      .Cells(L, 1).Value = ComboBox1
      .Cells(L, 2).Value = ComboBox2
      etc.
      End With
      With Sheets("Clients1")
      .Cells(L, 1).Value = ComboBox1
      .Cells(L, 2).Value = ComboBox2
      etc.
      End With

  5. Bonjour Lydia et merci pour ce super tuto !

    Concernant la mise à jour automatique de la liste déroulante, j’ai tapé exactement le code que vous donnez ci-dessus, mais j’ai l’impression que cela n’a aucun effet sur mon formulaire. En effet, je suis obligé de quitter puis rouvrir le formulaire pour que la nouvelle donnée s’affiche dans la liste.

    Merci beaucoup de votre aide !

    Édit : De même, je possède une base de données avec un très grand nombre de colonnes à renseigner par le biais du formulaire (environ 120) à travers des textbox.
    Existerait-il un moyen plus simple pour moi de coder cette commande plutôt que de devoir taper une ligne de code pour chaque colonne en utilisant « Range.Value= » ? Est-il possible de faire une boucle par exemple ?

    Toutes mes excuses pour ces nombreuses questions et encore un grand merci à vous pour votre précieuse aide !

    1. Bonjour Noémie,

      Êtes-vous sûr que le code se trouve bien sur l’après-clic du bouton ajout ? Car si elle se recharge bien à l’ouverture du formulaire, c’est qu’il doit bien y avoir quelque chose de ce côté-là.
      Pour la boucle, oui, c’est d’ailleurs ce qui est expliqué dans le tuto :
      For I = 1 To 7
      Me.Controls(« TextBox » & I).Visible = True
      Next I

      Toutefois, ce n’est valable que si vos contrôles sont des textbox qui se suivent (pas de combobox ou autre entre eux).

    2. Bonjour Noémie, bonjour à tous,
      Merci Lydia pour ce tuto très bien fait.
      Une façon toute simple de charger le contenu de la combobox qui sert de référence (ici, le numéro client), elle peut aussi être gérée en indiquant de prendre toute la colonne dans le paramètre « rowsource » de la combobox en question. Cela évite de faire une boucle.

      Benjamin

  6. Bonjour, merci pour ce super tuto, très compréhensible, c’est une super idée.
    J’ai donc créé mon formulaire qui marche très bien, j’ai juste une petite question.
    En fait, dans mes premières colonnes, j’ai une formule RECHERCHEV en lien avec un autre onglet, mais j’ai remarqué que, lorsque je modifie un champ ne contenant rien à la base dans mon formulaire, toutes mes cellules ayant une formule RECHERCHEV n’ont plus rien à part le texte.
    Est-il possible de rajouter quelque chose dans la VBA afin de garder les formules après modification ?
    Merci beaucoup pour votre temps.
    Nils

  7. Bonjour Lydia,
    J’avais posé une question hier, mais j’avais oublié le captcha !!
    Donc je recommence.
    D’abord, merci pour ce super tuto qui me permet de créer un formulaire de saisie pour mon association.
    2 questions cependant :
    – quel code pour un bouton « SUPPRIMER » pour effacer un contact ?
    – peut-on mettre l’userform dans une feuille différente de celle qui contient les données

    Merci encore.

    1. Bonjour Pierre,

      Pour supprimer (à adapter) : Rows([A2:A65536].Find(ComboBox1.Value).Row).EntireRow.Delete
      Pour la feuille, oui, il suffit de créer un bouton et de lui appliquer la macro correspondante à votre userform.

  8. Merci Lydia,
    Si je peux abuser, encore une question :
    Dans ma feuille de calculs reprenant tous les membres (ou contacts), j’ai des colonnes avec les dates de naissance et des âges calculés suivant la formule : =(AUJOURDHUI()-C2)/365,25 (C2 est la cellule contenant la date de naissance).
    Que faire pour être sûr que dans le formulaire de saisie on rentre la date sous la forme jj/mm/aa et que l’âge calculé soit affiché avec une seule décimale (actuellement 12 décimales !!)
    Merci de votre aide.

    1. Il faut modifier la ligne sous cette forme (à adapter) : Range("A" & L).Value = CDate(Format(Champ.Value, "dd/mm/yyyy hh:mm:ss"))
      Pour les décimales, je n’ai pas testé, mais peut-être quelque chose comme ça : Range("A" & L).Value = Format(Champ, "0.00"). Toutefois, je pencherais pour du « 0 » car on ne dit pas j’ai 20 ans et demi 😉

  9. Pour forcer la saisie de la date, j’ai trouvé ceci qui peut peut-être servir à d’autres :
    Private Sub TextBox1_Change()
    Dim Valeur As Byte
    TextBox1.MaxLength = 10 'nb caractères maxi autorisé dans le textbox
    Valeur = Len(TextBox1)
    If Valeur = 2 Or Valeur = 5 Then TextBox1 = TextBox1 & "/"
    End Sub

  10. Bonsoir,
    Merci pour ton tuto ^^
    J’ai une question : j’ai essayé d’ajouter d’autres combobox, mais ça n’a pas marché !!!
    S’il vous plaît, aidez-moi !

  11. Bonjour Lydia,

    Je suis dans le même cas que Barnabé, je n’arrive pas à trouver le code ! Enfin si, mais le zip ne contient qu’un bloc note avec 5-6 lignes dessus…

    Merci d’avance pour votre aide.

  12. Bonjour et merci pour ces tutos explicites !

    J’ai juste une petite chose que je n’arrive pas à faire : j’aimerai, qu’à l’ajout d’un nouveau contact, s’ajoute également un nouveau code client dans la colonne A, comment automatiser cette action ?

    Merci beaucoup pour votre réponse,

    Cordialement.

    Vincent

      1. Merci beaucoup !

        Ma dernière question, si je peux abuser, est-il possible d’habiller un peu cette interface assez brute et laide ? D’intégrer un fond d’écran par exemple ?

        Encore merci,

        Cordialement.

      2. Lydia bonsoir,

        Merci encore pour ce tutoriel qui est tout simplement génial.

        Le code que vous mentionnez pour que le code client s’incrémente tout seul dans le formulaire est à positionner à quel endroit ?
        TextBox1.Value = Range("A" & Cells(Rows.Count, 1).End(xlUp).Row) + 1

        Merci.

          1. Merci pour votre réactivité, vous avez résolu mon problème en moins d’une minute. J’en profite pour vous poser une nouvelle question : j’ai créé un nouveau formulaire en m’inspirant de ce tutoriel, lorsque je crée un nouveau contact, cela me crée bien une nouvelle ligne dans mon tableau, cependant, lorsque je sélectionne ma combobox1 qui contient le n° de code, pour, par exemple, pouvoir sélectionner un contact, la combobox reste vide. Quelle partie du code alimente une combobox en reprenant le code de la ligne du dessus ?

            Merci par avance.

          2. Il s’agit de ce bout de code :
            Dim J As Long
            Dim I As Integer
            ComboBox1.Clear
            Set Ws = Sheets(« Clients ») ‘Correspond au nom de votre onglet dans le fichier Excel
            With Me.ComboBox1
            For J = 2 To Ws.Range(« A » & Rows.Count).End(xlUp).Row
            .AddItem Ws.Range(« A » & J)
            Next J
            End With

  13. Bonjour,

    Merci pour ce super tuto, j’ai pu faire un vrai outil de gestion d’une base de données avec. Ça me simplifie la vie comme pas possible !

    Petite question : je suis amené à modifier régulièrement les données de chaque client. Votre questionnaire est parfaitement adapté pour cela.
    Je suis également amené à modifier le contenu de la combobox1 qui, comme dans votre exemple, alimente le contenu de toutes les textbox et combobox. Depuis votre exemple, si je modifie le contenu de la combobox1, toutes les modifications effectuées sont bien prises en compte dans la feuille, mais pas la modification du contenu de la combobox1. Comment faire pour que les modifications effectuées dans le contenu de la combobox1 soient bien appliquées dans la cellule correspondante lorsqu’on valide le formulaire avec le bouton « Modifier » ?

    Merci d’avance.

  14. Bonjour Lydia,

    Je suis Excel 2013, j’ai fait les macros sur plusieurs feuilles du classeur.
    Lorsque je ferme mon fichier Excel et que je le rouvre, toutes mes macros ont disparu et je dois donc les refaire.
    Comment je peux faire pour que mes macros soient toujours présentes dans mon fichier Excel ?
    Merci beaucoup de votre soutien,
    Cordialement,
    Christine

    1. Bonjour Christine,

      Il faut l’enregistrer au format prenant en charge les macros (un message doit d’ailleurs vous avertir lorsque vous l’enregistrez au format classique).

  15. Bonjour Lydia,

    Merci pour la clarté de ce tutoriel !

    Je n’ai pas créé de boucle pour la ComboBox2 puisqu’il n’y avait qu’une ComboBox.
    J’ai transformé les TextBox3 et 5 en ComboBox et j’ai souhaité créer une boucle pour ceux-ci.

    Voici le code que j’ai rentré :
    'Pour la liste déroulante Code client
    Private Sub ComboBox1_Change()
    Dim Ligne As Long
    Dim I As Integer
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 3
    ComboBox2 = Ws.Cells(Ligne, "C")
    For I = 1 To 2
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 3)
    Next I
    For I = 3 To 3
    Me.Controls("ComboBox" & I) = Ws.Cells(Ligne, I + 3)
    Next I
    For I = 4 To 4
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 3)
    Next I
    For I = 5 To 5
    Me.Controls("ComboBox" & I) = Ws.Cells(Ligne, I + 3)
    Next I
    For I = 6 To 7
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 3)
    Next I
    End Sub

    Seulement, je reçois un message d’erreur d’exécution me disant que l’objet est introuvable.

    De plus, lorsque je supprime les lignes relatives à la ComboBox5, le code s’exécute normalement, mais le contenu de la ComboBox3 ne s’affiche pas dans la base de données.

    Je dois cependant préciser que pour alimenter ces deux ComboBox j’ai utilisé le code suivant :
    Private Sub UserForm_Initialize()
    Dim J As Long
    Dim I As Integer
    ComboBox2.RowSource = ("Modalitédepaement")
    Set Ws = Sheets("Traitement pièces") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next J
    End With
    ComboBox3.RowSource = ("ListeType")
    ComboBox4.RowSource = ("Modalitédepaement")
    End Sub

    Pourriez-vous m’apporter votre assistance s’il vous plaît ?

    Merci d’avance.

    1. Bonjour Johanna,

      Mais là, vous avez créé 5 boucles. À partir de mon tutoriel, retirez simplement la boucle présente et utilisez la syntaxe comme pour écrire le résultat de chaque textbox (Range("C" & L).Value = TextBox1), mais avec la combobox, car si vous avez du mal avec les boucles, au moins, ce sera plus long, mais ça fonctionnera.

  16. Bonjour,
    C’est très intéressant, je vous remercie Lydia pour le partage de cette vidéo qui explique bien la création d’un formulaire.
    Cordialement.

  17. Bonjour,

    La vidéo est intéressante et j’aimerais bien l’appliquer. Cependant, comme je suis débutante en VBA, je suis un peu perdue, surtout que j’ai la version Excel 2016 pour Mac.
    Est-ce que quelqu’un sait comment créer un Userform sur cette version ?
    D’avance merci.

  18. Je me sers du formulaire pour des données numériques auxquelles j’applique une formule. La formule ne fonctionne pas et me donne l’erreur #VALEUR!. J’y applique un format de cellule nombre, mais le formulaire semble changer le format. Que puis-je faire ?
    Merci.

  19. Bonjour Lydia,

    Comme je peux le constater, votre tuto est très utile à beaucoup de monde !

    Je n’arrive malheureusement pas à utiliser les combobox…

    J’ai créé plusieurs UserForm. J’ai parfaitement réussi le UserForm1 avec seulement des textbox. Cependant, je travaille sur un UserForm en particulier, celui qui me permettrait de pouvoir valider les saisies d’une personne. Pour cela, je voudrais consulter, dans une copie conforme au UserForm1 (soit le UserForm2), les saisies de plusieurs personnes. Je voudrais aussi pouvoir modifier la saisie via cet UserForm et que bien, évidemment, ma base de données « Feuil1 » soit mise à jour.

    Pour la consultation, j’aurais besoin de 3 combobox pour filtrer le nom de la personne, le mois et la semaine (données saisies par les personnes dans des Textbox UserF1). Et je voudrais, du coup, que dans le UserForm2, les 3 premières textbox deviennent des combobox pour filtrer la recherche.

    Après ma vérification, je souhaite donc pouvoir modifier s’il y a des erreurs.

    Je n’y arrive pas malgré tous vos conseils ! Je suis désespérée de ne pas y arriver… Je n’y arrive même pas avec 2 combobox.

    De plus, est-il possible qu’après ma consultation, je puisse avoir un bouton « VALIDER » qui va colorer ma ligne dans ma base de données Feuil1 ?

    Voici une partie du code (copier/coller sur le vôtre) :

    Option Explicit
    Dim Ws As Worksheet
    'Pour le formulaire
    Private Sub UserForm2_Initialize()
    Dim AM As Long
    ComboBox2.List() = Array("JANVIER", "FEVRIER", "MARS", "AVRIL")
    Set Ws = Sheets("Feuil1")
    With ComboBox1
    For AM = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & AM)
    Next AM
    End With
    End Sub
    'Pour la liste déroulante NOM
    Private Sub ComboBox1_Change()
    Dim Ligne As Long
    Dim AL As Integer
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    ComboBox2 = Ws.Cells(Ligne, "B")
    For AL = 1 To 38
    Me.Controls("TextBox" & AL) = Ws.Cells(Ligne, AL + 2)
    Next AL
    End Sub
    'Pour le bouton Modifier
    Private Sub CommandButton1_Click()
    Dim Ligne As Long
    Dim AL As Integer
    If MsgBox("Confirmez-vous la modification ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    Ws.Cells(Ligne, "B") = ComboBox2
    For AL = 1 To 38
    Ws.Cells(Ligne, AL + 2) = Me.Controls("TextBox" & AL)
    Next AL
    End If
    End Sub

    Je ne comprends pas pourquoi rien ne s’affiche…

    Pourriez-vous m’aider ?

    Je vous remercie et je vous souhaite une excellente soirée.

    1. Bonjour Marie-Julie,

      Je suis désolée, j’ai du mal à comprendre.
      Vous souhaitez filtrer les données présentes sur une feuille via un userform ? Mais pas par rapport au second (car il ne me semble pas que cela soit possible étant donné qu’un seul userform s’affiche) ?

  20. Bonjour Lydia,

    Merci pour votre vidéo. Je suis débutant en VBA et j’ai vraiment apprécié. Que faut-il alors ajouter si les clients ont plusieurs adresses avec mail et téléphones différents (cas d’un client possédant une chaîne de restaurant), mais qu’on aimerait garder en un seul code client dans notre formulaire ? Merci.

  21. Bonjour Lydia, tout d’abord mille mercis pour le travail que vous publiez, intéressant, bénéfique & surtout bien expliqué. Pour ce qui est de ma part, j’essaye tant bien que mal de m’exercer avec Excel et la création de formulaires userform avec VBA me plaît, je l’avoue. Alors, j’ai suivi votre tuto sur YouTube avec sérieux et j’arrive avec vous à l’étape de l’insertion du code, là, je m’arrête sec, je ne sais pas où trouver les lignes de code que vous mettez sur votre page, help me Lydia.

  22. Bonjour Lydia,
    Votre tuto est excellent, je l’ai refait pas-à-pas, mais il bug, j’ai des lignes de la macro en rouge, j’ai beau chercher, je ne vois pas.
    Pourriez-vous m’orienter s’il vous plait ?
    Par avance, merci.
    Cordialement.

    1. Bonjour Éric,

      Je vous invite à copier-coller le code qui se trouve à la fin de l’article original chez Excel-Plus, car des lignes rouges signifient une erreur de syntaxe.

    1. Bonjour,

      Si vous n’y connaissez rien en VBA, lancez l’enregistreur de macro, faites le calcul sur votre feuille et copiez-collez le code créé par Excel dans votre formulaire en l’adaptant.

  23. Bonjour Lydia,

    Je n’arrive pas à retrouver le code pour les listes déroulantes en VBA.

    J’ai un projet de gestion de plan pour validation avec des dates de réception, je travaille sur 4 onglets. Dans un premier temps, je voudrais avoir le nom des différents plans selon une entreprise sélectionnée et, dans un deuxième temps, avoir un message alerte qui m’affiche la date dont les délais de validation sont passés de 14 jours. Je ne sais pas comment m’y prendre pour structurer mes données. Je précise que je suis avancée dans mon projet, mais je ne sais plus quoi faire pour mes résultats. J’ai besoin de votre aide.

    Merci de bien vouloir m’aider.

    Bonne journée.

  24. Bonjour,
    J’ai suivi votre formation pour « Créer un formulaire personnalisé pour saisir des données sur Excel », mais, dès que j’essaie d’exécuter le code, j’ai le message suivant :
    « Erreur de compilation, erreur de syntaxe » pour la ligne :

    Private Sub UserForm_Initialize() (surligné en jaune)
    Dim J As Long
    Dim I As Integer
    ComboBox2.ColumnCount = 1
    ComboBox2.List() = Array("", "M.", "Mme", "Mlle") (surligné en bleu)

    Pouvez-vous m’aider ?

  25. Bonjour

    Si je connais correctement Excel, je commence la programmation VBA pour ensuite l’appliquer à un formulaire de saisie de données. Et ce n’est pas simple à soixante et quelques années…
    J’ai donc essayé de refaire votre exercice clients. J’ai fait des copier-coller de toutes les instructions.
    Voici ce que cela donne :
    Option Explicit
    Dim Ws As Worksheet

    'Pour la liste déroulante Code client
    Private Sub ComboBox1_Change()
    Dim Ligne As Long
    Dim I As Integer
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    ComboBox2 = Ws.Cells(Ligne, "B")
    For I = 1 To 7
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
    Next I
    End Sub

    'Pour le bouton nouveau client
    Private Sub CommandButton1_Click()
    Dim L As Integer
    If MsgBox("Confirmez-vous l’insertion de ce nouveau contact ? ", vbYesNo, "Demande de confirmation d’ajout ") = vbYes Then
    L = Sheets("Clients").Range("a65536").End(xlUp).Row + 1 'Pour placer le nouvelenregistrement àla première ligne de tableau non vide
    Range("A" & L).Value = ComboBox1
    Range("B" & L).Value = ComboBox2
    Range("C" & L).Value = TextBox1
    Range("D" & L).Value = TextBox2
    Range("E" & L).Value = TextBox3
    Range("F" & L).Value = TextBox4
    Range("G" & L).Value = TextBox5
    Range("H" & L).Value = TextBox6
    Range("I" & L).Value = TextBox7
    End If
    End Sub

    'Pour le bouton modifier
    Private Sub CommandButton2_Click()
    Dim Ligne As Long
    Dim I As Integer
    If MsgBox(" Confirmez-vous la modification de ce contact ? ", vbYesNo, "Demande de confirmation de modification ") = vbYes Then
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    Ws.Cells(Ligne, "B ") = ComboBox2
    For I = 1 To 7
    If Me.Controls("TextBox " & I).Visible = True Then
    Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
    End If
    Next I
    End If
    End Sub

    'Pour le bouton quitter
    Private Sub CommandButton3_Click()
    Unload Me
    End Sub

    'Pour le formulaire
    Private Sub UserForm_Initialize()
    Dim J As Long
    Dim I As Integer
    ComboBox2.ColumnCount = 1 'Pour la liste déroulante Civilité
    ComboBox2.List() = Array("", "M.", "Mme", "Mlle")
    Set Ws = Sheets("Clients") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next J
    End With
    For I = 1 To 7
    Me.Controls("TextBox" & I).Visible = True
    Next I
    End Sub

    Dès que je clique maintenant sur F5, j’ai un message sur la partie userform qui m’indique « erreur de compilation, variable non définie, surlignage de private sur userform et en bleu de combobox2.

    J’ai la version Excel 2011 sur Mac.
    Merci si vous pouviez m’aider.
    Bien cordialement.

    1. Bonjour Patrice,

      Est-ce que vous avez bien une combobox qui s’appelle Combobox2 ? Car je viens de copier-coller votre code à la place du mien en gardant les contrôles sur mon formulaire et il fonctionne.

  26. Bonjour Lydia,

    Je vous remercie pour votre tuto qui est vraiment bien détaillé. Cependant, j’ai un souci dans la partie « Pour le formulaire » :
    'Pour le formulaire
    Private Sub UserForm2_Initialize()
    Dim J As Long
    Dim I As Integer
    ComboBox2.ColumnCount = 1 'Pour la liste déroulante Civilité
    ComboBox2.List() = Array("", "M.", "Mme", "Mlle")
    Set Ws = Sheets("Patients") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next J
    End With
    For I = 1 To 22
    Me.Controls("TextBox" & I).Visible = True
    Next I
    End Sub

    Dans mes listes déroulantes, les champs sont vides et, de plus, je n’arrive pas à rappeler un client déjà dans ma base. Je suis en Excel 2007.

    Je vous remercie de votre aide, encore une fois, bravo et merci.

    1. Bonjour David,

      Vous appelez la procédure Private Sub UserForm2_Initialize(), or, quel que soit le nom de votre UserForm, il sera toujours appelé par Private Sub UserForm_Initialize().

  27. Bonjour Lydia.
    Merci pour vos tutos qui sont clairs et très utiles à beaucoup de monde.
    J’ai utilisé vos lignes de code VBA pour créer un tableau qui me permet de gérer un groupe de cyclistes et les compétitions auxquelles ils sont inscrits.
    J’ai juste besoin d’une explication pour créer une combobox supplémentaire.
    Je n’arrive pas à savoir quel code insérer et où l’insérer.
    Merci d’avance pour votre aide et encore bravo pour votre travail.

  28. Bonjour Lydia,
    Encore merci pour vos tutos.
    J’ai trouvé la solution pour ajouter une combobox (voir code ci-après) :
    Option Explicit
    Dim Ws As Worksheet
    'Pour le formulaire
    Private Sub UserForm_Initialize()
    Dim J As Long
    Dim I As Integer
    ComboBox2.ColumnCount = 1 'Pour la liste déroulante Civilité
    ComboBox2.List() = Array(" ", "M.", "Mme", "Mlle")
    Set Ws = Sheets("Coursiers") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next J
    End With
    For I = 1 To 10
    Me.Controls("TextBox" & I).Visible = True
    Next I
    Dim K As Long
    ComboBox3.ColumnCount = 1 'Pour la liste déroulante Catégorie
    ComboBox3.List() = Array(" ", "1", "2", "3", "GS", "F/GS", "13/14", "15/16")
    Set Ws = Sheets("Coursiers") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For K = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next K
    End With
    For I = 1 To 10
    Next I
    End Sub

    Cela fonctionne très bien.
    Encore merci.

  29. Bonjour Lydia,
    Je me permets de revenir vers vous, car j’ai un problème.
    Comme dit précédemment, j’ai rajouté une combobox et j’arrive à entrer de nouveaux contacts, mais quand je veux modifier un contact, tout ce qui se trouve après la combobox 3, en colonne J, est décalé. Je n’arrive pas à trouver la solution.
    Voici le code que j’ai écrit à partir du vôtre :
    Option Explicit
    Dim Ws As Worksheet
    'Pour le formulaire
    Private Sub UserForm_Initialize()
    Dim J As Long
    Dim I As Integer
    ComboBox2.List() = Array(" ", "M.", "Mme", "Mlle")
    Set Ws = Sheets("Coursiers") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next J
    End With
    For I = 1 To 10
    Me.Controls("TextBox" & I).Visible = True
    Next I
    Dim K As Long
    ComboBox3.List() = Array(" ", "1", "2", "3", "GS", "F/GS", "13/14", "15/16")
    Set Ws = Sheets("Coursiers") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For K = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next K
    End With
    For I = 1 To 10
    Next I
    End Sub
    'Pour la liste déroulante Code client
    Private Sub ComboBox1_Change()
    Dim Ligne As Long
    Dim I As Integer
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    ComboBox2 = Ws.Cells(Ligne, "B")
    For I = 1 To 10
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
    Next I
    End Sub
    'Pour le bouton Nouveau contact
    Private Sub CommandButton1_Click()
    Dim L As Integer
    If MsgBox("Confirmez-vous l’insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d’ajout") = vbYes Then
    L = Sheets("Coursiers").Range("A" & Rows.Count).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
    Range("A" & L).Value = ComboBox1
    Range("B" & L).Value = ComboBox2
    Range("j" & L).Value = ComboBox3
    Range("C" & L).Value = TextBox1
    Range("D" & L).Value = TextBox2
    Range("E" & L).Value = TextBox3
    Range("F" & L).Value = TextBox4
    Range("G" & L).Value = TextBox5
    Range("H" & L).Value = TextBox6
    Range("I" & L).Value = TextBox7
    Range("K" & L).Value = TextBox8
    Range("L" & L).Value = TextBox9
    Range("M" & L).Value = TextBox10
    Dim J As Long
    Dim I As Integer
    ComboBox1.Clear
    Set Ws = Sheets("Coursiers") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next J
    End With
    Else
    'rien
    End If
    End Sub
    'Pour le bouton Modifier
    Private Sub CommandButton2_Click()
    Dim Ligne As Long
    Dim I As Integer
    If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    Ws.Cells(Ligne, "B") = ComboBox2
    For I = 1 To 10
    Next I
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    Ws.Cells(Ligne, "J") = ComboBox3
    Ligne = Me.ComboBox1.ListIndex + 2
    For I = 1 To 10
    Next I
    End If
    End Sub
    'Pour le bouton Quitter
    Private Sub CommandButton3_Click()
    Unload Me
    End Sub

    Merci d’avance.

    1. Bonjour Bernard,

      Je suppose que votre combobox se trouve au milieu des 10 textbox ? Si oui, le souci vient de la boucle. Lorsque vous utilisez une boucle (For … Next), il faut que les contrôles en question (les textbox ici) se suivent sans interruption. Donc si votre combobox se trouve à la 4e position par exemple, vous pouvez faire une boucle des textbox de 1 à 3, puis une autre pour 5 à 10 et vous programmez la combobox à part ou alors vous programmez chaque contrôle sur ce modèle :
      Ws.Cells(Ligne, "A") = Combobox1
      Ws.Cells(Ligne, "B") = Textbox1
      Ws.Cells(Ligne, "C") = Combobox2

      etc.

  30. Bonjour Lydia
    Merci pour votre réponse.
    Je vais suivre vos conseils et vous donner le résultat.
    J’ai une autre question si vous le permettez.
    Comment réaliser une combobox à deux colonnes sous Excel ?
    Merci d’avance pour votre réponse et encore bravo pour vos tutos qui sont très bons.

  31. Bonjour Lydia,
    Comme dit précédemment, j’ai modifié les boucles des textbox, cela fonctionne pour l’entrée de nouvelles données, mais pas pour le bouton Modifier.
    Je vous joins le code, si vous avez le temps.
    Encore bravo et merci pour vos tutos.
    Option Explicit
    Dim Ws As Worksheet
    Private Sub CommandButton4_Click()
    Rows([A2:A1048576].Find(ComboBox1.Value).Row).EntireRow.Delete
    Unload Me
    UserForm1.Show
    End Sub
    'Pour le formulaire
    Private Sub UserForm_Initialize()
    Dim J As Long
    ComboBox2.List() = Array("", "1", "2", "3", "GS", "F/GS", "13-14", "15-16")
    ComboBox3.List() = Array("", "M.", "Mme", "Mlle")
    Set Ws = Sheets("Coursiers") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next J
    End With
    End Sub
    'Pour la liste déroulante ID
    Private Sub ComboBox1_Change()
    Dim Ligne As Long
    Dim I As Integer
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    ComboBox3 = Ws.Cells(Ligne, "B")
    For I = 1 To 7
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
    Next I
    ComboBox2 = Ws.Cells(Ligne, "J")
    For I = 8 To 10
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
    Next I
    End Sub
    'Pour le bouton Nouveau contact
    Private Sub CommandButton1_Click()
    Dim L As Integer
    Dim J As Long
    Dim I As Integer
    If MsgBox("Confirmez-vous l’insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d’ajout") = vbYes Then
    L = Sheets("Coursiers").Range("A" & Rows.Count).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
    Range("A" & L).Value = ComboBox1
    Range("B" & L).Value = ComboBox3
    Range("C" & L).Value = TextBox1
    Range("D" & L).Value = TextBox2
    Range("E" & L).Value = TextBox3
    Range("F" & L).Value = TextBox4
    Range("G" & L).Value = TextBox5
    Range("H" & L).Value = TextBox6
    Range("I" & L).Value = TextBox7
    Range("J" & L).Value = ComboBox2
    Range("K" & L).Value = TextBox8
    Range("L" & L).Value = TextBox9
    Range("M" & L).Value = TextBox10
    End If
    End Sub
    'Pour le bouton Modifier
    Private Sub CommandButton2_Click()
    Dim Ligne As Long
    Dim I As Integer
    If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    Ws.Cells(Ligne, "J") = ComboBox2
    For I = 1 To 7
    If Me.Controls("TextBox" & I).Visible = True Then
    Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
    End If
    Next I
    Ws.Cells(Ligne, "B") = ComboBox3
    For I = 8 To 10
    If Me.Controls("TextBox" & I).Visible = True Then
    Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
    End If
    Next I
    End If
    End Sub
    'Pour le bouton Quitter
    Private Sub CommandButton3_Click()
    Unload Me
    End Sub

    Bernard

  32. Re-bonjour Lydia,
    Justement, le problème est là, je n’arrive pas à modifier les boucles avec succès.
    Pour l’instant, j’en suis là, mais ça bloque.
    'Pour le bouton Modifier 1ère partie
    Private Sub CommandButton2_Click()
    Dim Ligne As Long
    Dim J As Long
    Dim I As Integer
    If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    ComboBox3 = Ws.Cells(Ligne, "B")
    For I = 1 To 7
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
    Next I
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
    Next I
    ComboBox2 = Ws.Cells(Ligne, "J")
    For I = 8 To 10
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
    Next I
    End If
    End Sub

    Encore merci.

  33. Bonjour Lydia
    Cela me décale les colonnes et le nom n’apparaît plus dans le formulaire.
    Je suis novice en VBA et j’avoue que, là, je patine vraiment.
    Encore merci de votre patience.
    Bernard

    1. Bonjour Bernard,

      Avez-vous essayé :
      'Pour le bouton Modifier 1ère partie
      Private Sub CommandButton2_Click()
      Dim Ligne As Long
      If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
      If Me.ComboBox1.ListIndex = -1 Then Exit Sub
      Ligne = Me.ComboBox1.ListIndex + 2
      ComboBox1 = Ws.Cells(Ligne, "A")
      ComboBox2 = Ws.Cells(Ligne, "B")
      ComboBox3 = Ws.Cells(Ligne, "J")
      TextBox1 = Ws.Cells(Ligne, "C")
      TextBox1 = Ws.Cells(Ligne, "D")
      TextBox1 = Ws.Cells(Ligne, "E")
      TextBox1 = Ws.Cells(Ligne, "F")
      TextBox1 = Ws.Cells(Ligne, "G")
      TextBox1 = Ws.Cells(Ligne, "H")
      TextBox1 = Ws.Cells(Ligne, "I")
      TextBox1 = Ws.Cells(Ligne, "K")
      TextBox1 = Ws.Cells(Ligne, "L")
      TextBox1 = Ws.Cells(Ligne, "M")
      End If
      End Sub

  34. Bonsoir Lydia,
    Désolé, mais cela ne marche pas non plus.
    Si cela vous intéresse, je peux vous envoyer le fichier pour que vous puissiez le tester, mais je ne sais pas comment faire.
    Merci encore pour votre aide.

  35. Bonsoir Lydia,
    Après un moment de réflexion sur mon problème, je reviens vers vous pour dire que je l’ai résolu.
    Le décalage des colonnes dans le formulaire venait, en fait, des valeurs affichées à la ligne Ws.Cells (ligne, I+3) pour la liste déroulante et Ws.Cells (ligne, I+9) dans le bouton Modifier. Depuis, cela marche.
    Je vous joins le code au cas où :
    'Pour le formulaire
    Private Sub UserForm_Initialize()
    Dim J As Long
    ComboBox2.List() = Array("", "1", "2", "3", "GS", "F/1", "F/2", "F/3", "F/GS", "13-14", "15-16", "D1", "D2", "D3", "DIR/D1")
    ComboBox3.List() = Array("", "M.", "Mme", "Mlle")
    Set Ws = Sheets("Coursiers") 'Correspond au nom de votre onglet dans le fichier Excel
    With Me.ComboBox1
    For J = 3 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next J
    End With
    End Sub
    'Pour la liste déroulante ID
    Private Sub ComboBox1_Change()
    Dim Ligne As Long
    Dim I As Integer
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 3
    ComboBox3 = Ws.Cells(Ligne, "B")
    For I = 1 To 7
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
    Next I
    ComboBox2 = Ws.Cells(Ligne, "J")
    For I = 8 To 10
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 3)
    Next I
    End Sub
    'Pour le bouton Nouveau contact
    Private Sub CommandButton1_Click()
    Dim L As Integer
    If MsgBox("Confirmez-vous l’insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d’ajout") = vbYes Then
    L = Sheets("Coursiers").Range("A" & Rows.Count).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
    Range("A" & L).Value = ComboBox1
    Range("B" & L).Value = ComboBox3
    Range("J" & L).Value = ComboBox2
    Range("C" & L).Value = TextBox1
    Range("D" & L).Value = TextBox2
    Range("E" & L).Value = TextBox3
    Range("F" & L).Value = TextBox4
    Range("G" & L).Value = TextBox5
    Range("H" & L).Value = TextBox6
    Range("I" & L).Value = TextBox7
    Range("K" & L).Value = TextBox8
    Range("L" & L).Value = TextBox9
    Range("M" & L).Value = TextBox10
    End If
    Unload Me
    UserForm1.Show
    End Sub
    'Pour le bouton Modifier
    Private Sub CommandButton2_Click()
    Dim Ligne As Long
    Dim I As Integer
    If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 3
    Ws.Cells(Ligne, "B") = ComboBox3
    For I = 1 To 7
    If Me.Controls("TextBox" & I).Visible = True Then
    Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
    End If
    Next I
    End If
    Ws.Cells(Ligne, "J") = ComboBox2
    For I = 8 To 10
    If Me.Controls("TextBox" & I).Visible = True Then
    Ws.Cells(Ligne, I + 9) = Me.Controls("TextBox" & I)
    End If
    Next I
    Unload Me
    UserForm1.Show
    End Sub

    Encore merci pour votre aide et bon courage à vous.

      1. Bonjour,
        Tout d’abord, je vous remercie pour votre qualité de tuto.
        Après avoir suivi toutes les procédures, au moment de tester le formulaire, j’obtiens le message suivant : « Erreur d’exécution ‘9’ l’indice n’appartient pas à la sélection ».
        Comment y voir plus clair ?
        Merci infiniment.

        1. Bonjour Yassine,

          Cette erreur apparaît lorsque appelez un objet qui n’existe pas (contrôle, fichier…) : vous serez aidé par la ligne jaune qui apparaît au moment de l’erreur pour vous indiquez l’origine du problème.

  36. Bonjour,
    Comment on peut régler le problème d’Erreur d’exécution ‘9’ : L’indice n’appartient pas à la sélection. Je suis débutant et je pense avoir tout respecté sur la démo.
    Quelqu’un a déjà eu affaire à cette erreur ?
    Si oui, comment la résoudre ?

    1. Bonjour Harry,
      Avez-vous exactement les mêmes noms que dans mon fichier (fichier, contrôles…), car cette erreur signifie que vous appelez un objet qui n’existe pas ?

  37. Bonjour Lydia,
    Merci pour ton retour.
    En fait, je ne comprends pas d’où vient l’erreur.
    J’ai renommé la feuille de mon classeur en lui donnant le même nom que le vôtre (clients) et le contenu est le même.
    D’autre part, j’ai nommé mon fichier clients.xlsm.
    Au niveau du sheet (« clients ») qui est le nom de la feuille du classeur.
    Lorsque je fais l’exécution pas à pas avec F8 le programme se bloque au niveau de la ligne 9.
    Puis-je avoir plus d’indications sur fichier et contrôle ?
    Merci d’avance.

  38. Bonjour Lydia,
    Voilà, j’ai un problème avec l’utilisation d’une checkbox.
    J’ai écrit le code suivant, mais j’ai une erreur à AddItem.

    Private Sub CheckBox1_Click()
    Dim j As Long
    If Worksheets("Inscription_Route").CheckBox1.Value = True Then
    Sheets("Chèques").Select
    For j = 2 To Range("E" & Rows.Count).End(xlUp).Row
    AddItem("1").Range ("E" & j)
    End If
    Sheets("Inscriptions_ROUTE").Select
    Range("E34").Select
    End Sub

    Cette formule doit me permettre d’écrire le chiffre 1 dans la colonne E de la Feuille « Chèque » quand je coche la checkbox placée sur la feuille « inscription_ROUTE ».
    Merci d’avance pour votre réponse.
    Bernard

    1. Bonjour Bernard,

      Je ne comprends pas l’utilisation de Additem dans une checkbox alors que c’est destiné aux listes (en tout cas, je ne l’ai encore jamais vu en dehors des listes puisque cela sert à composer une liste).

  39. Bonjour Lydia,
    Merci pour votre travail, respect.
    J’ai bien lu votre dial de Pierre pour ce qui était de forcer le format d’une TextBox.
    Mais ce n’est pas vraiment ce que je recherche, j’aimerais pouvoir saisir dans une TextBox « 010916 » et avoir, comme résultat dans la cellule, une date « 01-09-2016 ».
    J’ai fait certains essais avec « Cdate » etc. et, ne maîtrisant pas du tout le VBA, je vous appelle au secours ;-).

    Merci par avance.
    Cordialement.

    1. Bonjour Benoît,

      Personnellement, je conserverais le code de Pierre en remplaçant le slash par un tiret, puis j’ajouterais :
      Private Sub TextBox1_AfterUpdate()
      TextBox1 = Left(TextBox1, Len(TextBox1) - 2) & "20" & Right(TextBox1.Value, 2)
      End Sub

      Cela modifierait l’affichage dans la textbox, mais vous laisserait saisir de la manière indiquée.

  40. Quels sont les secteurs qui demandent l’utilisation de VBA sous Excel ou dans quels domaines ou bien à qui, par exemple, je peux faire des prestations de service ?

  41. Bonjour,
    Je suis un débutant et, dans mon job, j’ai voulu faire un formulaire de saisie de données comportant un tableau et regroupant plusieurs feuilles.

  42. Bonjour,
    Je souhaite rajouter des checkbox dans mon formulaire. Pour l’ajout d’un nouveau contact, la valeur vrai-faux apparaît bien, mais, lors d’une recherche via code client, je n’arrive pas à ramener la valeur sur le formulaire.
    De plus, peut-on changer les valeurs vrai-faux par autre chose (oui-non par exemple).

    1. Bonjour,
      Il faut coder la checkbox après mise à jour du code client avec If (If lacellule = « vrai » then lachekbox = true…)
      Pour la 2e question, toujours en codant (si la checkbox est cochée alors la cellule X = « oui »).

  43. Bonjour,

    Tout d’abord, je vous remercie pour vos tutoriels et autres documents. Tout est très clair ! Je démarre tout juste VBA !

    Concernant le formulaire personnalisé, je souhaite créer dans une feuille 1 avec plusieurs boutons. Par exemple : « saisir formulaire 1 », « saisir formulaire 2 ».
    La feuille 1 est une sorte d’accueil.

    Je voudrais que mon formulaire 1 apparaisse dans ma feuille 2 et que mon formulaire 2 apparaisse dans ma feuille 3.

    Dans VBA, j’ai bien nommé les sheets avec les noms des feuilles correspondants.

    Cependant, lors que je remplis mon formulaire, c’est la feuille 1 qui est alimentée et non pas la feuille 2 ou 3.

    Merci d’avance pour votre aide.

  44. Bonjour Lydia,
    Je n’arrive pas à lancer la macro, il y a ce message d’erreur qui s’affiche.
    Désolé, c’est la 1ère fois que j’utilise VBA.

    Sub lancer_formulaire()
    UserForm1.Show vbModeless.
    End Sub

    1. Bonjour Zady,

      Plusieurs possibilités :
      – Avez-vous vraiment mis un point après vbModeless ? Si oui, il faut l’enlever.
      – Votre formulaire s’appelle-t-il UserForm1 ?
      – Enfin, il est probable que le problème ne vienne pas du module, mais du formulaire lui-même. Dans ce cas, faites F5 lorsque vous êtes sur votre formulaire dans la fenêtre VBA et voyez la ligne surlignée.

  45. S’il vous plaît, j’ai besoin de votre aide.
    Comment imprimer des colonnes spécifiques d’une listbox VBA Excel ?
    Exemple : les quatre premières colonnes.
    Merci bien.

  46. Salut Lydia,
    J’ai deux classeurs : le premier s’appelle classeur1 et le deuxième s’appelle classeur2.
    Je n’arrive pas à copier / coller des lignes fusionnées d’un tableau depuis la Feuil1(du classeur1) vers la Feuil2(du classeur 2)
    J’aimerais bien savoir comment le faire.
    En fait, j’ai essayé, mais pas de résultat.
    Voici mon code :
    Sub test()
    Dim finalrow As Long
    Workbooks("Classeur1").Worksheets("Feuil1").Range("D1:D" & finalrow).Value = Workbooks("Classeur2").Worksheets("Feuil2").Range("A2:A" & finalrow).Value
    End Sub

    Je galère 🙁
    Merci infiniment par avance de votre aide et de vos connaissances éclairées !!!

  47. Bonjour Lydia,

    Tout d’abord, comme lu dans beaucoup de commentaires, je tiens à vous remercier particulièrement pour vos tutos qui sont particulièrement utiles et faciles de prise en main.

    Étant néophyte dans l’écriture VBA, je me permets de vous solliciter afin d’obtenir votre aide.
    En effet, j’ai réalisé un formulaire servant d’outil de saisie pour un dashboard sur la base de vos codes adaptés aux données dont j’ai besoin.

    Cependant, je rencontre quelques difficultés :
    – Lors de la saisie via le formulaire, les données apparaissent en format texte et non nombre, cela pose problème notamment pour l’utilisation de tableau croisé dynamique.
    – Mon tableau de données étant légèrement différent du vôtre, avec notamment plus de colonnes et séparées par d’autres colonnes de calcul, cela me pose problème pour la modification. En effet, pour l’ajout de données, c’est OK, mais quand je souhaite modifier une ligne, les données inscrites dans les différentes textbox du formulaire s’ajoutent les unes après les autres dans les colonnes de mon tableau et non dans les colonnes voulues.

    Je suis à l’écoute de toutes les solutions que vous pouvez me présenter et vous remercie vivement.

    Cordialement.
    Alexis

    1. Bonjour Alexis,

      – Il faut utiliser ce genre de syntaxe pour forcer le format : Range(« A » & L).Value = CCur(Prix_unitaire.Value) (Prix_unitaire étant une textbox au format monétaire)
      – Lorsque les colonnes ne se suivent pas, il ne faut pas utiliser de boucle (For I = 1 To 7 par exemple), mais programmer chaque colonne : Ws.Cells(Ligne, « A ») = Textbox1

  48. Bonjour Lydia,

    Quelle réactivité 🙂 ! Effectivement, en fouillant un peu et en réfléchissant, j’ai réussi à obtenir ce que je voulais, mais en grande partie grâce à votre site.

    Encore merci beaucoup pour vos tutos.

    Bonne journée,
    Alexis

  49. Bonjour Lydia,

    J’ai essayé hier de faire presque le même exemple que vous en créant un fichier Excel qui ressemble au vôtre et ça a fonctionné parfaitement, j’en profite pour vous remercier, car vous m’avez facilité la vie.

    Aujourd’hui, je veux l’appliquer sur mon sujet de mémoire où il s’agit d’un fichier à 43 colonnes et 108 lignes, la variable « Civilité » étant placée à la colonne « O », j’avais juste changé la colonne « B » dans votre code par « O », et là, je reçois un message d’erreur me surlignant la ligne : Comnobox2 = WS.Cells(Ligne, "O") en jaune et m’indiquant le message : « Objet requis ».
    Pouvez-vous me dire où se situe l’erreur s’il vous plaît, je suis dessus depuis des heures et je ne sais toujours pas pourquoi cela m’arrive ?

      1. Bonsoir,

        J’ai trouvé l’erreur, c’était un objet inconnu, car j’avais oublié de l’identifier dans l’instruction Dim tout au début du programme (ws), merci encore une fois pour votre attention, vous êtes juste magnifique.

        Une dernière question : est-il possible de rajouter un bouton de commande pour permettre à l’utilisateur d’insérer les nouvelles données (après avoir saisi un nouveau candidat avec toutes ses informations) dans une nouvelle feuille (nouvel onglet que l’on renomme après) ? Car je suis en train d’automatiser des rapports par rapport à une sélection des candidats et je souhaite personnaliser chaque ligne du tableau (chaque candidat) dans un onglet séparé. Si oui, le code doit ressembler à quoi à peu près, s’il vous plaît ?

        Merci encore une fois.

        Cordialement.

        1. Bonsoir,

          Il faudrait ajouter un onglet : Sheets.Add
          Puis, copier-coller la procédure qui copie les données du formulaire vers l’onglet de base pour que cela fasse la même chose sur le nouvel onglet.

  50. Bonjour,
    Tout d’abord, merci pour ces explications !

    J’ai déjà créé un formulaire d’ajout de contact qui marche parfaitement. Mais je souhaite également créer un deuxième formulaire pour modifier les infos de mes contacts en les retrouvant avec une combobox par les noms de famille (colonne B de mon fichier).
    J’ai 25 colonnes en tout et mon tableau commence à la ligne 15 (titres du tableau).

    Voici mon programme :
    FORMULAIRE :
    Private Sub UserForm_Initialize()
    Dim J As Long
    Dim I As Integer
    Set Ws = Sheets("VIP")
    With Me.ComboBox1
    For J = 16 To Ws.Range("B" & Rows.Count).End(xlUp).Row
    .AddItem Ws.Range("A" & J)
    Next J
    End With
    For I = 1 To 24
    Me.Controls("TextBox" & I).Visible = True
    Next I
    End Sub
    BOUTON MODIFIER :
    Private Sub CommandButton1_Click()
    Dim Ligne As Long
    Dim I As Integer
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    For I = 1 To 24
    If Me.Controls("TextBox" & I).Visible = True Then
    Ws.Cells(Ligne, I + 1) = Me.Controls("TextBox" & I)
    End If
    Next I
    End If
    LISTE DÉROULANTE PAR NOM :
    Private Sub ComboBox1_Change()
    Dim Ligne As Long
    Dim I As Integer
    If Me.ComboBox1.ListIndex = -1 Then Exit Sub
    Ligne = Me.ComboBox1.ListIndex + 2
    For I = 1 To 24
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 1)
    Next I
    End Sub

    Cela fait quelques jours que j’essaye de trouver le problème, mais rien ne marche.
    Excel m’indique « erreur d’exécution 9, l’indice n’appartient pas à la sélection ».
    Il m’indique le programme du FORMULAIRE de With Me.combobox1 à End Sub comme quoi l’erreur vient de là.

    Si vous avez une idée de solution, je suis à votre écoute, car je suis assez désespérée ! Encore merci beaucoup !!

    Cordialement.

      1. Bonjour,

        Oui, c’est ce que j’ai fait du coup et cela marche.
        Merci !

        Une autre question : j’ai mis en place une formule pour qu’une date de modification automatique s’inscrive dans la colonne Y dès que la ligne d’une personne est modifiée. Elle marche, mais pour la colonne entière de la feuille et j’aimerais que cette date automatique ne soit que dans le tableau concerné.
        Est-ce possible de sélectionner le tableau, même si des lignes se rajouteront par la suite ?
        Merci d’avance.

  51. Bonjour et merci pour vos tutos très utiles et détaillés.
    Je débute complètement et j’ai suivi à la lettre vos indications, je suis bloquée au moment de faire F5 pour vérifier mon formulaire. J’ai une fenêtre qui s’ouvre et qui affiche :
    Erreur de compilation: Attendu : fin d’instruction.
    De plus, l’écriture verte est rouge malgré le copier-coller de vos codes sur Excel-Plus.
    Avez-vous une solution à m’indiquer ? Merci d’avance.

    1. Bonjour,

      Est-ce bien le contenu du fichier .txt que vous avez copié-collé (à la fin de l’article d’Excel-Plus) ? Si du rouge persiste, c’est une erreur de syntaxe (mauvais guillemets, virgule à la place de point…).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

CAPTCHA
Change the CAPTCHA codeSpeak the CAPTCHA code