Programmation VBA
Transcription
Programmation VBA
Activer l’onglet Développeur (Excel) Programmation VBA Michel Reid • Cliquez sur le bouton Office (coin supérieur gauche) • Cliquez sur le bouton Options Excel • Dans la section Standard, cochez la case Afficher l’onglet Développeur dans le ruban Identificateurs • Suite de caractères ( lettres, chiffres ou _ ) qui commence par une lettre. • Caractères de ponctuations interdits ainsi que #, blanc , ? , … • Maximum de 255 caractères • Pas sensible à la casse. Déclaration d’une variable • Une variable est une information dont la valeur peut changer au cours de l’exécution du programme. • Syntaxe de la déclaration : Types de base • • • • • • Entier Réel Booléen Chaîne de caractères Un caractère Quelconque Integer Single Boolean String String * 1 Variant Commentaires • La fin d’une ligne à partir d’un apostrophe • Une ligne débutant par Rem – DIM nom de variable AS type, nom de variable AS type • Dim intL eChiff re As Intege r • Dim intC hiffre A AS I nteger , intC hiffre B As Integer • Dim intC hiffre 1, int Chiffr e2 as Intege r – Pour cette dernière déclaration, seule la variable intChiffre2 sera de type Integer. 1 Opérateurs arithmétiques (en ordre de priorité) Affectation • En utilisant l’opérateur = age = 23 a = age Range(“A1”).value = age age = Range(“D2”) „value est la propriété par défaut pour Range. • La variable ou la propriété située du coté gauche du = représente un contenant, l’endroit où sera déposée la valeur, alors que la variable, ou la propriété du côté droit représente la valeur contenu dans la variable ou la propriété. • ^ • • *, / • \ • MOD modulo ( le reste de la division, n’est possible qu’entre 2 entiers ) • +, addition et soustraction • & (ou +) Concaténation Opérateurs logiques (En ordre de priorité) Opérateurs relationnels • = • <> • NOT • • • • • OR • Xor • • est égale à est différent de < est inférieur à <= est inférieur ou égale à > est supérieur à >= est supérieur ou égale à Pas d’ordre de priorité (entres eux) Moins prioritaire que opérateurs arithmétiques Constantes puissance négation multiplication et division (réelle) division entière (sans reste) • AND le contraire de (non) et logique ou logique ou excl usif • Moins prioritaires que les opérateurs relationnels Saisie de donnée avec InputBox • Utilise le mot clé Const • Syntaxe : • Syntaxe: InputBox(prompt[, title ] [, default] [, xpos] [, ypos ] [, helpfile, context]) Const nom de la constante AS type = valeur Exemple : Const TPS AS Single = 0.07 • L’affectation ne peut se faire qu’à la déclaration. – Résultat : Retourne un String – Arguments : • • • • Prompt : Le message incitatif Title : le titre de la boîte de dialogue (facultatif) Default : la valeur suggérée par défaut (facultatif) xpos et ypos : Positions, en twips (environ 1440 par pouce) à partir du coin supérieur gauche de l’écran (facultatif, si omis, la boîte de dialogue est centrée) • Les autres ne seront pas utilisés dans le cadre de ce cours. 2 Afficher un message avec msgBox Syntaxe • Syntaxe : MsgBox( prompt [, buttons ] [, title] [, helpfile, context]) – Résultat : Le bouton appuyé – Arguments : • Prompt : le message à afficher. • Buttons : le(s) bouton(s) à affichés (facultatif, par défaut vbOkOnly, constante dont la valeur est 0). • Title : Titre affiché par la boîte de dialogue (facultatif). Instructions de contrôle if…else…end if Instructions simples Ex: total = prix + taxes Instruction structurée if (if Bloc d’instructions Plusieurs instructions simples ou structurées entre then et else ou entre else et end if S’il n’y a pas de clause else et que l’instruction est simple alors on utilise : if condition then instruction Dans ce cas il n’y a pas de end if Instructions de contrôle select case • Syntaxe: Select case expression Case cte1, cte2 Instruction1 Case borne1 To borne2 Instruction2 Case is opérateur relationnel cte3 instruction3 Case else Instruction4 End select if condition Then Instruction1 else Instruction2 end if La condition est une expression dont le résultat est booléen. Si celle-ci est vraie, dans ce cas l’instruction1 est exécutée. Sinon, l’instruction2 est exécutée. Le else est facultatif Instruction1 et instruction2 sont soit des instructions simples, structurés ou encore composés (blocs d’instructions) Instructions de contrôle select case Cas particulier du if imbriqué lorsque l’on test l’égalité d’une expression avec plusieurs valeurs qui sont, habituellement, mutuellement exclusives. Exemple: Expression, habituellement sur une ligne. Instruction de contrôle comme un if…else…end imbriqué), Select case ou une boucle Instructions de contrôle if…else…end if Select C ase un Chiffr e case 1 a = b + c case is >= 2 a = b * c Case else a = b / c End sele ct Instructions de contrôle select case • Le case else est facultatif, s’il est présent, c’est le point d’entrée de toutes les valeurs qui ne sont pas spécifiées dans un case. • La virgule , est utilisée pour séparer les valeurs dans une liste de valeurs. • To est utilisé lorsque l’on définie une intervalle de valeurs successives. • Is est utilisé lorsque l’on évalue une relation (=, <, >, etc.) avec une seule borne • Si 2 clauses Case correspondent à l’expression évaluée, la première définie prévaut. 3 Instructions de contrôle boucle while • Syntaxe while condition instruction wend Instructions de contrôle boucle for… next • Syntaxe for compteur=expr1 instr uction next compteur to expr2 step expr3 • L’instruction peut être simple, structurée ou un bloc, le bloc se termine avec le mot clé wend. • Si la condition est vraie, l’instruction de la boucle est exécutée. • La condition est évaluée au début de la boucle, donc il est possible que l’instruction dans la boucle ne soit jamais exécutée. • L’instruction peut être simple, structurée ou un bloc. • expr1: initialisation avant la 1ière itération. • expr2: Valeur limite, dernière valeur pour laquelle il y aura une itération • expr3: le pas utilisé pour l’incrémentation à la fin de l’itération. Facultatif, par défaut = 1 • Compteur après next facultative, par défaut même que pour expr1. Instructions de contrôle boucle do…Loop Instructions de contrôle boucle do…Loop • Syntaxe • Syntaxe alternative do do instruction Loop while condition instruction Loop until condition • L’instruction peut être simple, structurée ou un bloc. • Si la condition est vraie, l’instruction de la boucle est ré-exécutée. • L’instruction sera exécutée au moins une fois. • Si la condition est vraie, l’instruction de la boucle n’est pas ré-exécutée. • L’instruction sera exécutée au moins une fois. Instructions de contrôle boucle do…Loop Instructions de contrôle boucle do…Loop • Syntaxe alternative • Syntaxe alternative Do while condition instruction Loop Do until condition instruction Loop • Si la condition est vraie, l’instruction de la boucle est exécutée. • L’instruction peut ne jamais être exécutée • Si la condition est fausse, l’instruction de la boucle est exécutée. • L’instruction peut ne jamais être exécutée 4 Fonctions • Sous-routine qui retourne une valeur • Syntaxe Private Function nomDeFonction( liste de paramètre(s)) as type de retour déclarations locales si nécessaire traitement nomDeFonction = resultat End Function • La valeur retournée par la fonction est celle affecté au nom de la fonction Fonctions (suite) • Dans la déclaration, chaque paramètre est précédé de son type de transmission ByVal ou ByRef. Par défaut, c’est ByRef. – Chaque paramètre doit être suivi de son type. • À l’appel, seuls les noms de paramètres sont écrits • Par défaut, la référence vers la valeur est passée en paramètre (ByRef), donc tous changements dans la valeur d’un paramètre se répercute sur la variable passée à l’appel. • La correspondance entre les paramètres de l’appel et de la fonction dépend de la position dans la liste des paramètres • Les variables locales et les copies locales des paramètres n’existent plus lorsque l’exécution de la fonction est terminée, sauf les variables statiques. Sous-routine • • Sous-programme qui sert à regrouper les instructions d’un traitement qui va se répéter souvent ou encore a diviser un traitement compliqué en plusieurs blocs distincts. Syntaxe Visibilité sub nomDeSousRoutine( liste de paramètre(s)) déclara tions l ocales si néce ssaire traitement End Sub • La visibilité peut être: • • Paramètres au besoin seulement. Appel: Fonctions (suite) • Exemple : définition : Private Function plusGrand(byVal val1 as single, byVal val2 as single, byVal val3 as single) dim grand as single if val1>val2 then grand = val1 else grand = val2 end if if grand > val3 then plusGrand = grand else plusGrand = val3 End if End Function • Appel : plusG = plusGrand( taille1, taille2, 2.15) Fonctions • L’appel de la fonction « vaut » le résultat retourné • La valeur retournée est la dernière affectée au nom de la fonction. • Une fonction ne peut retourner qu’une seule valeur avec son nom. • Par contre, plus d’un résultat peut être transmis en modifiant la valeur des paramètres par référence. • L’appel d’une fonction peut être placée n’importe où une valeur est valide : côté droit d’une affectation, paramètre de fonction, condition, etc. Sous-routine • Ne retourne pas de valeur. • Comme une fonction, elle peut aussi recevoir une liste de paramètres. • Les paramètres sont traités de la même façon que pour une fonction. – Private : la sous-routine ne peut être appelée que du module où elle est définie – Public : la sous-routine peut être appelée de partout – nomDeSousRoutine liste de paramètres – call nomDeSousRoutine ( liste de paramètres) 5 Sous-routine, arguments transmis par références Private sub litValeur(ByRef valALire1 as Integer,ByRef valALire2 as integer) valAlire1 = Val(InputBox("Entrez un entier")) valAlire2 = Val(InputBox("Entrez un autre entier")) End Sub • Cette sous-routine transmet 2 résultats par référence • L’appel : Objets d’Excel • • • • Application : le programme Excel Workbook: un classeur Worksheet : une feuille de calcul Range : un plage de cellules litValeur(unEntier1,unEntier2) Collections • Sheets : toutes les feuilles du classeur • Cells : toutes les cellules de la feuille (par défaut) ou de la plage de cellules. • Rows : toutes les lignes de la feuille ou plage. • Columns: les colonnes de la feuille ou plage. – Count : propriété de toutes les collections indiquant le nombre d’éléments contenus. Range • On détermine la plage en donnant son adresse: – Range ("A1"), Range ("A1:C4") • Comme pour tout objet, si l’on veut changer la référence d’une variable Range, on utilise Set. – Set unRange = Range("A1") • Pour changer le contenu, l’attribut value: – Range ("A1").value = 2 ou Range ("A1")=3 • Pour obtenir la plage des données contigües – Range ("A1").currentRegion Range • Pour spécifier une cellule relative à la cellule courante, on utilise offset(dep. ligne, dep col) – Range ("A1").offset(2,3) représente la cellule D3 • • • • Une cellule d’une plage de cellule, Cells(l,c) Range ("B2:G34").Cells(20,4) : cellule E21. La cellule courante : ActiveCell L’adresse de la plage de cellule courante: – ActiveCell.address Range • La plage de cellules contenant l’intersection entre 2 plages de cellules: – Intersect(Range("A1:G34"), Range("B12:F36")) : vaut B12:G34 • Une cellule est-elle vide? – isEmpty(Range("A1" )) • La couleur de fond d’une cellule : – Range("A1" ).Interior.colorIndex • Rendre une cellule active: – Range("A1" ).Activate 6 Événements • Nouvelle feuille dans le classeur : – Sub Workbook_NewSheet(ByVal Sh As Object) • Une feuille vient d’être activée: – Sub Worksheet_Activate() • La plage de cellules actives d’une feuille vient de changer (par exemple, un click de souris dans une cellule): – Sub Worksheet_SelectionChange(ByVal Target As Range) • La valeur d’une cellule vient de changer: – Sub Worksheet_Change(ByVal Target As Range) Formulaire et contrôles • Contrôles – SetFocus: devient le contrôle actif (courant) pour boutons, boîtes de texte, bouton d’option, etc. – Bouton : cmdButton • • • • • • name : nom du bouton enabled : actif vrai ou faux caption: libellé sur le bouton accelerator : raccourci clavier visible: visible vrai ou faux tabIndex : ordre d’activation avec touche tabulation formulaire et contrôles – Boîte de texte: textBox • name • Text : la chaîne de caractère affichée dans la boîte de texte • enabled : Peut être modifiée par l’usager • multiline: peut afficher sur plusieurs lignes • tabIndex • visible Formulaire (UserForm) et contrôles • Ajouter un formulaire: dans Éditeur VB, menu insertion|UserForm • Quelques propriétés des formulaires: – name : le nom du formulaire – caption : le titre du formulaire – height: hauteur – width: largeur • Activer un formulaire: nomForm.show • fermer le formulaire: End formulaire et contrôles • Contrôle (suite) – bouton d’option: option button (1 actif par groupe) • name • caption • tabIndex • value : vrai ou faux, il est sélectionné • enabled • accelerator Formulaire et contrôle – Étiquette: label • name • accelerator • tabIndex – Cadre : frame, un conteneur • permet de regrouper des boutons d’option • caption: titre • enabled : le contenu est actif vrai ou faux • tabIndex : pour le groupe 7 Formulaire : évènements – nomDuBouton_click : évènement click sur le bouton – nomtextBox_change: chaque fois que le contenu change – nomtextBox_afterUpdate: après la saisie d’un nouveau contenu – nomtextBox_beforeUpdate: tout juste avant d’effectuer la saisie d’un nouveau contenu – nomFormulaire_activate lorsque le formulaire devient actif. 8