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

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

-

Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres
9 pages
Français
Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres

Description

Tutoriel pour comprendre le code VBA utilisé dans le tutoriel Créer un formulaire personnalisé pour saisir des données sur Excel. Comment créer des boucles, évènements, blocs d'instruction avec Excel VBA ?

Sujets

Informations

Publié par
Publié le 19 janvier 2021
Nombre de lectures 49
Licence : Tous droits réservés
Langue Français

Extrait

Votre Assistante :https://www.votreassistante.net- le 16/06/2015
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 dututoriel 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 desprestations que je propose. Si vous navez aucune connaissance en VBA, je vous conseille fortement de commencer par untutoriel tel que celui de la création dun formulaire de saisie de coordonnéesafin de vous mettre le pied à létrier :). Je vous rappelle que le code VBA utilisé dans le tutoriel en question se trouve chezExcel-Pluspuisquil 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êtreVisual Basic dans longletDéveloppeur(si vous ne savez pas comment lafficher, je vous invite à revoir le début
dututoriel 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 faitesCtrl + R), vous avez par défaut un dossier Microsoft Excel Objetsqui contient tous vos onglets etThisWorkbook. 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 dansThisWorkbook qui peut être aussi utilisé pour faire une action à
Article écrit par Lydia Provin du site Votre Assistante :https://www.votreassistante.net
1
Votre Assistante :https://www.votreassistante.net- le 16/06/2015
louverture dun fichier comme nous lavons fait dans le tutorielCréer un message dalerte à louverture dExcel. Dans notre exemple, nous avons ensuite ajouté unUserFormet unModule. Les premiers se trouvent toujours dans un dossier nomméFeuillesles seconds dans un dossier nommé et Modules. Cliquez droit surUserForm1l de Explorateur de projets >Code. Javais placé un commentaire devant chaque évènement tel que linitialisation 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 (), cest-à-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 leffacer, vous pouvez tout simplement la mettre en commentaire. Je navais pas modifié les noms des différents contrôles (ComboBox1, TextBox1…), mais si vous le faites noubliez pas de le modifier dans luserform et dans le code. Mon code commence parOption Explicitce 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 quil contiendra énormément de données. Si cette ligne vous gêne
Article écrit par Lydia Provin du site Votre Assistante :https://www.votreassistante.net
2
Votre Assistante :https://www.votreassistante.net- le 16/06/2015
ou que vous loubliez régulièrement, vous pouvez vous rendre dans le menuOutils>Optionset cocher la caseDéclaration des variables obligatoiredans longletÉditeur:
Cette case sera cochée par défaut pour tous vos nouveaux projets. Il est ensuite suivi deDimWsAsWorksheetqui est une déclaration de variable que jaurais pu placer aprèsPrivate SubUserForm_Initialize(). Mais une déclaration de variable doit toujours se trouver avant lutilisation de son nom. Cette déclaration va me servir à utiliser mon onglet Clients. Private Sub UserForm_Initialize() À louverture du formulaire, jai déclaréJetIcomme étant des valeurs numériques. 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 interprétés par Excel.
En clair, restez simple. ComboBox2.ColumnCount = 1indique quil ny aura quune colonne dans laComboBox2. Si javais 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 letutoriel sur la facturation avec Access. ComboBox2.List() = Array("", "M.", "Mme", "Mlle")permet de spécifier les données à afficher dans laComboBox2. Faites attention à la méthode utilisée pour vos formulaires : si les données nont pas besoin dêtre modifiées et ne sont pas nombreuses, vous pouvez utiliser la méthode
Article écrit par Lydia Provin du site Votre Assistante :https://www.votreassistante.net
3
1 2 3
Votre Assistante :https://www.votreassistante.net- le 16/06/2015
Array, mais dans le cas où les données sont amenées à changer souvent, il est préférable quelles soient accessibles à une personne novice en VBA et qui pourra les modifier dans son classeur Excel grâce à la méthodeAddItemqui suit. Ici, nous avons, la possibilité de ne rien afficher ou de choisirM.,MmeouMlle. SetWs = Sheets("Clients")me permet dattribuer une valeur à la variable que jai déclarée plus haut, à savoir queWstraitera que de l ne ongletClients (modifiez-le si vous renommez vos onglets). Nous avons ensuite un bloc dinstruction qui contient une boucle qui indique que dans la e ComboBox1, nous voulons récupérer à partir de la 2 ligne (la première étant la ligne de titre) toutes les cellules se trouvant dans la colonneAde longletClients. 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 e cellule de longlet qui était la 65 536 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 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 débug, vous verrez que laction 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 sagit dune boucle pour les 7 TextBox (doù linté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 lamême occasion, la déclaration deInest plus indispensable. Donc si ce code était à refaire, je supprimerais cette boucle ainsi que ComboBox2.ColumnCount = 1 puisquune ComboBox contient par défaut au moins une colonne et je supprimerais également leMe.dansWithMe.ComboBox1puisque laComboBox1est dans ce même formulaire.
Article écrit par Lydia Provin du site Votre Assistante :https://www.votreassistante.net
4
Votre Assistante :https://www.votreassistante.net- le 16/06/2015
Private Sub ComboBox1_Change() Sur changement de laComboBox1, les données vont se mettre à jour dans les autres contrôles du formulaire. Je déclareLigneetIcomme étant des valeurs numériques. IfMe.ComboBox1.ListIndex = -1Then Exit Subpermet de sortir de la procédure dans le cas où vous ne sélectionnerez aucun numéro client. Ligneest égale à la ligne de laComboBox1(si vous modifiez + 2 en + 1 ou + 3, vous verrez quil 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 colonneB(vous remarquerez que je nai pas eu besoin de déclarer à nouveauWs, car il nest pas dans unPrivate subcontrairement àIque jai dû déclarer de nouveau). Je fais ensuite une boucle sur toutes les TextBox (7) pour récupérer toutes les données dans er e chaque contrôle. Chaque contrôle (du 1 au 7 ) sera égal à sa ligne et sa colonne dans longlet. Je nai pas créé de boucle pour laComboBox2puisquil ny avait quune ComboBox. On peut faire en sorte que notre liste déroulante se mette à jour lorsque lon ajoute un numéro client, mais comme laction devra être utilisée après confirmation de lajout dun client, on va lajouter dans lévènement suivant.
Private Sub CommandButton1_Click() Sur clic du boutonCommandButton1, je vais ajouter un contact. Pour cela, je déclareLcomme étant une valeur numérique dont je donne la valeur juste après, à savoir que cest la dernière cellule de la colonne A de longletClients+ 1, cest-à-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 dun ordinateur à un autre sils nont pas les mêmes versions. Jajoute ensuite une condition grâce à la fonctionIfqui est si je répondsOuià mon MsgBox qui est une boîte de dialogue qui me demanderaConfirmez-vous linsertion de ce nouveau contact ?, qui contiendra les boutonsOuietNonet qui aura pour titreDemande de confirmation dajout, alors on va effectuer laction qui se trouve, ici, avantEnd If. Personnellement, je rajouterais :
Article écrit par Lydia Provin du site Votre Assistante :https://www.votreassistante.net
5
1 2
1 2 3 4 5 6 7 8 9
Votre Assistante :https://www.votreassistante.net- le 16/06/2015
Else ' Rien ou Exit Sub (puisque de toute façon linstruction est terminée après) avantEnd Ifpour plus de clarté, mais ça fonctionne quand même sans. Si je répondsOuialors maComboBox1va recopier sa valeur dans la colonneAà la dernière ligne non vide + 1,ComboBox2va recopier dansBet ainsi de suite. Faites attention à lordre : cest toujours la destination qui est égale au départ. Lordre des propriétés na pas dimportance, mais les noms deTextBoxet 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 à louverture avec ComboBox1.Clear. Ce dernier est important, car à la confirmation, la liste des codes client va être rechargée, or si elle nest 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 boutonCommandButton2, je veux mettre à jour les données existantes. Pour cela, je déclare une nouvelle foisLigneetIcomme étant des valeurs numériques et je crée une boîte de dialogueOui/Nondéclenchera l qui action si je clique surOui. Le code est quasiment similaire à celui du changement de liste déroulante donc je le simplifie en retirantIfMe.Controls("TextBox" & I).Visible = TrueThensuivi de sonEnd Ifpuisque lesTextBoxsont toutes visibles. Ici aussi, on peut ajouter :
Article écrit par Lydia Provin du site Votre Assistante :https://www.votreassistante.net
6
1 2
Votre Assistante :https://www.votreassistante.net- le 16/06/2015
Else 'Rien ou Exit Sub avantEnd If. Private Sub CommandButton3_Click() Sur clic du boutonCommandButton3, le formulaire en cours (Me) va être déchargé, cest-à-dire fermé, ce qui libère par la même occasion la mémoire du programme. Retirer la saisie semi-automatique dune ComboBox sur Excel Par défaut, une ComboBox possède la saisie semi-automatique, il sagit 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, laComboBox1servait à saisir un numéro client et, forcément, la saisie fait appel aux données déjà enregistrées si lon commence par un
chiffre déjà attribué. Pour modifier cette propriété, cliquez sur laComboBox1en modeAfficher lobjet(clic droit sur l’UserForm1l dans Explorateur de projets) et, dans le panneauPropriétés, recherchez la ligneMatchEntryet sélectionnez loption qui vous intéresse : 0 - fmMatchEntryFirstLetter :affiche le premier item de la liste commençant par la lettre saisie et si lon 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 saffichent successivement ; 1fmMatchEntryComplete :affiche une première suggestion qui peut être modifiée au fil de la saisie ; 2fmMatchEntryNone :pas de saisie semi-automatique. Cette propriété peut être ajoutée via le code en ajoutant cette ligne dans linitialisation 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 dappeler le formulaire de saisie. Celle-ci débute parSubet se termine parEnd Sub. Dans cet exemple, javais appelé cette macro Lancer_formulaire. Cest ce nom que vous retrouverez dans longletDéveloppeur>Macros. Il est également possible de créer un bouton sur votre fichier Excel pour lancer ce formulaire si
Article écrit par Lydia Provin du site Votre Assistante :https://www.votreassistante.net
7
Votre Assistante :https://www.votreassistante.net- le 16/06/2015
vous ne souhaitez pas passer par un raccourci. Pour cela, créez une forme soit en passant par
longletDéveloppeur>Insérer >Boutonce qui ouvre la boîte de dialogue des macros directement, mais noffre pas la possibilité de personnaliser le bouton en termes de forme ou de
couleur, soit en passant par longletInsertion >Formes (le bouton pourra être modifié avec longletFormat) 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.Showaffiche le formulaireUserForm1. Étant donné que je navais pas changé le nom du formulaire, cest donc le nom de base, les formulaires suivants seraientUserForm2, UserForm3…sauf si vous les renommez.vbModelesspermet douvrir le formulaire en non modal, cest-à-dire que vous pourrez cliquer en dehors du formulaire, contrairement àvbModalun clic en dehors du formulaire est où impossible tant que celui-ci est ouvert.vbModal nest pas utile à écrire puisque cest le fonctionnement pas défaut. Enfin, vous pouvez parfois avoir une erreur dexé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 linitialisation du formulaire dans le code de lUserform. Utilité du mode débogage Lemode débogagepermet de vérifier que votre code est bien écrit (absence de fautes de frappe, toutes les variablessont 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 quil 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 surDébogage >Compiler suivi généralement deVBAProjectqui 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
Article écrit par Lydia Provin du site Votre Assistante :https://www.votreassistante.net
8
Votre Assistante :https://www.votreassistante.net- le 16/06/2015
Projet>Propriétés de VBAProject. Dans le champNom du projet, vous pouvez modifier le nom par défaut. Une fois le mode lancé, sil ne se passe rien, cest que votre code est correct. Dans le cas contraire, une fenêtre souvre avec lerreur. Si par exemple, je supprime la ligne de déclaration deJdans linitialisation du formulaire (DimJAsLong) et que je lance le mode débug, jai bien lerreur de variable non définie. Pour terminer, nhésitez pas à voir ou revoir le tutorielComment vider (effacer) un userform après validation sur Excel ?utilisant le même formulaire de saisie. Tutoriel réalisé avec Excel 2013 Voir la version vidéo de cet article
Article écrit par Lydia Provin du site Votre Assistante :https://www.votreassistante.net
9
  • Univers Univers
  • Ebooks Ebooks
  • Livres audio Livres audio
  • Presse Presse
  • Podcasts Podcasts
  • BD BD
  • Documents Documents