Je vais faire une analogie avec un téléphone portable. C'est un objet. Cet objet à plusieurs
propriétés : Par exemple, il est noir. On dit que sa propriété
Couleur = Noir. On l'écrirait : TélPortable.Couleur
= Noir
. Si on voulait l'afficher avec un MsgBox
, on dirait
Exemple du téléphone portable | Exemple réel VBA Excel |
MsgBox TélPortable.Couleur |
MsgBox ActiveCell.Value |
Il afficherait : Noir | Il afficherait la valeur de la cellule dans laquelle vous êtes |
Nous pouvons repeindre ce téléphone... en rose par exemple. Comme ceci :
Téléphone portable | VBA Excel |
TélPortable.Couleur
= "Rose" |
ActiveCell.Value = "Bonjour" |
Msgbox TélPortable.Couleur |
MsgBox ActiveCell.Value |
Nous avons beaucoup de propriétés pour ce téléphone portable : La couleur, La marque, Le poids...
Téléphone portable | VBA Excel |
TélPortable.Couleur
= "Gris" |
ActiveCell.Value = "Bonjour" |
L'une de ces propriétés est utilisée plus fréquemment
que les autres. On l'appelle "la propriété par défaut". Admettons que ce soit la couleur dans le cas du téléphone portable.
Dans le cas de "ActiveCell", c'est la valeur de la cellule.
Téléphone portable | VBA Excel |
TélPortable.Couleur
= "Gris" |
ActiveCell.Value = "Bonjour" |
Nous pourrions nous permettre d'écrire |
|
TélPortable
= "Gris" |
Activecell = "Bonjour" |
Quelle est la différence entre "ActiveCell.Value
" et "ActiveCell.FormulaR1C1
" ?
Dans le cas ou la celulle contient une formule (Par exemple =3+2
), Value
donne 5, mais FormulaR1C1
donne =3+2
.
Ce téléphone portable inclut des "sous-objets" ( l'antenne, les touches, la batterie, ...). Tout en faisant partie intégrante du téléphone portable, ce sont des objets malgré tout "indépendants". On pourrait avoir un téléphone noir avec une antenne grise :
Téléphone portable | VBA Excel |
Objet.SousObjet.Propriété = "Valeur" |
|
TélPortable.Antenne.Couleur
= "Gris" |
ActiveCell.Font.Bold = True |
Nous venons de voir les PROPRIETES.
Maintenant, il y a des METHODES (des actions). Avoir un téléphone portable, c'est bien, mais s'il ne peut rien faire, il est inutile. Nous devons pouvoir l'allumer :
Téléphone portable | VBA Excel |
TélPortable.Allume |
ActiveCell.Delete |
On ne dit pas TélPortable.Allume = Quelque chose
. On dit
juste Allume, c'est tout. On dit que Allume
est une méthode de TélPortable
.
Certaines méthodes et certaines propriétés sont proches, sans faire exactement la même chose. ActiveCell.Delete
n'est pas équivalente à ActiveCell.Clear
Vous pourriez penser que c'est inutile d'avoir des méthodes, et qu'on pourrait utiliser une propriété, comme ceci :
Téléphone portable | VBA Excel |
TélPortable.Allumé = True |
|
Et vous auriez raison. La distinction entre "Propriété" et "Méthode" n'est pas évidente, et même parfois très discutable.
Le plus intéressant avec un téléphone portable
est de pouvoir appeler quelqu'un. Utilisons la méthode "Appelle
" :
Téléphone portable | VBA Excel |
TélPortable.Appelle |
ActiveCell.AddComment |
Mais QUI doit-il appeler ? Nous avons besoin d'un paramètre obligatoire : le numéro de téléphone de notre correspondant. Dans ce le cas d'Excel, nous allons ajouter un commentaire à notre cellule :
Téléphone portable | VBA Excel |
Objet POINT Méthode ESPACE "Paramètre " |
|
TélPortable.Appelle
"079.555.666" |
ActiveCell.AddComment "Beau
commentaire" |
Plusieurs paramètres peuvent (ou doivent) être utilisés :
Appelle
est donc une méthode pourvue de plusieurs paramètres :
Téléphone portable | VBA Excel |
Objet POINT méthode ESPACE Paramètre obligatoire VIRGULE Paramètre optionnel VIRGULE Paramètre optionnel etc. |
|
TélPortable.Appelle
"079 123.45.67", France, 5, "rappelle-moi quand tu peux" |
MsgBox "Bonjour",
vbYesNo, "Message sympa" |
Si on omet les paramètres optionnels, une valeur par défaut sera utilisée (préfixe = 0, Nombre de sonneries : 3, Message répondeur = "")
Les paramètres sont de plusieurs genres :
Si on désire omettre certains paramètres optionnels, on doit mettre des virgules vides. Je veux appeler mon correspondant, en Suisse (préfixe par défaut : 0), je laisse sonner 3 coups (valeur par défaut), mais je veux laisser un message personnalisé :
Téléphone portable | VBA Excel |
TélPortable.Appelle
"079 123.45.67", , ,"Rappelle-moi quand tu peux" |
MsgBox "Bonjour",
, "Message sympa" (le 2ème paramètre omis = juste un bouton Ok, pas d'icône) |
Si les paramètres omis sont à la fin, alors, on ne doit pas mettre de virgule vide :
Téléphone portable | VBA Excel |
|
|
Ces virgules vides permettent des lignes de code plus courtes, mais finissent par nuire à la relecture et la compréhension.
On peut alors nommer les paramètres, et dans ce cas, dans le cas ou on omet certains paramètres, il ne faut plus mettre de virgules vides :
Téléphone portable | VBA Excel |
Objet POINT Méthode ESPACE NomDuParamètre DEUX POINT EGALE "Contenu du paramètre" | |
TélPortable.Appelle
NoTel:="079 123.45.67",Message:="Rappelle-moi quand tu peux" |
MsgBox Prompt:="Bonjour", Title:="Message de bienvenue" |
Msgbox est une méthode, et toute méthode est issue d'un objet. Il n'est pas toujours obligatoire de le préciser : ce sont les objets parents par défaut. Par exemple, je n'ai pas besoin de préciser que le téléphone portable est le mien... Je n'ai même pas besoin de préciser que j'appelle avec mon téléphone. On se doute bien que je ne vais pas téléphoner avec le mouchoir de mon cousin. Ces trois lignes sont équivalentes :
TélPortable.Appelle
"079 123.45.67"
Appelle
"079 123.45.67"
Michel.TélPortable.Appelle
"079 123.45.67"
MsgBox est issu de deux objets parents. Les trois lignes suivantes sont équivalentes :
VBA
.Interaction.MsgBox
"079 123.45.67"
Interaction.MsgBox
"079 123.45.67"
MsgBox
"079 123.45.67"
On peut se retrouver avec des lignes de code très, très longues, comme ceci :
Michel.TélPortable.Appelle
NoTel:="079 123.45.67", PrefixePays:="Grande-Bretagne", NbCoups:=15, Message:="Rappelle-moi avant midi, sinon, laisse moi un SMS pour me dire à quelle heure on se voit demain soir"
On peut scinder cette longue instruction sur plusieurs lignes, en utilisant le trait de soulignement : _ (Il faut mettre un espace juste avant). Il se place après la méthode, et/ou après chaque virgule de séparation des paramètres :
Michel.TélPortable.Appelle
_
NoTel:="079 123.45.67", _
PrefixePays:="Grande-Bretagne", NbCoups:=15, _
Message:="Rappelle-moi avant midi, sinon, laisse-moi un SMS pour me dire à quelle heure on se voit demain soir"
VBA.Interaction.MsgBox _
Prompt:="Pensez-à scanner votre PC à l'antivirus", Buttons:=vbCritical, _
Title:="Message du service informatique"
On peut avoir plusieurs onglets feuilles de calcul avec Excel. Comme on peut avoir plusieurs téléphones portables.
Repeignons en rose le téléphone portable qui est dans ma chambre :
Téléphone portable | VBA Excel |
TélPortables("Chambre").Couleur
= "Rouge" |
Range("B10").Value =
"Bonjour" |
Ils sont d'ailleurs numérotés. dans le cas d'Excel, lorsque nous parlions de la cellule active, nous utilisions ActiveCell
. Lorsque nous parlons de références Ligne-colonne, on passe à Range
, et lorsqu'on numérote, on utilise Cells
.
Téléphone portable | VBA Excel |
TélPortables( 1)TélPortables( 35) |
|
Admettons qu'on aie plusieurs pièces, et plusieurs téléphones portables dans chaque pièce (Tout comme nous avons plusieurs cellules dans plusieurs feuilles).
Appelons le 079 123.45.67, avec le 3ème téléphone du bureau :
Téléphone portable | VBA Excel |
Pièce(Bureau).TélPortable(3).Appelle "079 "123.45.67" |
|
On peut également accéder à des classeurs ouverts de cette manière. Affichons la couleur du téléphone portable du buffet de la cuisine de mon chalet de Morzine.
Téléphone portable | VBA Excel |
Msgbox Chalet("Morzine").Pièce("Cuisine").TélPortable("Buffet").Couleur |
|
Cette syntaxe peut vite devenir lourde. Si nous désirons mettre cette cellule en Gras, Italique et souligné, nous pourrions écrire :
Worbooks("Ventes mensuelles").Sheets("Janvier").Range("B8").font.Bold = True
Worbooks("Ventes mensuelles").Sheets("Janvier").Range("B8").font.Italic = True
Worbooks("Ventes mensuelles").Sheets("Janvier").Range("B8").font.Underline = True
Voici la manière d'écrire plus simplement, grâce à With :
With Worbooks("Ventes mensuelles").Sheets("Janvier").Range("B8").font
.Bold = True
.Italic = True
.UnderLine = True
End With
Comparons la syntaxe d'un objet pourvu de plusieurs propriétés et d'une méthode pourvue de plusieurs paramètres :
Ce code permet de mettre les cellules de B3 à B7, de la feuille "Ventes", en police de caractères ARIAL BLACK, ITALIQUE et en ROUGE (code couleur 255):
Sheets("Ventes").Range("B3:B7").Font.Name = "Arial Black"
Sheets("Ventes").Range("B3:B7").Font.Italic = True
Sheets("Ventes").Range("B3:B7").Font.Color = 255
Rendons ce code plus lisible avec With :
With Sheets("Ventes").Range("B3:B7").Font
.Name = "Arial Black"
.Italic = True
.Color = 255
End With
Dans ce premier exemple, il y a 3 instructions l'une sous l'autre. Dans l'exemple qui suit, il n'y a qu'une seule instruction.
Cet autre code permet de remplacer "Pertes" par "Profits" dans les même cellules, seulement si "Pertes" est le contenu complet de la cellule (xlWhole
), et en différenciant les majuscules des minuscules (MatchCase
):
Sheets("Ventes").Range("B3:B7").Replace What:="Pertes", Replacement:="Profits", LookAt:=xlWhole, MatchCase:=True
Rendons ce code plus lisible grâce au passage à la ligne avec le trait de soulignement :
Sheets("Ventes").Range("B3:B7").Replace _
What:="Pertes", _
Replacement:="Profits", _
LookAt:=xlWhole, _
MatchCase:=True