Cours de VBA pour Excel
Transcription
Cours de VBA pour Excel
Introduction à VBA Généralités Langage (syntaxiquement) très proche de VB, ASP Intégré aux applications MS-Office Manipulation des « objets » de ces applications Comparaison avec d'autres langages Similarités Structures de contrôle Fonctions intégrées ; fonction utilisateur et paramètres Spécificités Pas de pointeur Faiblement typé ; existence d'un type générique (Variant) Interfaçage avec les « objets » Excel 2 Sommaire Bases – Généralités (1) Bases du langage Notations et conventions de ce cours Syntaxe : généralités Types simples et principales fonctions intégrées Structures de contrôle Procédures et fonctions personnalisées Tableaux Code source en police Courier Rem. ne pas confondre l ( L min.) et 1 (un) Mots-clés du langage (à recopier tels quels) en Courier gras Autres mots (à remplacer par une valeur) en Utiliser VBA Courier italique Interface Déboguer le code Mots optionnels (=facultatifs) entre crochets [option] Rem. suite de mots optionnels [option1 [,option2 [,option3 ... ]]] Objets spécifiques aux applications Office Notions d'objet, propriété, méthode & collection Principaux objets Excel Événements et formulaires Alternative entre plusieurs mots entre accolades {mot1|mot2|mot3} 3 Bases – Généralités (2) Bases – Variables et types (1) Commenter son code Nombres Utilité : lisibilité, réutilisabilité, maintenance Syntaxe : Rem Commentaire ou Types principaux entiers : nb_personnes=3 : dist_terre_sol=147100000 réels : temp_zero_k=-273.15 : masse_terre=6E+24 'Commentaire Opérateurs (priorité décroissante) Casse Opérateur ^ * / \ Mod + & Pas de différenciation majuscules/minuscules Mise en forme et coloration automatiques : rem commentaire 4 Rem commentaire Conseil : tout écrire en minuscules Instructions Plusieurs sur une même ligne : séparateur « : » 5 Signification puissance négation multiplication, division division entière (quotient) division modulo (reste) addition, soustraction concaténation Exemple 5 ^ 2 = 25 -5 + 2 = -3 5 / 2 = 2.5 5 \ 2 = 2 5 Mod 2 = 1 5 – 2 = 3 5 & 2 = 52 6 Bases – Variables et types (2) Bases – Variables et types (3) Nombres (suite) Chaîne Fonctions intégrées principales Fonction Signification Abs valeur absolue Atn arc-tangente (rad) Cos, Sin cosinus, sinus (rad) Exp, Log exponentielle, log népérien Fix, Int partie entière Rnd Sgn Sqr Tan nombre aléatoire ∈ [0,1[ signe ∈ { - 1,0,1} racine carré tangente Description : ensemble de caractères (de 0 à 65 400) Chaîne constante Exemple Abs(-5.2)=5.2 Atn(1)=0.785398 Cos(3.14159265)=-1 Exp(1)=2.7182818 Fix(8.4)=Int(8.4)=8 Fix(-8.4)=-8 Int(-8.4)=-9 Rnd*2 1.411095 Sgn(-8.4)=-1 Sqr(2)=1.414213 Tan(3.14159265)=1 entourée de guillemets doubles ("...") ne pas confondre avec une variable chaîne : "message" ≠ message (variable chaîne, ex. "bla bla") Remarque : peut inclure Lettres et chiffres ("Lettres", "007") Espaces et caractères de ponctuation (" , ") Guillemets doubles : "Il dit ""Bonjour"" " Caractères spéciaux non imprimables 7 Bases – Variables et types (4) – fin de ligne : vbCrLf – tabulation : vbTab - retour arrière : vbBack 8 Bases – Variables et types (5) Chaîne (suite) Chaîne (suite) Affichage Concaténation dans une boîte de message mise bout à bout de 2 chaînes (constantes ou variables) opérateur & MsgBox ("Bonjour") dans la fenêtre Exécution message = "Bonjour" print message & " à tous" Debug.Print "Bonjour" mise en cascade possible : Remarques sur Debug nom = "Bond" print "Mon nom est " & nom & ", James " & nom – représente la fenêtre d'exécution elle-même – peut être omis si l'instruction est saisie dans la fenêtre Exécution Exercices Demander son prénom à l'utilisateur, puis afficher un message "Bienvenue dans VBA, prénom" Demander un nombre et afficher sa table de multiplication (de 1 à 5 fois) Saisie dans une boîte de saisie réponse = InputBox ("Écrivez-moi un mot") 9 Bases – Variables et types (6) Bases – Variables et types (7) Chaîne (suite) Chaîne (suite) Fonctions intégrées principales Len Left Right Mid longeur (nb. caractères) partie gauche partie droite sous-partie quelconque Instr recherche de sous-chaîne Asc Chr LCase UCase [L|R]Trim code ASCII d'un caractère caractère associé à un code conversion en minuscules conversion en majuscules suppression des espaces 10 Exercices Demander de saisir une phrase et afficher : Len("tête")=4 Left("tête",3)="têt" Right("tête",2)="te" Mid("tête",2,1)="ê" Instr("tête","e")=4 Instr("tête","T")=0 Asc("A")=65 Chr(65)="A" LCase("TêTe")="tête" UCase("TêTe")="TÊTE" LTrim(" a ")="a " – le nombre de caractères – le premier mot – le second mot – la phrase, avec la 1ère lettre en majuscule et le reste en minuscules 11 12 Bases – Variables et types (8) Bases – Variables et types (9) Booléen Date et heure Description : variable à 2 valeurs possibles Description : date et/ou heure Date/heure constante True (Vrai) False (Faux) entourée de dièses (#...#) attention au format (France : #JJ/MM/AAAA [HH:MM:SS]#) Opérateurs (priorité décroissante) Opérateur Not And Or Xor Signification non logique et logique ou logique ou exclusif Exemple Not True = Faux True And False = Faux True Or False = Vrai True Xor True = Faux Opérations addition/soustraction : possibles date_naiss = #31/03/1990# print date_naiss-1 30/03/1990 print date_naiss+1 01/04/1990 conversion en type numérique : nombre de jours écoulés depuis le 30 décembre 1899 Exercice : si A=True et B=False, que valent A. BA. B print date_naiss*2 A.B A ⊕ B Bases – Variables et types (10) Récapitulatif des types Principales fonctions intégrées Signification date système courante ajout d'un intervalle DateAdd de temps à une date nombre d'intervalles DateDiff de temps entre 2 dates caractéristique DatePart d'une date Format Formatage de date 14 Bases – Variables et types (11) Date et heure (suite) Fonction Date 65926 13 Exemple Date=04/02/2015 DateAdd("m",1,#31/1/90#) =28/02/90 DateDiff("d",#1/1/90#, #31/12/90#)=364 DatePart("y",#2/2/90#)=33 DatePart("ww",#2/2/90#)=5 Format(#2/2/90#,"d mmmm yy") ="2 février 90" Type Suf. Description Boolean booléen Byte octet Integer % entier Long & entier long Single ! réel simple Double # réel double Date String Object Variant $ Taille 2 octets 1 octet 2 octets 4 octets 4 octets 8 octets date/heure Valeurs possibles True/False 0..255 -32768..32767 -2E9..+2E9 ±3.4E38..±1.4E-45 ±1.8E308..±4.9E-324 1/1/0100..31/12/9999 00:00:00..23:59:59 chaîne objet Excel tout type 0..65400 caractères Workbook, Range, … toutes valeurs Len(ch) 4 octets 16 octets 8 octets 15 Bases – Variables et types (12) 16 Bases – Variables et types (13) Conversion entre types Initialisation Automatique - Ex. Types Exemple Boolean Booléen Numérique Byte, Long, Double, … Date Date String Chaîne Variant Variant Objet Workbook, Range, … print nb & "*" & mult & "=" nb*mult print "Aujourd'hui, nous sommes le " & Date() Fonctions spécialisées Utilité : réduire la taille mémoire Conversions – en booléen : CBool - Ex. CBool(10) True – en entiers : CByte, CInt, CLng Ex. CInt(10.5) 10 : CInt(True) -1 – en date : CDate (partie entière date, partie décimale heure) Ex. CDate(32963.25) 31/03/1990 06:00:00 – en réels : CSng, CDbl – en chaîne : CStr Initialisation False 0 00:00:00 "" Empty Nothing Informations sur le type Connaître le type : fonction VarType() temp = 38.2:Debug.Print VarType(temp) Tester le type Fonctions IsType (Ex. IsDate(), IsNumeric(), ...) 17 18 Bases – Variables et types (14) Bases – Variables et types (15) Déclaration de variable Déclaration de variable (exercices) Option Explicit Implicite Dans Sub déclare(), mot inconnu nouvelle variable (type donné par la valeur) Ex. temp=38.2 variable type Double déclarer – – – – – – – Explicite Option Explicit dans section (Déclarations) Avec Dim et As Dim nomVar As type Dim ch As String Avec Dim et suffixe accolé Dim nomVarSuffixe Dim ch$ Dim nomVar1 As type1, nomVar2 As type2,… Rem.: que déclare Dim v1, v2 As Double ? – – – – – – – True 33000 6.0E+24 Date() "Le " & uneDate "$A$1" Range(unVariant) afficher leur valeur afficher leur valeur par défaut En cascade 19 Bases – Variables et types (16) 20 Bases – Structures de contrôle (1) Constantes Test Description : association Nom VbKeyA vbCrLf les initialiser à unBooléen, de type Boolean unEntier, de type Integer unRéelDouble, de type Double uneDate, de type Date uneChaine, de type String unVariant, de type Variant unObjet, de type Range 65 Chr(13)&Chr(10) Valeur Description : exécution d'instructions sous condition Syntaxe vbDouble 5 vbGreen 65280 Forme la plus simple Déclaration de constante personnalisée If condition Then instruction – Le tout sur 1 seule ligne – Plusieurs instructions possibles condition en les séparant par ":" vraie ? non Const nomConst [As type] = valeur Ex. Const cZeroK As Single = -273.15 Utilisation : comme les variables dans une expression If condition Then instructions comme paramètre d'une fonction réponse=MsgBox("Êtes-vous sûr ?", vbYesNo) If (réponse=vbYes) Then ... instructions suivantes EndIf instructions suivantes 21 Bases – Structures de contrôle (2) 22 Bases – Structures de contrôle (3) Test (suite) Test (suite) : Sélection (ou « Test Selon ») Syntaxe (suite) oui If condition Then instructions1 Else instruction(s) Forme avec plusieurs instructions Debug.print "Zéro kelvin=" & cZeroK & "°C" Forme avec alternative oui condition vraie ? instructions1 instructions2 EndIf non instructions2 instructions suivantes Select Case expression Case valeurs1 instructions1 valeurs1 Case valeurs2 expression testée valeurs2 ... autres cas instructions2 ... instructions1 instructions2 ... instructionsN [Case Else instructions suivantes Remarques Les tests peuvent être imbriqués Ou utiliser – If … Then … ElseIf … Then … – Test « Selon » Description : exécution d'instructions sous condition avec plusieurs valeurs possibles Syntaxe instructionsN] End Select instructions suivantes 23 instructions suivantes 24 Bases – Structures de contrôle (4) Bases – Structures de contrôle (5) Test (exercices) Boucle Dans Sub formater(), Description : exécution répétitive d'instructions Types de boucles Afficher le message ci-contre Selon la réponse, afficher les messages « While » : exécutée tant qu'une condition est vraie – « Vous l'aurez voulu ! » (réponse « Oui ») – « On arrête tout ! » (réponse «Non ») S'arrête lorsque la condition devient fausse « Until » : exécutée jusqu'à ce qu'une condition soit vraie Dans Sub calc_rabais(), S'arrête lorsque la condition devient vraie Afficher la boîte de saisie ci-contre Calculer le rabais : « For » : exécutée un nombre de fois donné (compteur) Attention : risque de boucle infinie si – 2,5% pour un montant inférieur à 100€ – 5% pour un montant de 100 à 1000€ – 10% au-delà de 1000€ la condition d'une boucle « While » ne devient jamais fausse la condition d'une boucle « Until » ne devient jamais vraie la condition doit être modifiée par les instructions de boucle Afficher le rabais et la somme due 25 Bases – Structures de contrôle (6) 26 Bases – Structures de contrôle (7) Boucle While Boucle Until Exécution d'instructions tant qu'une condition est vraie Syntaxes : Exécution d'instructions jusqu'à ce qu'une condition soit vraie Syntaxes : Do While condition instructions Loop Do instructions Loop While condition Do Until condition instructions Loop Do instructions suivantes instructions suivantes instructions suivantes instructions suivantes condition vraie ? oui instructions non instructions suivantes instructions condition vraie ? non instructions suivantes condition vraie ? non instructions oui instructions Loop Until condition oui instructions suivantes instructions condition vraie ? oui instructions suivantes non 27 Bases – Structures de contrôle (8) Bases – Structures de contrôle (9) Boucle For Boucles (exercices) Exécution d'instructions un nombre de fois donné (connu) Syntaxes : For cpt=init To fin instructions Next cpt instructions suivantes Dans Sub saisie_chiffre(), saisir un nombre dans une boîte de dialogue garantir que cpt=init cpt<fin ? – la saisie est bien numérique (utiliser Val() et IsNumeric()) – le nombre saisi fait bien partie de l'ensemble {0, 1, ... , 9} non Dans Sub multiplication1(), oui instructions For cpt=init To fin Step pas instructions Next cpt instructions suivantes 28 saisir un nombre dans une boîte de dialogue afficher sa table de multiplication (de 1 à 10 fois) cpt=cpt+pas cpt=cpt+1 – dans la fenêtre Exécution, puis – dans une boîte de message instructions suivantes 29 30 Bases – Structures de contrôle (10) Bases – Fonctions et procédures (1) Boucle For Each (énumérateur) Fonction Exécution d'instructions pour chaque élément d'un ensemble Syntaxe Description : ensemble d'instructions réalisant une tâche précise et retournant un résultat Utilité : For Each élément In ensemble instructions Next élément modularité (découpage d'un problème en sous-problème) réutilisabilité (appel en plusieurs endroits) Remarques L'ensemble peut être un tableau ou une collection Les instructions sont exécutées autant de fois qu'il y a d'éléments La variable élément prend tour à tour la valeur de chaque élément Exemple Distinguer : l'implantation (entête+corps) = la fonction elle-même l'appel de la fonction Lien avec une fonction en mathématiques For Each chiffre In Array(1,5,3) Debug.Print chiffre Next chiffre calcule un résultat à partir de paramètres (ou arguments ) Ex. y = sin(x) 31 Bases – Fonctions et procédures (2) Bases – Fonctions et procédures (3) Fonction (implantation) Fonction (appel) Syntaxe entête corps 32 Syntaxe Function nomFonc ([params]) As type 'commentaires : instructions : nomFonc = résultat End Function Function nomFonc ([params]) As type implantation appel : End Function : Dim retour As type retour = nomFonc ([valParams]) Remarques Remarques retour doit être du même type que la fonction (cf. entête) les valeurs des paramètres valParams transmises lors de l'appel doivent correspondre (2 à 2) aux types déclarés dans l'entête pour ces paramètres params résultat doit avoir le type spécifié dans l'entête le retour d'un résultat utilise le nom de la fonction 33 Bases – Fonctions et procédures (4) 34 Bases – Fonctions et procédures (5) Procédure Paramètre Description : fonction qui ne retourne pas de résultat Syntaxe Description : donnée d'entrée de la fonction Rem. Parfois aussi donnée de sortie Syntaxe d'un paramètre Implantation Sub nomProc ([params]) entête 'commentaires : corps instructions : End Sub Appel Call nomProc ([valParams]) [ByVal|ByRef] nomParam [As type] Remarques Passage par défaut : par référence (ByRef) Type par défaut : Variant Si plusieurs paramètres : les séparer par une virgule Question : quels sont les types et passages pour ByVal param1, param2 As String 35 36 Bases – Fonctions et procédures (6) Bases – Fonctions et procédures (7) Paramètre (suite) Paramètre (exemples) Passage par référence (ou: par adresse) (ByRef) Sinus d'un angle exprimé en degrés Entête L'adresse mémoire de la variable est transmise à la fonction La fonction travaille directement sur la variable La variable originale ressort modifiée de la fonction Function sinDeg(ByVal angle as Double) As Double Appel (ex.) y = sinDeg(30) 0.5 Passage par valeur (ou: par copie) (ByVal) Une copie de la variable est créée et transmise à la fonction La fonction travaille sur cette copie de la variable La variable originale n'est pas modifiée par la fonction Premier mot d'une phrase Entête Function prem(ByVal phrase as String) As String Remarques Appel (ex.) Grande majorité des cas = passage ByVal ByRef utile si plusieurs résultats doivent être retournés Debug.Print prem("Bonjour à tous") "Bonjour" 37 Bases – Fonctions et procédures (8) Bases – Fonctions et procédures (9) Paramètre (exemples) Paramètre nommé à l'appel n premiers mots d'une phrase Function prems(ByVal phrase as String, ByVal n as Long) As String Debug.Print prems("Bonjour à tous", 2) "Bonjour à" Idem, en modifiant éventuellement n si incorrect Function prems(ByVal phrase as String, ByRef n as Long) As String Sub test() Dim nb As Long nb = 5 Debug.Print prems("Bonjour à tous", nb) End Sub "Bonjour à tous" 38 et nb=3 Description : appel d'une fonction en utilisant le nom de ses paramètres Utilité Clarification du code Spécification des paramètres dans un ordre quelconque Non-spécification des paramètres optionnels Syntaxe retour = nomFonc (nomParam1:=valParam1, nomParam2:=valParam2, …) Exemple MsgBox(prompt [,buttons] [,title] [,helpfile, context]) rep = MsgBox(title:="Titre", prompt:="Bonjour à tous") 39 Bases – Fonctions et procédures (10) 40 Bases – Fonctions et procédures (11) Paramètre optionnel Paramètre optionnel (exercices) Description : paramètre pouvant être omis à l'appel de la fonction Syntaxe d'un paramètre optionnel Écrire les entêtes des fonctions Optional [ByVal|ByRef] nomParam [As type] [=valDéf] Remarques les paramètres suivants doivent aussi être optionnels ; les paramètres optionnels se placent donc en fin de liste préciser systématiquement une valeur par défaut sinus(), avec un entier optionnel pour l'unité d'angle (0=radians (par défaut), 1=degrés, 2=grades, 3=tours) Ex. sinus(30, 1) 0.5 Ex. sinus(1.57) 0.999999682931835 prem() et prems() avec le séparateur de « mots » comme paramètre optionnel (par défaut : espace " ") Ex. prems("Bonjour à tous", 2, "o") "Bonj" message() en remplacement de la fonction intégrée MsgBox() Exemple (paramètres optionnels : boutons et titre) Function concat(ByVal ch1 As String, ByVal ch2 As String, Optional ByVal sep As String="-") As String 41 Écrire les fonctions complètes (dans cet ordre) : message(), sinus(), prem(), prems() 42 Utiliser VBA – Éditeur (1) Utiliser VBA – Éditeur (2) Introduction Vue générale L'éditeur VBA lancement : Outils/Macro/Visual Basic Editor ou Alt+F11 fait partie d'Excel, ce n'est pas une application indépendante Le code VBA Fenêtre Exécution cf. menu Affichage Fenêtre Projet est enregistré soit – dans le classeur courant (cas par défaut) Fenêtre Code •Objets Excel •Formulaires •Modules enregistré avec lui – dans un classeur de macros personnelles (Perso.xls), situé dans le répertoire XLOuvrir (ou XLStart) Fenêtre Propriétés Fenêtre Espions 43 Utiliser VBA – Éditeur (3) 44 Utiliser VBA – Éditeur (4) Fenêtre Projet Fenêtre Code Nom du projet et du classeur Objets Excel du classeur feuilles de calcul Affiche le code attaché à un objet 4 types d'objets peuvent contenir du code Feuilles de calcul et Classeur Objet Excel Nom Code (Nom Feuille) Événement Le code correspond aux événements de ces objets classeur lui-même Formulaires (UserForms) Boîtes de dialogue utilisateur Menu Insertion/UserForm Modules Code VBA (Déclarations, Fonctions et Procédures) Menu Insertion/Module Formulaires (UserForms) Élément de formulaire Événement Le code correspond aux éléments du formulaire Modules Section "Déclarations", Fonctions et Procédures Contiennent des fonctions et procédures utilisateur Modules de classe 45 Utiliser VBA – Éditeur (5) 46 Utiliser VBA – Déboguer (1) Fenêtre Exécution Exécuter du code Permet d'entrer des commandes directes pour Procédure sans paramètre (="Macros") afficher ponctuellement la valeur d'une expression Ex. print 2^8 Ex. ? sin(Atn(1)*2) Ex. ? ActiveWorkbook.Name exécuter des instructions VBA ponctuelles Ex. Call msgBox("Etes-vous sur ?", vbYesNo) voir la valeur d'une variable/expression. Ex. ? i placer le curseur dans son code et cliquer sur ou : dans Excel, menu Outils/Macro/Macros... Procédure avec paramètre(s) ou fonction y faire appel dans une macro dédiée, ex. Sub appel() ou : y faire appel dans la fenêtre Exécution Stopper l'exécution Peut être utilisée d'un programme qui « boucle » : Échap ou Ctrl+Pause en plaçant (avant exécution) un point d'arrêt sur une ligne exécutable du code (pour déboguer ensuite) : depuis le code dans un but de débogage, avec Debug.Print pour saisir plusieurs instructions (en les séparant par ":") Ex. For Each elt in Array(1,2,3):print elt:Next clic dans la marge grise ou touche F9 (à l'endroit du curseur) 47 48 Utiliser VBA – Déboguer (2) Déboguer le code Éliminer les erreurs de syntaxe Corriger les lignes dont le code figure en rouge Vérifier globalement : Débogage/Compiler VBAProject Trouver les erreurs d'exécution : possibilités Exécuter le code – ligne à ligne : F8 ou Shift+F8 – en sortant de la fonction appelée : Ctrl+Shift+F8 – jusqu'au curseur : Ctrl+F8 Visualiser les variables – pointeur souris sur un nom de variable dans le code valeur dans bulle d'aide – fenêtre Exécution : print nbValUniques – ajout d'un espion sur la variable valeur et type 49 Utiliser VBA – Déboguer (4) VBA avancé – Tableaux (1) Fenêtre Espions Tableau Utilité : suivre l'évolution des valeurs des variables Description Variable espionnée Valeur Type Fonction concernée Possibilité d'espionner les tableaux et les objets Description : ensemble d'éléments de même type, dans lequel les éléments sont repérés par leur indice (ou numéro d'index) valeurs 5,5 12,5 9,0 0,0 10,0 14,0 11,5 ... indices 0 1 2 3 4 5 6 ... Utilité : stockage aisé d'un grand nombre d'éléments Ex. ensemble de notes, de points de l'espace 3D, ... traitements systématiques sur ces éléments Ex. parcours avec une boucle For Ajouter une variable à espionner glisser-déposer son nom dans la fenêtre ou : clic sur son nom puis Débogage/Ajouter un espion ou : clic droit sur son nom puis Ajouter un espion 51 VBA avancé – Tableaux (2) VBA avancé – Tableaux (3) Caractéristiques Déclaration Nombre de dimensions 1D (vecteur) 52 Syntaxe valeurs 5,5 12,5 9,0 0,0 ... indices 0 1 2 3 ... 2D (matrice) = tableau de tableaux 0 indices de lignes (dans chaque dimension) indice max. ou indices min. et max. éventuellement modifiable – En donnant l'indice maximal et le type des éléments : Dim nomVar(indMax) [As type] indices de colonnes 0 1 2 n-D (hypervolumes) Taille(s) Vecteur 0 255 – En donnant explicitement les indices minimal et maximal Dim nomVar(indMin To indMax) [As type] 0 1 0 0 255 2 0 255 255 3 255 255 255 4 0 127 0 ... ... ... ... Matrice Dim nomVar(indMax1,indMax2) [As type] Dim nomVar(indMin1 To indMax1, indMin2 To indMax2) [As type] Remarque : possibilité d'utiliser la notation suffixée Dim nomVarSuffixe(indMax) Dim nomVarSuffixe(indMin To indMax) 53 54 VBA avancé – Tableaux (4) VBA avancé – Tableaux (5) Déclaration (suite) Utilisation Remarques Stockage d'une valeur Indice minimal dans un vecteur nomVar(indice) = valeur – par défaut : 0 – fixé à 1 avec Option Base 1 dans section (Déclarations) dans une matrice Nombre d'éléments : dépend des indices et d'Option Base Dim Dim Dim Dim Option Base 0 Option Base 1 Déclaration Nb élts LBound(t) UBound(t) Nb élts LBound(t) UBound(t) t(3) As … 0 3 3 1 3 4 t(2 To 3) As … 2 2 3 2 2 3 t(2,3) As … 12 0 2 6 1 2 t(0 To 2,5) As … 18 0 2 15 0 2 Retrouver les limites des indices nomVar(indice1, indice2) = valeur Rem.: les indices doivent être compris dans les limites ! Parcours d'un vecteur For i=LBound(t) To UBound(t) | ... Next i – LBound(t) donne l'indice minimal, UBound(t) l'indice maximal – Préciser éventuellement la dimension : LBound(t,2) d'une matrice For i=LBound(t,1) To UBound(t,1) | For j=LBound(t,2) To UBound(t,2) | | ... | Next j Next i Passage en paramètre : utiliser le type Variant 55 VBA avancé – Tableaux (6) 56 VBA avancé – Tableaux (7) Exercices Tableau dynamique Écrire une fonction inputColor() qui Utilité : tableau dont la taille demande à l'utilisateur de saisir 3 valeurs dans [0, 255] est inconnue lors du codage n'est déterminée que lors de l'exécution – dans un premier temps, sans tester la validité de la saisie – dans un 2ème temps, en s'assurant que la valeur est dans [0, 255] Exemples retourne ce triplet de valeurs dans un vecteur Stockage de valeurs numériques dans un tableau, avec un nombre de valeurs spécifié par l'utilisateur Écrire une procédure affColor() qui prend en paramètre un vecteur 3x1 représentant une couleur affiche cette couleur dans une boîte de message Dim nbVal As Integer nbVal = InputBox("Nb de valeurs :") Dim tabVal(nbVal) Ex. Call affColor(Array(127,0,255)) Tester la fonction inputColor() grâce à la procédure affColor() Fonction retournant le tableau des mots contenus dans une phrase paramètre 57 VBA avancé – Tableaux (8) 58 VBA avancé – Tableaux (9) Tableau dynamique (suite) Tableau dynamique (exemple) Syntaxe Stockage de valeurs numériques dans un tableau, avec un nombre de valeurs spécifié par l'utilisateur Déclaration d'un tableau sans spécifier sa taille Dim nomVar() [As type] Redimensionnement dynamique (en fonction des besoins) Dim i As Integer Dim nbVal As Integer Dim tabVal() As Double ReDim [Preserve] nomVar(indMax) [As type] Remarques – plusieurs redimensionnements successifs possibles – taille réduite ⇒ éléments supplémentaires perdus – le type des éléments n'est en général pas modifié (As type omis) nbVal = InputBox("Nb de valeurs :") ReDim tabVal(1 To nbVal) 'Toujours des Double For i = 1 To nbVal tabVal(i) = InputBox("Valeur :") Next i – Preserve » conserve les valeurs existantes » ne modifie pas le nombre de dimensions » ne permet de redimensionner que la dernière dimension 59 60 VBA avancé – Tableaux (10) VBA avancé – Exercices récapitulatifs (1) Tableau (exercices) Écrire et tester Une fonction deviner(…) qui fait deviner un nombre compris entre 0 et son paramètre, en guidant l'utilisateur ("plus petit", "plus grand") et en retournant le nombre d'essais nécessaires à la fin du jeu. Utiliser Randomize et Rnd pour générer un nombre aléatoire. Écrire une procédure affMots() qui affiche un tableau de mots dans une boîte de dialogue Ex. Call affMots(Array("Salut","à","tous")) une fonction tabContient() qui teste si un tableau contient une valeur donnée Ex. print tabContient (Array(1,2,3), 2) Ex. print tabContient (Array(1,2,3), 4) Une procédure multiplication2(…) qui affiche dans une boîte de message la table de multiplication (de 1 à 10 fois) de tous les chiffres compris entre ceux donnés en paramètres. Vrai Faux une fonction tabUnique() qui retourne un tableau dédoublonné Ex. Call affMots(tabUnique(Array("t","o","t","o"))) Transformer la fonction prems() pour qu'elle retourne le tableau des n premiers mots d'une phrase Ex. Call multiplication2(3,5) 61 62 Objets Excel – Notions d'objets (1) Objet Description : entité (concrète ou abstraite) définie par ses caractéristiques (propriétés = « variables ») son comportement (méthodes = « fonctions ») Les objets ayant des caractéristiques communes et même comportement forment une classe (« type ») Exemples Concret – chaise { nb pieds, couleur, matériau, déplacer(), empiler() } – ordinateur { fréquence µP, prix, démarrer(), arrêter() } Abstraits – nombre complexe { Re, Im, abs(), conj() } – fenêtre graphique { position, taille, déplacer(), fermer() } 63 Objets Excel – Notions d'objets (3) Objets Excel – Notions d'objets (4) Objets Excel principaux Propriété Workbook Classeur (ouvert dans Excel) Collection Workbooks = ensemble des classeurs ouverts Cas particulier : ActiveWorkbook = classeur actif Worksheet Feuille de calcul (d'un classeur) Collection Worksheets = ensemble des feuilles d'un classeur Cas particulier : ActiveSheet = feuille active Range Plage de cellules (d'une feuille de calcul) Rem. Éventuellement réduite à une seule cellule Cas particuliers : ActiveCell = cellule active, Selection 65 Description : caractéristique d'un objet Accès par notation pointée : Objet.Propriété Exemples Nom du classeur actif : ActiveWorkbook.Name Nom complet du classeur actif : ActiveWorkbook.FullName Sauvegarde du classeur actif effectuée ? : ActiveWorkbook.Saved Nombre de classeurs ouverts : Workbooks.Count Nombre de feuilles du classeur actif : Worksheets.Count Nom de la feuille active : ActiveSheet.Name Adresse de la cellule active : ActiveCell.Address Valeur de la cellule active : ActiveCell.Value Nombre de cellules sélectionnées : Selection.Count 66 Objets Excel – Notions d'objets (5) Objets Excel – Notions d'objets (6) Propriété (suite) Méthode Lecture dans une variable Description : action applicable sur (ou réalisable par) un objet Accès par notation pointée : Objet.Méthode[(params)] Exemples Si la propriété est une valeur simple (chaîne, nombre, ...) nomVar = Objet.Propriété Si la propriété est elle-même un objet Set nomVar = Objet.Propriété Sauvegarde du classeur actif : ActiveWorkbook.Save Fermeture du classeur actif : ActiveWorkbook.Close Fermeture du classeur actif en enregistrant les modifications : Écriture (modification de la propriété) Objet.Propriété = valeur ActiveWorkbook.Close(True) Attention : impossible si la propriété est en lecture seule Ouverture d'un classeur : Workbooks.Open("Toto.xls") Suppression de la feuille active : ActiveSheet.Delete Effacement de la cellule active (valeur) : ActiveCell.ClearContents Suppression de la cellule active avec décalage vers la gauche : Exemples nomClasseur$ = ActiveWorkbook.Name Set cellulesNonVides = ActiveSheet.UsedRange ActiveCell.Value = Date() ActiveCell.Address = "$A$2" est impossible ActiveCell.Delete(xlShiftToLeft) 67 68 Objets Excel – Notions d'objets (7) Collection Description Ensemble d'objets (items) de même classe La classe définit (en général) le nom de la collection Ex. : Workbooks, Worksheets, CommandBars, ... Chaque item porte un nom (clé) et un numéro Accès à un item par son nom. ou : par son numéro Ex. : Ex. : Worksheets("Feuil1") Worksheets(2) Propriétés nombre d'items dans la collection : propriété Count Ex. : Worksheets.Count 69 Objets Excel – Notions d'objets (9) Objets Excel – Range (1) Exercices Définition Dans la fenêtre Exécution, Description : plage de cellule(s) d'une feuille de calcul afficher le nom du classeur courant afficher le chemin du classeur courant afficher le nom de la première feuille du classeur courant activer la dernière feuille du classeur courant afficher l'adresse de la plage utilisée sur la feuille active Pas forcément sélectionnées, ni valuées, ni contiguës Éventuellement réduite à une seule cellule Exemples ActiveCell Écrire et tester les procédures ajouteUn() qui ajoute 1 à la valeur de la cellule active si celle-ci est numérique feuillesConcat(…) qui concatène un suffixe au nom de toutes les feuilles du classeur actif Selection ActiveCell 71 Selection Range("D13:E14") 72 Objets Excel – Range (2) Objets Excel – Range (3) Création et parcours : l'essentiel Création à partir d'autres plages Création Comment obtenir ... Propriétés particulières une seule cellule d'une plage ou plage.Cells(numCell) une sous-plage en ligne ou en colonne Propriété (globale) Range de la feuille active numCol=2 ou plage.Columns(numCol) une plage spécifiée par décalage Parcours (ex.) numLig=1 numCol=2 plage.Offset(numLig,numCol) Dim plage As Range, cellule As Range Set plage = Selection For Each cellule in plage Debug.print cellule.Value Next cellule une plage union de plusieurs autres plages Union(plage1,plage2,…) la plage entourant une autre plage plage.CurrentRegion A A A A A A A A A A A A A A A A 73 Objets Excel – Range (4) 74 Objets Excel – Range (5) Propriétés principales Méthodes principales par ordre d'importance décroissante Type Description Type de plage 1 cellule unique Valeur de la cellule Dépend du contenu Value Plusieurs cellules Valeur des cellules Variant (tableau) Address 1/+ cellules Adresse Excel String Count 1/+ cellules Nombre de cellules Long 1 cellule unique Formule de la cellule String Formula Plusieurs cellules Formules des cellules Variant (tableau) Row, Column 1/+ cellules n° première ligne, colonne Long Font 1 cellule unique Attributs de police Font Interior 1 cellule unique Intérieur (fond, etc.) Interior Height, Width 1/+ cellules Hauteur, Largeur Double Next, Previous 1 cellule unique Cellule suivante, préc. Range (1 cellule) numLig=2 plage.Rows(numLig) – en utilisant l'adresse (absolue/relative) : Range(adresse) : Range(nom) – en utilisant un nom de plage défini Propriété numLig=2 numCol=2 numCell=6 plage.Cells(numLig,numCol) : ActiveCell, Selection – propriétés globales – propriété d'objet Worksheet : feuille.UsedRange par ordre d'importance décroissante Lect /écr. Méthode [(params)] Select ClearContents Clear Activate Delete(décalage) Insert(décalage) Copy, Cut SpecialCells(type) Find(quoi) Replace(quoi,par) Sort L+E L L L+E L L... L... L+E L... Type de plage 1/+ cellules 1/+ cellules 1/+ cellules 1 cellule unique 1/+ cellules 1/+ cellules 1/+ cellules 1/+ cellules 1/+ cellules 1/+ cellules 1/+ cellules Description Sélectionne les cellules Efface les formules Efface tout (formules, format, ...) Activation d'une cellule de la sélection Supprime les cellules en décalant les voisines Insère des cellules en décalant les voisines Copie ou Coupe les cellules Retourne des cellules spéciales (Range) Recherche une information Remplace une chaîne par une autre Trie les valeurs (selon une colonne, ...) 75 Objets Excel – Range (6) 76 Objets Excel – Range (7) Exemples et exercices Parcours Exemples Rappel : utilisation d'une boucle For Each Écrire les procédures Sélectionner la cellule B2 (de la feuille active) Range("B2").Select en affichant simplement les valeurs des cellules dans la fenêtre Exécution Effacer la plage utilisée dans la feuille active ActiveSheet.UsedRange.Clear testParcours() pour conclure sur le sens de parcours Activer la dernière cellule de la sélection parcoursCols() parcourant la sélection en colonnes Selection.Cells(Selection.Count).Activate parcoursCols2() utilisant des boucles For cette fois Écrire et tester les procédures Écrire les procédures ajusterSél() qui étend (ou restreint) la sélection à la plage de ajouteUnATout() qui ajoute 1 à toutes les cellules numériques de la cellules non vides dans laquelle elle est incluse (ou qu'elle inclut) échange() qui permute les valeurs des cellules sélectionnées si elles sont au nombre de 2 selectLigne() qui sélectionne les lignes complètes de la plage sélectionnée (utiliser la propriété EntireRow) sélection 77 effacer1() qui efface une cellule sur m dans la colonne B (à partir de B1) jusqu'à rencontrer une cellule vide effacer2() qui efface, dans la sélection, une cellule sur m en lignes et une sur n en colonnes 78