Explication Du Code VBA

8
Votre Assistante : http://www.votreassistante.net - le 16/06/2015 Article écrit par Lydia Provin du blog Votre Assistante : http://www.votreassistante.net 1 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, jai décidé de réaliser une sorte de suite afin dexpliquer le code utilisé. Je navais pas expliqué le code lors de ce tutoriel, car cétait ma première expérience du langage VBA et jai donc testé différentes choses jusquà arriver au résultat escompté, mais sans vraiment savoir pourquoi. Jai commencé à lapprendre 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 navez aucune connaissance en VBA, je vous conseille fortement de commencer par un tutoriel tel que celui de la création dun 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 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 fenêtre Visual Basic dans longlet Développeur (si vous ne savez pas comment lafficher, je vous invite à revoir le début du tutoriel de création) > Visual Basic . Explication du code de lUserForm1 : Dans la fenêtre de lExplorateur de projet (si elle napparaî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 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 lécrirez dans ThisWorkbook qui peut être aussi utilisé pour faire une action à louverture dun fichier comme nous lavons fait dans le tutoriel Créer un message dalerte à louverture dExcel.

description

un livre tres interessant pour comprendre le code VBA

Transcript of Explication Du Code VBA

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

    Article crit par Lydia Provin du blog

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

    1

    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.

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

    Article crit par Lydia Provin du blog

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

    2

    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.

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

    Article crit par Lydia Provin du blog

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

    3

    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

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

    Article crit par Lydia Provin du blog

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

    4

    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.

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

    Article crit par Lydia Provin du blog

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

    5

    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

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

    Article crit par Lydia Provin du blog

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

    6

    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.

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

    Article crit par Lydia Provin du blog

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

    7

    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.

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

    Article crit par Lydia Provin du blog

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

    8

    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.