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. BA. 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

Documents pareils