Professional Documents
Culture Documents
Document inspir du cours de Juliette Dibie-Barthelemy (Janvier 2008) * Visual Basic pour Applications
Introduction
Le VBA (Visual Basic pour Application) est un langage de programmation permettant dutiliser du code dont la syntaxe est proche du langage Visual Basic pour excuter les nombreuses fonctionnalits notamment des applications Microsoft Office et par exemple de lApplication EXCEL que vous tes amens utiliser frquemment dans votre spcialit.
Crer des programmes en VBA permet notamment dautomatiser des tches rptitives ralises sous EXCEL grce la possibilit de manipuler les objets propres Excel (Classeurs, feuilles, cellules, ), de stocker de linformation, deffectuer des instructions sous conditions et, ventuellement, plusieurs reprises en fonction dun ou plusieurs critres. Le langage VBA permet galement de contrler la quasi-totalit de l'IHM1 notamment dExcel, ce qui inclut la possibilit de manipuler les fonctionnalits de l'interface utilisateur comme les menus, les barres d'outils et le fait de pouvoir personnaliser les botes de dialogue et les formulaires utilisateurs. Cela permet notamment de rendre une application dveloppe sous EXCEL plus conviviale. Il permet enfin de contrler une application partir d'une autre (par exemple, crer automatiquement un document WORD partir de donnes sous EXCEL).
Ce document organis en sections constitue une synthse des possibilits offertes par la programmation en VBA sous Excel.
Interface Homme-Machine : c'est--dire tous les mdias qui permettent un utilisateur dinteragir avec la machine
Page 1
1.2
1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7
Accs aux fonctionnalits dExcel depuis VBA ...................................................................... 14 2.1 2.2 2.3 2.4 2.5
2.5.1
Les objets ................................................................................................................... 14 Les collections ............................................................................................................ 14 Laccs aux objets ....................................................................................................... 14 Les proprits des objets ............................................................................................ 15 Les mthodes des objets............................................................................................. 16
Utiliser les fonctions intgres dExcel .......................................................................................... 16
2.6 2.7
2.7.1 2.7.2
2.8 3
Page 2
3.1 3.2
3.2.1 3.2.2 3.2.3
Stocker de linformation : les variables et les constantes ............................................. 20 Dfinir ses propres fonctions ...................................................................................... 23
Dfinition ....................................................................................................................................... 23 Utilisation sous Excel ..................................................................................................................... 24 Utilisation dans un programme VBA ............................................................................................. 25
Prendre en compte des conditions .............................................................................. 25 Rpter les mmes actions ......................................................................................... 26 Rgles de bonne conduite en programmation ............................................................. 28 .................................................................................................. 30 ............................................................................. 32
........................................................................................... 37
Page 3
Page 4
1) Paramtrage de la macro
Activer la commande Outils Macro Nouvelle macro.
La fentre prsente en
Figure 1 apparat lcran et vous permet de paramtrer la macro qui va tre cre c'est--dire : de prciser son nom dans le champ : Nom de la macro, de prciser quel classeur elle sera rattache par lintermdiaire du menu droulant Enregistrer la macro dans, dy associer si besoin un raccourci clavier afin de faciliter son lancement futur : Touche de raccourci
Excel VBA DA GIA AgroParisTech Christine MARTIN Page 5
Le menu droulant Enregistrer la macro dans vous propose trois options : Ce classeur, Nouveau classeur, Classeur de macros personnelles.
En slectionnant, l'option Classeur de macros personnelles, la macro est enregistre dans un classeur spcial appel PERSO.XLS. Ce classeur est ouvert automatiquement lors du lancement dEXCEL et ses macros sont disponibles dans tous les classeurs ouverts. La commande FENETRE AFFICHER permet dafficher ce classeur et la commande FENETRE MASQUER de le masquer. Loption Nouveau classeur permet denregistrer la macro dans un nouveau classeur. Enfin, loption Ce classeur permet denregistrer la macro dans le classeur actif.
2) Lancement de lenregistrement
Une fois votre macro paramtre suivant vos besoins, Cliquer sur le bouton OK. Lenregistrement est alors lanc et partir de l tout les actions que vous fates dans Excel sont enregistres, traduites en code VBA puis sauvegardes dans une procdure portant le nom que vous avez spcifi ltape prcdente. Par exemple Macro1 comme indiqu dans la Figure 1. La barre d'outils ARRET DE L'ENREGISTREMENT apparat, ce qui marque le dbut de l'enregistrement.
Cette fentre permet galement de dterminer le mode suivant lequel les cellules seront considres dans le programme final. Il existe en effet deux moyens de voir les choses : Soit on a une vision absolue : par exemple on considre la cellule A1 qui a une position dtermine dans une page de calcul Excel Soit on a une vision relative : on veut par exemple quune action soit faite toujours 2 cellules en dessous de celle slectionne ce moment l.
Le bouton de droite de la fentre darrt de lenregistrement (Figure 2) permet de faire un choix entre ces deux modes. Ce choix dpend bien entendu des proprits attendues de la macro que lon est en train denregistrer.
Page 6
Attention : Vrifier toujours le mode dans lequel vous vous trouvez au lancement de lenregistrement et avant deffectuer la moindre action sans quoi votre macro pourrait avoir un comportement diffrent de celui que vous attendiez car non enregistre dans le mode adquate. Par ailleurs, les cellules dans une macro sont identifies laide dune lettre (colonne) suivie dun chiffre (ligne), comme par exemple la cellule A1. Aussi et afin de faciliter la lecture du code VBA gnr, il est prfrable de choisir la mme identification des cellules dans le classeur dans lequel est enregistr la macro. Si tel nest pas le cas, activer la commande OUTILS OPTIONS, cliquer sur l'onglet GENERAL et dcocher la case STYLE DE REFERENCE L1C1.
3) Arrt de l'enregistrement
Une fois que vous avez ralis toutes les actions que vous souhaitiez enregistrer pour les rejouer ultrieurement, larrt de lenregistrement se fait en cliquant sur le carr bleu de la barre d'outils ARRET DE L'ENREGISTREMENT (Figure 2). Attention : noubliez pas darrter lenregistrement dune macro ! Dans le cas contraire vos actions continueraient tre enregistres et vous ne seriez pas en mesure de relancer cette macro. Lenregistreur de macro permet de manire rapide et simple de crer des macros. Cependant une macro ainsi cre ne sexcutera que sur un ensemble de cellules donnes et possdera des fonctionnalits limites. Pour pouvoir crer des macros propres ses besoins, efficaces et interactives, la connaissance du langage VBA est ncessaire et il sera prsent dans les sections suivantes. 1.1.2 Excuter une macro Pour excuter une macro dj enregistre, donc connue du systme, il faut : 1) Activer la commande OUTILS MACRO/MACROS. La fentre prsente en Figure 3 souvre.
2) Slectionner dans la liste la macro dsire et cliquer sur le bouton EXECUTER. Dans lexemple prsent en Figure 3, seule la macro nomme Macro1 est disponible.
Excel VBA DA GIA AgroParisTech Christine MARTIN Page 7
Le menu droulant Macros dans vous permet de faire un tri dans les macros disponibles et de nafficher par exemple que celles enregistres dans votre classeur personnel. 1.1.3 Supprimer une macro Si vous devez supprimer une macro dj cre, suivez les instructions suivantes : 1) Activer la commande Outils Macro macros. La fentre prsente en Figure 3 souvre. 2) Slectionner dans la liste la macro dsire et cliquer sur le bouton SUPPRIMER.
Lenvironnement souvre : Soit, en activant la commande : Outils / Macro / Visual Basic Editor Soit, en activant la commande AFFICHAGE BARRE D'OUTILS VISUAL BASIC et en cliquant sur l'objet VISUAL BASIC EDITOR (cf. Figure 4).
Figure 4 : Barre d'Outils Visual Basic (licne entoure permet de lancer VBE)
Dans les deux cas de figure, la fentre prsente en Figure 5 souvre et vous donne accs de nouvelles fonctionnalits.
Page 8
Cette fentre se dcompose notamment en trois parties : affichage, criture et modification des fichiers de programmes disponibles ou modules de codes affichage des proprits du module de code slectionn explorateur de lensemble des modules de codes
Les particularits de ces zones sont dtailles dans les sections suivantes. 1.2.2 Fentre de lecture, criture et modification dun programme Toutes les instructions VBA sont enregistres dans un module de code qui est affich dans la fentre principale de VBE droite (cf. Figure 5 et Figure 6).
Page 9
Cette fentre se comporte comme un diteur de texte classique avec quelques fonctionnalits supplmentaires telles que la coloration du texte en fonction de la nature de ce qui est crit : Les mots cls du langage sont affichs en bleu o par exemple : Sub (mot cl de dbut de procdure), True (constante boolenne), Les commentaires (texte non interprt, utile pour comprendre ce que fait le programme) sont affichs en vert o Par exemple : Macro enregistre le .
Un programme est une suite dinstructions. Une instruction excute une tche prcise. Elle est gnralement crite sur une seule ligne. Exemple : Range("A1").Select Cette instruction permet de slectionner la cellule nomme A1 dans le classeur courant. Lenregistreur de macro ne gnre que des procdures sans arguments. Une procdure commence par le mot cl Sub suivi du nom de la procdure et dune liste darguments entre parenthses, qui peut tre vide. Elle se termine par le mot cl End Sub. Une procdure a la syntaxe suivante :
Sub NomProcdure([argument_1,..., argument_n]) Instructions ... End Sub
Par exemple, dans la Figure 6, la fentre daffichage de modules de codes affiche le module nomm Module1 (cf. bandeau de la fentre). Ce module contient une seule macro nomme Macro1 (terme suivant le mot cl Sub). Dans cette macro, il y a 5 lignes de commentaires (commenant par un ) puis 6 instructions. L'instruction Range("A1").Select slectionne (Select) une cellule (Range) dsigne par sa ligne (1) et sa colonne (A). L'instruction ActiveCell.FormulaR1C1 affecte une formule la cellule active (ActiveCell). L'instruction Selection.Font permet dappliquer un format de police (Font.Bold ou Font.Italic) la cellule slectionne (Selection). Lorsque cette macro est lance on observe donc dans Excel le rsultat suivant :
Page 10
Les macros produites par lintermdiaire de lenregistreur de macro sont galement stockes dans des modules de codes. Un module de code peut contenir plusieurs macros ou fonctions.
Remarque : Seules les procdures sans arguments sont excutables directement par les menus ou icnes. Toute procdure ayant des arguments devra donc tre appele dans une autre procdure pour pouvoir tre excute. Dans lexemple prcdent et en labsence dautres procdures, la procdure PrintValue ne pourra tre excute que par lintermdiaire de la procdure TestPrintValue.
1.2.3 Affichage et modification des proprits dun module de code La fentre en bas gauche de lenvironnement VBE, permet dafficher et de modifier les proprits du module slectionn.
Page 11
Dans la Figure 8, on peut constater quun module est uniquement caractris par un nom que lon peut modifier par simple saisie dans cas se situant droite du mot cl (Name). 1.2.4 Sauvegarde Pour que les programmes produits soient conservs, il faut les sauvegarder laide de la commande : FICHIER/ENREGISTRER ou le raccourci clavier CTRL+S. 1.2.5 Retrouver un programme enregistr : lexplorateur de projets A chaque classeur EXCEL ouvert est associ un projet VBA. L'explorateur de projets (partie en haut gauche de la fentre VBE (cf. Figure 5) affiche une liste hirarchise des diffrents projets VBA associs aux classeurs EXCEL ouverts (cf. Figure 9). Un projet VBA associ un classeur regroupe les lments du classeur, comme ses feuilles de calcul, les procdures et les fonctions associes ce classeur et stockes dans un ou plusieurs modules de code.
Par exemple, le projet VBA associ au classeur TEST-MACRO.XLS visible en Figure 9 est compos de deux dossiers : le dossier MICROSOFT EXCEL OBJETS qui contient les lments attachs au projet : le classeur TESTMACRO.XLS (THISWORKBOOK) et ses feuilles de calcul FEUIL1, FEUIL2 et FEUIL3 ; le dossier MODULES qui contient les modules de code du projet : le module MODULE1 qui contient la macro MACRO1.
Page 12
Lexplorateur de projets permet, laide du clic droit de la souris, douvrir un module de code (option CODE), dinsrer un nouveau module de code (option INSERTION) ou den supprimer un (option SUPPRIMER <NOMMODULE>).
Figure 10 : Fentre ouverte par clic droit sur l'explorateur de projets dans VBE
Louverture dun module de code peut galement se faire par double-click sur celui-ci dans lexplorateur de projets. La commande INSERTION MODULE permet galement dinsrer un nouveau module de code. On peut insrer autant de modules de code quon le dsire en fonction des besoins recenss. Dans la pratique, on cherche regrouper dans un mme module tous les lments de programmes qui se rapportent un ensemble de fonctionnalits donn. Par exemple, si lon cre des fonctions de calcul mathmatiques, on les regroupera dans un mme module que lon pourrait nommer Maths. 1.2.6 Excuter directement dans VBE une procdure sans argument Attention : Seules les procdures sans argument peuvent tre excutes directement ! Les procdures avec arguments et les fonctions ne peuvent tre excutes que par dautres procdures ou fonctions et n'apparaissent pas dans la liste des macros de la bote de dialogue MACRO (commande OUTILS MACRO MACROS de EXCEL). Pour excuter une procdure sans argument, positionner le curseur dessus et activer la commande EXECUTION EXECUTER SUB/USERFORM ou cliquer sur licne Pour arrter l'excution dune procdure sans argument si une erreur survient, utiliser la commande EXECUTION REINITIALISER ou cliquer sur licne
Page 13
1.2.7 Fermeture de lenvironnement VBE La commande Fichier/Fermer et retourner Microsoft Excel permet de fermer VBE et de retourner dans Excel.
Page 14
Exemple : Range("A1:B4") permet de faire rfrence la plage de cellules A1:B4 et renvoie un objet Range. Pour faire rfrence un objet dans une collection, on peut soit utiliser le numro de sa position dans la collection, soit son nom. Exemple : Worksheets(1) permet de faire rfrence la premire feuille de calcul du classeur actif et renvoie un objet Worksheet. Workbooks("Classeur1.xls").Worksheets("Feuil1") permet de faire rfrence la feuille de calcul de nom Feuil1 du classeur de nom Classeur1.xls et renvoie un objet Worksheet. Workbooks("Anne2006").Sheets("Mars").Range("B2") dsigne la cellule B2 de la feuille Mars du classeur Anne2006 Sheets("Mars").Range("B2") du classeur actif (ouvert et affiche) Range("B2") de la feuille active
Remarque : La notation Workbooks("Classeur1.xls").Worksheets("Feuil1") est une notation raccourcie pour Application.Workbooks("Classeur1.xls"). Worksheets("Feuil1"). Lobjet Application peut, en effet, en gnral tre omis. Les rfrences aux cellules peuvent tre :
absolues : Range("B2") dsigne la cellule B2 de la feuille active relatives la cellule d'origine : ActiveCell.Offset (2,-1) dsigne la cellule situe 2 lignes plus bas (- pour plus haut) et une colonne gauche (+ pour droite) de la cellule active.
2.4
Chaque objet est dfini par un ensemble de proprits, qui reprsentent les caractristiques de lobjet. Pour faire rfrence une proprit dun objet donn, il faut utiliser la syntaxe Objet.Proprit. Exemple : La proprit Value de lobjet Range dsigne la valeur de lobjet spcifi. Range("A1").Value = "AgroParisTech" affecte la valeur AgroParisTech la cellule A1. La proprit ActiveCell de lobjet Application renvoie un objet Range, qui fait rfrence la cellule active de la feuille de calcul. ActiveCell.Font.Bold = True permet daffecter le style gras la cellule slectionne (Font est une proprit de lobjet Range qui retourne un objet Font contenant les attributs de police (taille, couleur, style, ...) de lobjet Range. Bold est une proprit boolenne de lobjet Font qui correspond au style gras).
Page 15
La proprit Selection de lobjet Application renvoie lobjet slectionn dans la fentre active. Le type de l'objet renvoy dpend de la slection en cours.
Remarque : La proprit ActiveCell ne permet de faire rfrence qu une seule cellule, alors que la proprit Selection permet de faire rfrence une plage de cellules.
Attention : Toutes les fonctions intgres dEXCEL ne sont pas disponibles dans VBA ! Nanmoins, il est fortement conseill dutiliser une fonction intgre dEXCEL pour faire un calcul donn, si cette dernire existe, plutt que de dfinir sa propre fonction, qui serait moins efficace en terme de temps de calcul.
Page 16
2.7.2
Page 17
rechercher que dans les fonctionnalits spcifiques Excel et non dans celles communes toutes les applications VBA par exemple.
La zone DETAILS situe en dessous de la zone CLASSES affiche un bref descriptif de llment slectionn dans la zone CLASSES ou dans la zone MEMBRES. Pour obtenir de laide sur un objet ou un membre, slectionner cet objet dans la zone CLASSES ou ce membre dans la zone MEMBRES et cliquer sur la touche F1. Pour connatre, par exemple les fonctions intgres dEXCEL lies lobjet Feuille de calcul et disponibles dans VBA (cf. section 2.5.1), activer la commande AFFICHAGE EXPLORATEUR D'OBJETS dans lditeur de Visual Basic et rechercher parmi les membres de lobjet WorkSheetFunction.
Page 18
La Figure 12 prsente une vue des rsultats propos par lexplorateur dobjets pour cette recherche.
2)
Utiliser lexplorateur dobjets pour dcouvrir les objets disponibles dans VBA et les proprits, mthodes et vnements qui leur sont associs. Utiliser la touche F1 pour obtenir de laide sur un objet, une proprit, une mthode ou un vnement, dans un module de code ou dans lexplorateur dobjets.
3)
Page 19
Cette section a pour but de prsenter ou rappeler suivant les cas les lments du langage VBA qui sont communs toutes les applications MICROSOFT OFFICE voire dans certains cas tout langage de programmation.
o NomVariable est une suite de caractres forms avec des lettres, des chiffres et le caractre soulign _. Le premier caractre est obligatoirement une lettre. Les minuscules sont distingues des majuscules. En VBA la dclaration des variables nest, par dfaut, pas obligatoire. Nanmoins, il est prfrable de forcer la dclaration explicite des variables notamment pour faciliter le contrle du comportement du programme et traquer les erreurs de frappe trs frquentes en programmation. Exemple :
Sub MacroTestVariable() valeur = Range("A1").Value Range("B1").Value = valleur End Sub
En effet, dans lexemple prcdent, quelle que soit la valeur de la cellule A1, cette macro ncrira rien dans la cellule B1. Pourtant VBA ne dtecte aucune erreur dans le code. Il considre quil y a deux variables distinctes valeur et valleur. Il est donc prfrable de forcer la dclaration explicite des variables en VBA. Pour ce faire, il suffit de placer linstruction Option Explicit en haut (en premire ligne) des modules de code avant toutes procdures et toutes fonctions. Si maintenant on reprend lexemple prcdent en forant la dclaration des variables :
Option Explicit Sub MacroTestVariable() valeur = Range("A1").Value Range("B1").Value = valleur End Sub Excel VBA DA GIA AgroParisTech Christine MARTIN Page 20
Maintenant, VBA dtecte une erreur la compilation car la variable valleur nest pas dfinie (cf. Figure 13).
Pour ajouter automatiquement linstruction Option Explicit tous les nouveaux modules de code crs, activer la commande OUTILS OPTIONS..., cliquer sur longlet EDITEUR et cocher la case DECLARATION DES VARIABLES OBLIGATOIRE.
Exemple :
Dim Nom As String Excel VBA DA GIA AgroParisTech Christine MARTIN Page 21
Dim MaPlage As Object variable de type Object Set MaPlage = Range("A1:B5") Set : pour affecter un objet
Remarque sur linitialisation des variables : Selon leur type, les variables ne sont pas initialises avec la mme valeur : les variables de type Byte, Integer ou Long sont initialises 0 ; les variables de type Single, Double ou Currency sont initialises 0 ; les variables de type Boolean sont initialises False ; les variables de type String sont initialises "" (la chane vide) ; les variables de type Date sont initialises 00:00:00 ; les variables de type Variant sont initialises "" (la chane vide) (il en est de mme pour les variables dclares implicitement).
La variable Age nest accessible que dans la procdure InitialiseAge. Pour quune variable soit accessible lensemble des procdures et des fonctions dun module, elle doit tre dclare au dbut du module lextrieur de toute procdure et de toute fonction. Pour quune variable soit accessible lensemble des procdures et des fonctions dun projet, elle doit tre dclare au dbut dun module lextrieur de toute procdure et de toute fonction, laide du mot cl Public. Exemple :
Public Age As Integer Sub ModifieAge() Age = 27 End Sub
Une constante permet dattribuer un nom une valeur fixe. La dclaration dune constante se fait laide du mot cl Const comme suit :
Const NomConstante [As Type] = valeur
Tout ce qui commence par un point dans un bloc dinstructions With...End With est une proprit ou une mthode de lobjet qui suit linstruction With.
Remarque : Les crochets [ ] signifient que les arguments sont facultatifs. Attention : Dans VBA, les arguments dune fonction sont spars par des virgules, alors que dans EXCEL ils sont spars par des points-virgules. Une fonction indique la valeur retourner en initialisant son nom avec la valeur de retour (cf. commentaire dans le cadre prcdent). Par exemple, une fonction fournissant la surface dun cercle tant donn son rayon pourrait scrire comme suit :
Function SurfaceCercle(Rayon As Double) As Double SurfaceCercle = WorksheetFunction.Pi() * Rayon * Rayon End Function
Remarque : On peut typer les arguments dune procdure ou dune fonction et la valeur de retour dune fonction.
Ici, SurfaceCercle est une fonction ayant un argument : le rayon du cercle Rayon, qui est une variable de type rel. Elle renvoie la surface du cercle de rayon Rayon, qui est de type rel. Pi est une fonction intgre dEXCEL. Attention : Dans VBA les rels sont crits avec des points, alors quils sont crits avec des virgules dans EXCEL. 3.2.2 Utilisation sous Excel Lutilisation dune fonction dfinie par lutilisateur se fait dans Excel comme toute fonction intgre. Par exemple, pour la feuille de calcul suivante :
Si lon note dans la cellule B6, la formule =SurfaceCercle(A6), et que lon procde de manire analogue pour les cellules suivantes, on obtient le rsultat suivant :
Lorsquon crit =SurfaceCercle(A6) dans la cellule B6 la valeur de la cellule A6 est transmise la fonction SurfaceCercle par le biais de largument Rayon. La fonction SurfaceCercle initialise
Page 24
alors son propre nom avec le rsultat calcul (WorksheetFunction.Pi() * Rayon * Rayon). Le rsultat est ensuite retourn la cellule B6. La fonction SurfaceCercle peut tre utilise comme nimporte quelle fonction intgre dEXCEL (commande INSERTION FONCTION... puis CATEGORIE DE FONCTIONS : PERSONNALISEES). Par contre, elle n'apparat pas dans la liste des macros dEXCEL (commande OUTILS MACRO MACROS). 3.2.3 Utilisation dans un programme VBA Contrairement une procdure, une fonction retourne une valeur qui lorsquon utilise cette fonction dans une autre fonction ou une autre procdure doit tre sauvegarde dans une variable. Par exemple, la fonction SurfaceCercle telle que dfinie en section 3.2.1 peut tre utilise dans la procdure MacroTestFonction dont le code est fourni ci-dessous.
Sub MacroTestFonction() Dim valeur As Double valeur = SurfaceCercle(1.5) Range("B1").Value = valeur End Sub
Ici la variable valeur reoit le rsultat de la function SurfaceCercle pour un rayon donn gal 1.5.
Dans une structure de bloc If, il faut imprativement aller la ligne aprs le Then. Remarque : Les crochets [ ] signifient que le bloc Else est facultatif. Lorsque le bloc If contient une ou plusieurs sections ElseIf, les diffrentes conditions sont testes jusqu ce quune soit value vraie. Si aucune condition nest vrifie, les instructions de la section Else, si elle existe, sont excutes. Si aucune condition nest vrifie et si la section Else nexiste pas, le bloc If ne fait rien. VBA offre la possibilit dutiliser les oprateurs logiques suivants : Or, Xor (ou exclusif), And, Not. Exemple :
Excel VBA DA GIA AgroParisTech Christine MARTIN Page 25
Sub BonjourHeureIf() Dim heure As Integer Dim mes As String heure = Left(Time, 2) 'rcupration de l'heure (2 caractres gauche de la valeur de retour de la fonction Time If heure > 7 And heure < 12 Then mes = "Bonjour" ElseIf heure >= 12 And heure < 18 Then mes = "Bon aprs-midi" ElseIf heure >= 18 And heure < 22 Then mes = "Bonne soire" Else mes = "Bonne nuit" End If Range("A1").Value = mes End Sub
La boucle Do...Loop
La boucle Do...Loop est utilise lorsque lon veut que la rptition des instructions sarrte quand une condition donne est vrifie. On distingue plusieurs syntaxes possibles.
Do While condition Instructions Loop Tant que la condition est vraie, les instructions sont excutes
Avec ces deux boucles, les instructions peuvent ne jamais tre excutes. Pour quelles soient excutes au moins une fois, on peut utiliser lune des deux syntaxes suivantes :
Do Instructions Loop While condition les instructions sont excutes tant que la condition reste vraie
Page 26
La boucle For...Next
La boucle For...Next est utilise lorsque lon connait lavance le nombre de fois o lon veut que les instructions soient rptes.
For compteur = nbdbut To nbfin [Step nbpas] Instructions instructions excutes un nombre dtermin de fois Next compteur
Les instructions de la boucle For...Next sont excutes un nombre dtermin de fois. Lorsque loption Step nest pas renseigne, le compteur est incrment de 1 chaque itration et les instructions sont excutes nbdbut - nbfin fois. Exemple : La procdure suivante calcule la somme des n premiers entiers :
Sub SommeEntiers() Dim somme As Integer Dim compteur As Integer Dim n As Integer n = Range("A1").Value For compteur = 1 To n somme = somme + compteur Next compteur Range("A2").Value = "Somme des " & n & " premiers entiers : " Range("B2").Value = somme End Sub
La boucle For EachNext La boucle For EachNext permet daccder aux objets dune collection. Exemple :
Sub ColorieCellule() Dim MaPlage As Range Dim Cellule As Range Dim i As Integer Set MaPlage = Range(A1:B5) For Each Cellule In MaPlage Cellule.Interior.ColorIndex = i i = i + 1 Next Cellule End Sub Excel VBA DA GIA AgroParisTech Christine MARTIN Page 27
Interrompre une boucle Linstruction Exit permet de quitter un bloc DoLoop, ForNext, Function, ou Sub. Sa syntaxe est la suivante : Exit + mot_cl_dbut_de_bloc Exemples : Exit Do, Exit For, Exit Function, Exit Sub, La boucle suivante sarrte lorsque la rponse rep est n ou N :
Do Rep = InputBox( Voulez-vous continuer ? (O/N) ) If Lcase(rep) = n Then Exit Do Loop
La fonction InputBox permet de crer une bote de dialogue. Pour plus dinformations ce sujet reportez-vous au Tutoriel : Les entres et sorties standards page 32.
Page 28
Excel-VBA et lIHM
Sont prsentes dans ce qui suit sous forme de tutoriels des fonctionnalits de VBA spcifiques linterfaage entre lutilisateur et Excel.
Tutoriel : Les vnements Tutoriel : Les entres et sorties standards Tutoriel : Les Objets UserForm
30 32 37
Page 29
Pour cela, nous allons : 1) Ouvrir le classeur TEST-MACRO.XLS, puis lditeur de Visual Basic (activer la commande AFFICHAGE BARRE D'OUTILS VISUAL BASIC et cliquer sur l'objet VISUAL BASIC EDITOR). 2) Dans lexplorateur de projets, slectionner la feuille de calcul FEUIL1 et ouvrir son module de code laide du clic droit de la souris et de loption CODE. 3) Dans la liste de gauche au sommet du module de code, slectionner loption WORKSHEET. Dans la liste de droite au sommet du module de code, slectionner lvnement SELECTIONCHANGE.
Page 30
On voit alors apparatre dans le module de code len-tte de procdure suivant : Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On veut prsent crire les instructions VBA permettant de colorier le fond dune cellule ou dune plage de cellules en bleue. Pour trouver ces instructions, il existe deux possibilits : utiliser lenregistreur de macro, ou explorer les proprits de lobjet Range pour trouver comment modifier sa couleur de fond.
Le moyen le plus facile pour dcouvrir les instructions ncessaires pour accomplir une opration donne consiste utiliser lenregistreur de macro.
4) Aller dans EXCEL et enregistrer une nouvelle macro MacroCouleurFond qui permet de modifier la couleur de fond dune cellule. 5) Retourner dans lditeur de Visual Basic et tudier le code de la macro MacroCouleurFond. Linstruction Selection.Interior.ColorIndex = 41 semble intressante puisquelle parle de couleur. Pour obtenir de laide sur cette instruction, slectionner dans le code la proprit ColorIndex et appuyer sur la touche F1. Laide en ligne de lditeur de Visual Basic permet dobtenir les informations suivantes : La proprit Interior dun objet Range renvoie un objet Interior qui correspond la couleur de fond dune plage de cellules. La proprit ColorIndex dun objet Interior permet de dterminer la couleur de fond.
Pour obtenir de laide sur un objet, une proprit ou une mthode donne, slectionner dans le code cet objet, cette proprit ou cette mthode et appuyer sur la touche F1. 6) Retourner dans le module de code associ la feuille de calcul FEUIL1 et complter la procdure Worksheet_SelectionChange comme suit : Private Sub Worksheet_SelectionChange(ByVal Target As Range) Target.Interior.ColorIndex = 41 End Sub La variable Target qui est un objet Range reprsente la plage de cellules ou cellule slectionne par lutilisateur dans la feuille de calcul FEUIL1. 7) Enregistrer la procdure et retourner dans EXCEL pour la tester (slectionner une plage de cellules ou cellule et vrifier que sa couleur de fond devient bleue).
Page 31
1 La fonction MsgBox
La fonction MsgBox affiche un message dans une bote de dialogue, attend que l'utilisateur clique sur un bouton, puis renvoie un entier indiquant le bouton choisi par l'utilisateur. Elle a la syntaxe suivante (les arguments entre crochets sont facultatifs) : MsgBox(prompt[,buttons][,title][,helpfile, context]) o prompt est le message affich dans la bote de dialogue, buttons correspond au type de boutons de la bote de dialogue et title est le titre de la bote de dialogue (cf. aide en ligne de lditeur de Visual Basic laide de la touche F1.). 1) Ouvrir le classeur TEST-MACRO.XLS, puis lditeur de Visual Basic.
2) Insrer un nouveau module de code laide de la commande INSERTION MODULE et saisir la macro suivante :
Sub MacroTestMessage() Call MsgBox("Bonjour ! ", , "Accueil") End Sub
3) Excuter la macro laide de la commande EXECUTION EXECUTER SUB/USERFORM ou cliquer sur licne
Les valeurs des arguments de la fonction MsgBox peuvent tre spcifies de deux manires : par position ou par nom. Exemple :
Page 32
Dans linstruction Call MsgBox("Bonjour ! ", , "Accueil"), les valeurs des arguments sont spcifies par position : les arguments doivent alors tre saisis dans le bon ordre et des virgules supplmentaires doivent tre inclues pour les arguments manquants. Cette instruction peut tre rcrite par nom en spcifiant les valeurs des arguments par nom comme suit : Call MsgBox(prompt:="Bonjour ! ", Title:="Accueil"). Dans ce cas, comme dans lexemple prcdent, il faut utiliser le signe := entre le nom de largument et sa valeur. Lordre entre les arguments na alors plus dimportance et il ny a pas besoin de virgules supplmentaires pour les arguments manquants.
4) Saisir la macro suivante et lexcuter. Sub MacroTestMessage2() Call MsgBox(prompt:="Avez-vous pass une bonne journe? ", Buttons:=4, Title:="Accueil !") End Sub
Largument Buttons:=4 permet dafficher les boutons Oui et Non. Au lieu dutiliser la valeur numrique 4 pour largument Buttons, on aurait pu utiliser la constante associe vbYesNo (cf. aide en ligne de lditeur de Visual Basic), qui rend le code plus lisible. Call MsgBox(prompt:="Avez-vous pass une bonne journe? ", Buttons:=vbYesNo, Title:="Accueil !") Lutilisation de constantes VBA intgres rend le code plus lisible. Dans lexemple prcdent, une question est pose lutilisateur, mais sa rponse nest pas rcupre : on ne sait pas sil a pass une bonne journe. Il se pose alors le problme de rcuprer la valeur de retour de la fonction MsgBox. Pour ce faire, il ne faut pas utiliser linstruction Call pour appeler MsgBox mais la syntaxe suivante : reponse = MsgBox(prompt:="Avez-vous pass une bonne journe?") o reponse est une variable dans laquelle on va stocker temporairement le rsultat. On peut tester la valeur de retour de la fonction MsgBox (cf. aide en ligne de lditeur de Visual Basic), comme suit :
Sub MacroTestMessage3() Dim reponse As String reponse = MsgBox(prompt:="Avez-vous pass une bonne journe? ", Buttons:=vbYesNo, Title:="Accueil !") If reponse = vbYes Then Call MsgBox("Bonjour ! ", , "Accueil") Else
Page 33
2 La fonction InputBox
La fonction InputBox affiche une invite dans une bote de dialogue, attend que l'utilisateur tape du texte ou clique sur un bouton, puis renvoie le contenu de la zone de texte sous la forme d'une chane de caractre. Elle a la syntaxe suivante (les arguments entre crochets sont facultatifs) :
InputBox(prompt[,title][,default][,xpos][,ypos] [,helpfile,context])
o prompt est le message affich dans la bote de dialogue et title est le titre de la bote de dialogue (cf. aide en ligne de lditeur de Visual Basic). Si lutilisateur ne saisit rien dans la zone de texte, la fonction InputBox renvoie la chane de caractres vide "".
Loprateur & permet de concatner des chanes de caractres. Par exemple, si la rponse donne par lutilisateur est 22, alors on a : "Vous avez " & reponse & " ans" = "Vous avez 22 ans"
Page 34
Attention : Il ne faut pas mettre despace entre le nom dune fonction ou dune procdure et la liste de ses arguments placs entre parenthses. Il existe un autre moyen pour appeler une procdure ou une fonction dont on ne veut pas rcuprer la valeur de retour : ne pas utiliser linstruction Call et ne pas placer ses arguments entre parenthses. Exemple : MsgBox "Bonjour ! ", , "Accueil" Lors de lappel dune procdure ou dune fonction, les valeurs de ses arguments peuvent tre spcifies par position ou par nom. Exemple : arguments spcifis par position Call MsgBox("Bonjour ! ", , "Accueil")
arguments spcifis par nom Call MsgBox(prompt :="Bonjour ! ", Title :="Accueil")
Page 35
1) Ouvrir un nouveau classeur et lenregistrer sous SAISIECLIENTS.XLS. 2) Pour renommer la feuille de calcul FEUIL1, cliquer avec le bouton droit sur l'onglet FEUIL1, activer la commande RENOMMER et taper CLIENTS.
4) Renommer DIVERS la feuille de calcul FEUIL2 et saisir les donnes suivantes : On peut distinguer deux phases dans la cration dun objet UserForm : le dessin de lobjet UserForm Le dessin dun objet UserForm consiste placer des contrles sur lobjet. Les contrles sont les lments constitutifs dun objet UserForm tels quune case cocher, une zone de texte, une zone de liste modifiable ou un bouton de commande permettant une intervention de lutilisateur. Un contrle est un objet : il possde des proprits, des mthodes et des vnements dfinis. lassociation de code lobjet UserForm et ses diffrents contrles
Page 36
Il sagit de dterminer le comportement de lobjet UserForm et de ses contrles face aux diffrents vnements utilisateur pouvant laffecter et dcrire le code permettant dexploiter les actions effectues par lutilisateur.
objet USERFORM1 qui est un objet de type FEUILLE et qui permet de dessiner une bote de dialogue
bote outils qui apparat lorsque la fentre objet associe lobjet USERFORM1 est slectionne
Lexplorateur de projets permet dafficher le code dun objet USERFORM laide du clic droit de la souris et de loption CODE ; ou dafficher lobjet lui-mme laide du clic droit de la souris et de loption AFFICHER LOBJET. 2) Modifier le nom de lobjet UserForm par dfaut, UserForm1, en FenetreSaisieClients dans la proprit NAME de la fentre PROPRIETES. Ce nom est le nom qui sera utilis dans le code pour faire rfrence lobjet UserForm.
Page 37
3) La proprit CAPTION de lobjet UserForm correspond au libell qui apparat dans sa barre de titre. Modifier cette proprit en Saisie Clients.
bouton de commande
On veut crer lobjet UserForm suivant : Cet objet est compos des contrles suivants : un INTITULE et une ZONE DE LISTE MODIFIABLE pou saisir le titre du client (Madame, Mademoiselle ou Monsieur), trois INTITULES et trois ZONES DE TEXTE pour saisir le nom, le prnom et le tlphone du client et deux BOUTONS DE COMMANDE OK et Annuler. Pour placer un contrle dans lobjet UserForm, cliquer sur lobjet voulu de la BOITE A OUTILS et le faire glisser vers lobjet UserForm. Ds quun contrle a t plac sur lobjet UserForm, dfinir son nom grce la proprit NAME. Attention : Il est recommand dutiliser des noms vocateurs pour ses contrles, qui permettent didentifier le type dobjet quils reprsentent et leur utilit.
4) Placer les diffrents contrles de lobjet UserForm et modifier leurs proprits comme suit : Contrle proprit NAME proprit CAPTION INTITUL IntitulTitre Titre : ZONE DE LISTE MODIFIABLE ComboBoxTitre INTITUL IntitulNom Nom : ZONE DE TEXTE TextBoxNom INTITUL IntitulPrnom Prnom : ZONE DE TEXTE TextBoxPrnom INTITUL IntitulTl Tlphone : ZONE DE TEXTE TextBoxTl BOUTON DE COMMANDE ButtonOK OK BOUTON DE COMMANDE ButtonAnnuler Annuler Remarque : Il est possible de copier/coller des contrles. proprit FONT police TIMES NEW ROMAN, taille 10 " " " " " " "
Page 38
3) Excuter cette procdure (pour fermer la bote de dialogue FenetreSaisieClients, cliquer sur son bouton de fermeture).
Page 39
Dans le cas dune procdure vnementielle attache un objet UserForm, le nom de lobjet UserForm (proprit NAME) napparat pas dans les instructions de dclaration de la procdure. Il est remplac par le mot cl UserForm comme suit :
Private Sub UserForm_Nomvnement () ... End Sub
Les vnements sont nombreux et varient dun contrle lautre. En voici, quelques uns : vnement Change : dtect lors de la modification de la valeur (proprit VALUE) dun contrle (par exemple une zone de texte). vnement Click : dtect lorsque lutilisateur clique sur un contrle (par exemple un bouton de commande). vnement dblClick : dtect lorsque lutilisateur double-clique sur un contrle.
La proprit Me de lobjet UserForm renvoie lobjet UserForm actif. 4) Pour tester cette procdure, excuter la procdure ProgPrincSaisieClients du module de code ModuleSaisieClients. 5) Associer le code ncessaire au bouton Annuler pour que la bote de dialogue soit ferme lorsque lon clique dessus.
Page 40
Cette procdure permet deffectuer des rglages dans lobjet UserForm avant son chargement. Ecrire le code ncessaire pour affecter les valeurs Madame, Mademoiselle et Monsieur la zone de liste modifiable ComboBoxTitre, en utilisant les valeurs qui se trouvent dans la plage de cellule A1:A3 de la feuillle de calcul DIVERS.
1) Aller dans lditeur de Visual Basic. Dans lexplorateur de projets, selectionner lobjet UserForm de nom FenetreSaisieClients et ouvrir son module de code laide du clic droit de la souris et de loption CODE. 2) Dans la liste de gauche au sommet du module de code, slectionner loption UserForm. Dans la liste de droite au sommet du module de code, slectionner lvnement Initialize. 3) Complter la procdure vnementielle UserForm_Initialize qui apparat comme suit :
Private Sub UserForm_Initialize() Dim i As Integer i = 1 Do Until IsEmpty(Worksheets("Divers").Range("A" & i)) Call Me.ComboBoxTitre.AddItem(Worksheets("Divers"). _ Range("A" & i).Value) i = i + 1 Loop End Sub
Remarque : Pour crire une instruction sur plusieurs lignes, il faut, la fin de chaque ligne, taper sur la barre despace et sur le trait continu (_). 4) Pour tester cette procdure, excuter la procdure ProgPrincSaisieClients du module de code ModuleSaisieClients.
Page 41
Pour information : Il existe une autre mthode pour initialiser la zone de liste modifiable ComboBoxTitre avec les valeurs Madame, Mademoiselle et Monsieur, en la liant la plage de cellule A1:A3 de la feuillle de calcul DIVERS. Pour lier un contrle une plage de cellules, il faut renseigner la proprit ROWSOURCE du contrle avec la plage de cellules voulue (dans notre cas, Divers!A1:A3) ou encore mieux avec le nom de la plage de cellules voulue, ce qui suppose de nommer cette plage de cellules. Remarque : La proprit CONTROLSOURCE permet de lier un contrle une seule cellule. Attention: Cette mthode, contrairement la prcdente, ne pourra pas prendre en compte les ventuelles modifications faites sur le titre dun client (ajout ou suppression dun titre). La zone de liste modifiable ComboBoxTitre est lie la plage de cellule fixe A1:A3 de la feuille de calcul DIVERS.
La mise jour de la liste de donnes EXCEL correspondant aux donnes du client doit tre faite lorsque lutilisateur clique sur le bouton OK. Elle consiste insrer une nouvelle ligne dans la liste de donnes et recopier les valeurs des contrles de lobjet UserForm dans les bonnes cellules de la nouvelle ligne. 1) Aller dans lditeur de Visual Basic. Dans lexplorateur de projets, slectionner lobjet UserForm de nom FenetreSaisieClients, ouvrir son module de code et complter la procdure vnementielle ButtonOK_Click comme suit :
Private Sub ButtonOK_Click() Sheets("Clients").Rows(2).Insert Range("A2:D2").Font.Bold = False Sheets("Clients").Range("A2").Value=Me.ComboBoxTitre.Text Sheets("Clients").Range("B2").Value = Me.TextBoxNom.Text Sheets("Clients").Range("C2").Value=Me.TextBoxPrnom.Text Sheets("Clients").Range("D2").Value = Me.TextBoxTl.Text
Page 42
'tri de la liste de donnes dans l'ordre croissant des noms (deuxime colonne). Call Sheets("Clients").Range("A1"). _ Sort(Key1:= Sheets ("Clients").Columns("B"), Header:=xlYes) Call Unload(Me) End Sub
Attention : Si, dans les procdures vnementielles ButtonOK_Click et ButtonAnnuler_Click, on utilise la mthode Hide pour masquer lobjet UserForm la place de linstruction Unload, les ressources mmoires de lobjet UserForm ne sont pas libres. Lors dun nouvel affichage de lobjet UserForm avec la mthode Show, les diffrents contrles de lobjet ont alors les mmes valeurs que lorsquil a t masqu.
Page 43
Pour cela dans une Macro Excel, il vous faudra : accder lapplication Word : rendre la fentre visible : ouvrir un document : ajouter un document : sauvegarder le document : crire du texte : CreateObject("Word.Application") ObjetWord.Visible = True ObjetWord.Documents.Open ObjetWord.Documents.Add ObjetWord.Documents.Save ObjetWord.Selection.TypeText Text:="le texte"
Lenregistreur de macro existe galement sous Word et vous permettra de dcouvrir les instructions utiles vos besoins.
Page 44
Envoie de mails
Grce linstruction fournie prcdemment, on peut galement dclencher lenvoie dun mail par lintermdiaire dune url du type : mailto:adresse_mail?subject=le_sujet&body=le_contenu_du_message Par exemple, pour lurl suivante mailto:edgar.poe@gmail.com?subject=Oh&body=ca va ?, edgar.poe@gmail.com reprsente ladresse mail laquelle on souhaite envoyer le message, Oh reprsente le titre du message et ca va ? son contenu.
Page 45