You are on page 1of 8

Votre Assistante : http://www.votreassistante.

net - le 16/06/2015

Explication du code VBA utilis dans le tutoriel


Crer un formulaire personnalis pour saisir des donnes sur Excel
Suite aux nombreuses questions qui ont suivi aprs la publication du tutoriel Crer un
formulaire personnalis pour saisir des donnes sur Excel, jai dcid de raliser une sorte de
suite afin dexpliquer le code utilis.
Je navais pas expliqu le code lors de ce tutoriel, car ctait ma premire exprience du langage
VBA et jai donc test diffrentes choses jusqu arriver au rsultat escompt, mais sans
vraiment savoir pourquoi. Jai commenc lapprendre grce llaboration de ce cours, puis
des commentaires qui ont suivi. Dsormais, la cration de formulaire ou autre en langage VBA
fait partie des prestations que je propose. Si vous navez aucune connaissance en VBA, je vous
conseille fortement de commencer par un tutoriel tel que celui de la cration dun formulaire
de saisie de coordonnes afin de vous mettre le pied ltrier :).

Je vous rappelle que le code VBA utilis dans le tutoriel en question se trouve chez Excel-Plus
puisquil sagit dun article invit. la fin de ce dernier, vous pouvez copier-coller le code pour
navoir aucune erreur.
Pour suivre ces explications, je vous invite vous rendre dans la fentre Visual Basic dans
longlet Dveloppeur (si vous ne savez pas comment lafficher, je vous invite revoir le dbut

du tutoriel de cration) > Visual Basic

Explication du code de lUserForm1 :


Dans la fentre de lExplorateur de projet (si elle napparat pas, cliquez sur
Affichage > Explorateur de projets ou faites Ctrl + R), vous avez par dfaut un dossier
Microsoft Excel Objets qui contient tous vos onglets et ThisWorkbook. Si vous souhaitez crer
une action sur double-clic dune cellule dans un de vos onglets, vous crirez le code dans
longlet correspondant, si vous souhaitez pouvoir effectuer cette action dans nimporte quel
onglet, vous lcrirez dans ThisWorkbook qui peut tre aussi utilis pour faire une action
louverture dun fichier comme nous lavons fait dans le tutoriel Crer un message dalerte
louverture dExcel.

Article crit par Lydia Provin du blog


Votre Assistante : http://www.votreassistante.net
1

Votre Assistante : http://www.votreassistante.net - le 16/06/2015

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 lExplorateur de projets > Code. Javais plac un
commentaire devant chaque vnement tel que linitialisation du formulaire (son ouverture), le
changement au niveau de la ComboBox et les clics sur les diffrents boutons. Ces commentaires
sont en vert et commencent toujours par une apostrophe (), cest--dire que tout ce qui se trouve
derrire une apostrophe ne sera jamais interprt dans votre code. Si vous voulez retirer une
action temporairement, au lieu de leffacer, vous pouvez tout simplement la mettre en
commentaire.
Je navais pas modifi les noms des diffrents contrles (ComboBox1, TextBox1), mais si
vous le faites noubliez pas de le modifier dans luserform et dans le code.

Mon code commence par Option Explicit ce qui veut dire que je vais devoir dclarer toutes mes
variables. De cette manire, si vous ne dclarez pas une variable, le mode dbug que nous allons
voir juste aprs, vous le signalera et vous vitera de dcouvrir des erreurs une fois que votre
programme sera termin et quil contiendra normment de donnes. Si cette ligne vous gne
ou que vous loubliez rgulirement, vous pouvez vous rendre dans le menu Outils > Options
et cocher la case Dclaration des variables obligatoire dans longlet diteur :

Cette case sera coche par dfaut pour tous vos nouveaux projets.

Article crit par Lydia Provin du blog


Votre Assistante : http://www.votreassistante.net
2

Votre Assistante : http://www.votreassistante.net - le 16/06/2015

Il est ensuite suivi de Dim Ws As Worksheet qui est une dclaration de variable que jaurais pu
placer aprs Private Sub UserForm_Initialize(). Mais une dclaration de variable doit toujours
se trouver avant lutilisation de son nom. Cette dclaration va me servir utiliser mon onglet
Clients.

Private Sub UserForm_Initialize() :


louverture du formulaire, jai dclar J et I comme tant des valeurs numriques. Je peux
donner nimporte 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 despaces, de points, de
virgules, de traits dunion ou de slashs (vitez les accents) qui seraient mal interprts par Excel.
En clair, restez simple.
ComboBox2.ColumnCount = 1 indique quil ny aura quune colonne dans la ComboBox2. Si
javais souhait avoir 2, 3, 4 colonnes, il aurait fallu crire les items de la premire colonne,
puis la deuxime, etc. pour avoir une liste droulante du mme type que nous avons ralis dans
le tutoriel sur la facturation avec Access.
ComboBox2.List() = Array("", "M.", "Mme", "Mlle") permet de spcifier les donnes afficher
dans la ComboBox2. Faites attention la mthode utilise pour vos formulaires : si les donnes
nont pas besoin dtre modifies et ne sont pas nombreuses, vous pouvez utiliser la mthode
Array, mais dans le cas o les donnes sont amenes changer souvent, il est prfrable quelles
soient accessibles une personne novice en VBA et qui pourra les modifier dans son classeur
Excel grce la mthode 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 dattribuer une valeur la variable que jai dclare plus
haut, savoir que Ws ne traitera que de longlet Clients (modifiez-le si vous renommez vos
onglets).

Nous avons ensuite un bloc dinstruction qui contient une boucle qui indique que dans la
ComboBox1, nous voulons rcuprer partir de la 2e ligne (la premire tant la ligne de titre)
toutes les cellules se trouvant dans la colonne A de longlet Clients. Cette mthode est prfrable
Range("A65536") que nous allons voir juste aprs, car ici nous allons partir de la dernire
cellule de longlet qui tait la 65 536e sur les versions antrieures 2007, mais a augment
depuis, puis nous remontons jusqu la premire cellule non vide. End(xlUp) est prfrable, car
Article crit par Lydia Provin du blog
Votre Assistante : http://www.votreassistante.net
3

Votre Assistante : http://www.votreassistante.net - le 16/06/2015

si nous partions du haut et quune cellule tait vide dans le tableau, le programme ne prendrait
pas en compte les suivantes. Comme il sagit dune boucle, si vous lancez le mode dbug, vous
verrez que laction se rpte le nombre de fois ncessaire pour afficher tous les items (ici, 20 fois
pour les 20 lignes du tableau).

En ralisant ce tutoriel, je me suis aperue que certaines choses ntaient pas ncessaires dans
mon code comme :
For I = 1 To 7
Me.Controls("TextBox" & I).Visible = True
Next I
Il sagit dune boucle pour les 7 TextBox (do lintrt de modifier ce chiffre si vous en ajoutez
ou supprimez) qui va les rendre visibles Or, elles sont, par dfaut, visibles. Par la mme
occasion, la dclaration de I nest plus indispensable.
Donc

si

ce

code

tait

refaire,

je

supprimerais

cette

boucle

ainsi

que

ComboBox2.ColumnCount = 1 puisquune ComboBox contient par dfaut au moins une


colonne et je supprimerais galement le Me. dans With Me.ComboBox1 puisque la ComboBox1
est dans ce mme formulaire.

Private Sub ComboBox1_Change() :


Sur changement de la ComboBox1, les donnes vont se mettre jour dans les autres contrles
du formulaire. Je dclare Ligne et I comme tant des valeurs numriques.
If Me.ComboBox1.ListIndex = -1 Then Exit Sub permet de sortir de la procdure dans le cas o
vous ne slectionnerez aucun numro client.
Ligne est gale la ligne de la ComboBox1 (si vous modifiez + 2 en + 1 ou + 3, vous verrez
quil y a un dcalage au niveau des donnes affiches).

ComboBox2 = Ws.Cells(Ligne, "B") va ensuite rcuprer les donnes de la ligne en cours la


colonne B (vous remarquerez que je nai pas eu besoin de dclarer nouveau Ws, car il nest
pas dans un Private sub contrairement I que jai d dclarer de nouveau).

Je fais ensuite une boucle sur toutes les TextBox (7) pour rcuprer toutes les donnes dans
chaque contrle. Chaque contrle (du 1er au 7e) sera gal sa ligne et sa colonne dans longlet.
Je nai pas cr de boucle pour la ComboBox2 puisquil ny avait quune ComboBox.
Article crit par Lydia Provin du blog
Votre Assistante : http://www.votreassistante.net
4

Votre Assistante : http://www.votreassistante.net - le 16/06/2015

On peut faire en sorte que notre liste droulante se mette jour lorsque lon ajoute un numro
client, mais comme laction devra tre utilise aprs confirmation de lajout dun client, on va
lajouter dans lvnement suivant.

Private Sub CommandButton1_Click() :


Sur clic du bouton CommandButton1, je vais ajouter un contact. Pour cela, je dclare L comme
tant une valeur numrique dont je donne la valeur juste aprs, savoir que cest la dernire
cellule de la colonne A de longlet Clients + 1, cest--dire que je me place aprs la dernire
cellule non vide. Comme indiqu plus haut, je remplacerais "a65536" par "A" & Rows.Count
qui signifie exactement la mme chose, mais qui pourra tre transposable dun ordinateur un
autre sils nont pas les mmes versions.

Jajoute ensuite une condition grce la fonction If qui est si je rponds Oui mon MsgBox
qui est une bote de dialogue qui me demandera Confirmez-vous linsertion de ce nouveau
contact ?, qui contiendra les boutons Oui et Non et qui aura pour titre Demande de confirmation
dajout, alors on va effectuer laction qui se trouve, ici, avant End If.
Personnellement, je rajouterais :
Else
' Rien ou Exit Sub (puisque de toute faon linstruction est termine aprs)
avant End If pour plus de clart, mais a fonctionne quand mme sans.

Si je rponds Oui alors ma ComboBox1 va recopier sa valeur dans la colonne A la dernire


ligne non vide + 1, ComboBox2 va recopier dans B et ainsi de suite. Faites attention lordre :
cest toujours la destination qui est gale au dpart. Lordre des proprits na pas dimportance,
mais les noms de TextBox et de colonnes oui.

Si vous souhaitez mettre jour la liste droulante aprs 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
Article crit par Lydia Provin du blog
Votre Assistante : http://www.votreassistante.net
5

Votre Assistante : http://www.votreassistante.net - le 16/06/2015

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 mme code que celui de la liste droulante louverture avec
ComboBox1.Clear. Ce dernier est important, car la confirmation, la liste des codes client va
tre recharge, or si elle nest pas vide (Clear), chaque nouvel ajout, vous aurez votre liste
prcdente + la nouvelle liste, donc plein de doublons.

Private Sub CommandButton2_Click() :


Sur clic du bouton CommandButton2, je veux mettre jour les donnes existantes. Pour cela,
je dclare une nouvelle fois Ligne et I comme tant des valeurs numriques et je cre une bote
de dialogue Oui/Non qui dclenchera laction si je clique sur Oui. Le code est quasiment
similaire celui du changement de liste droulante 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 dcharg, cest--dire
ferm, ce qui libre par la mme occasion la mmoire du programme.

Retirer la saisie semi-automatique dune ComboBox sur Excel :


Par dfaut, une ComboBox possde la saisie semi-automatique, il sagit de la proprit
MatchEntry. Cela est trs 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 numro
client et, forcment, la saisie fait appel aux donnes dj enregistres si lon commence par un
chiffre dj attribu.

Article crit par Lydia Provin du blog


Votre Assistante : http://www.votreassistante.net
6

Votre Assistante : http://www.votreassistante.net - le 16/06/2015

Pour modifier cette proprit, cliquez sur la ComboBox1 en mode Afficher lobjet (clic droit sur
lUserForm1 dans lExplorateur de projets) et, dans le panneau Proprits, recherchez la
ligne MatchEntry et slectionnez loption qui vous intresse :

0 - fmMatchEntryFirstLetter : affiche le premier item de la liste commenant par la lettre


saisie et si lon appuie sur la lettre, sur le clavier, de manire rpte, les autres items de la
liste commenant par cette lettre saffichent successivement ;

1 fmMatchEntryComplete : affiche une premire suggestion qui peut tre modifie au


fil de la saisie ;

2 fmMatchEntryNone : pas de saisie semi-automatique.

Cette proprit peut tre ajoute via le code en ajoutant cette ligne dans linitialisation du
formulaire par exemple (le code remplace la proprit) :
ComboBox1.MatchEntry = fmMatchEntryNone
Attention : cette proprit ne fonctionne pas sur Mac et provoque une erreur.

Explication du code du Module1 :


Ce module est une macro cre dans le but dappeler le formulaire de saisie. Celle-ci dbute
par Sub et se termine par End Sub. Dans cet exemple, javais appel cette macro
Lancer_formulaire. Cest ce nom que vous retrouverez dans longlet Dveloppeur > Macros.
Il est galement possible de crer un bouton sur votre fichier Excel pour lancer ce formulaire si
vous ne souhaitez pas passer par un raccourci. Pour cela, crez une forme soit en passant par

longlet Dveloppeur > Insrer

> Bouton ce qui ouvre la bote de dialogue des macros

directement, mais noffre pas la possibilit de personnaliser le bouton en terme de forme ou de


couleur, soit en passant par longlet Insertion > Formes

(le bouton pourra tre

modifi avec longlet Format) puis en cliquant droit dessus > Affecter une macro. Une fois
que la bote de dialogue des macros est ouverte, il vous suffit de slectionner la macro
correspondante au lancement du formulaire.

UserForm1.Show affiche le formulaire UserForm1. tant donn que je navais pas chang le
nom du formulaire, cest donc le nom de base, les formulaires suivants seraient UserForm2,
UserForm3 sauf si vous les renommez.

Article crit par Lydia Provin du blog


Votre Assistante : http://www.votreassistante.net
7

Votre Assistante : http://www.votreassistante.net - le 16/06/2015

vbModeless permet douvrir le formulaire en non modal, cest--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 nest pas utile crire puisque cest le
fonctionnement pas dfaut.

Enfin, vous pouvez parfois avoir une erreur dexcution sur la ligne affichant le formulaire dans
le module. Si le nom de votre formulaire est bien saisi, le problme vient surement de
linitialisation du formulaire dans le code de lUserform.

Utilit du mode dbogage :


Le mode dbogage permet de vrifier que votre code est bien crit (absence de fautes de frappe,
toutes les variables sont dclares). Vous pouvez directement passer par la mise en pratique
en lanant votre formulaire et en le testant, mais si beaucoup de scnarios sont possibles, cela
peut vous prendre du temps alors quil est prfrable de ne le faire qu la dernire tape de la
cration de votre programme afin de vrifier que les donnes sont bien traites de la manire
que vous souhaitez.

Pour lancer ce mode, dans la fentre VBA, cliquez sur Dbogage > Compiler suivi
gnralement de VBAProject qui est le nom donn par dfaut votre projet. Il peut tre modifi
en cliquant droit sur VBAProject (Le nom de votre fichier avec son extension) dans la fentre
Projet > Proprits de VBAProject. Dans le champ Nom du projet, vous pouvez modifier le
nom par dfaut.
Une fois le mode lanc, sil ne se passe rien, cest que votre code est correct. Dans le cas
contraire, une fentre souvre avec lerreur. Si par exemple, je supprime la ligne de dclaration
de J dans linitialisation du formulaire (Dim J As Long) et que je lance le mode dbug, jai bien
lerreur de variable non dfinie.

Pour terminer, nhsitez pas voir ou revoir le tutoriel Comment vider (effacer) un userform
aprs validation sur Excel ? utilisant le mme formulaire de saisie.

Article crit par Lydia Provin du blog


Votre Assistante : http://www.votreassistante.net
8