Il est de bon ton de se souhaiter la bonne année. Mais vous, et vous seul, pourrez faire en sorte que cette année soit bonne, meilleure que celle qui vient de s'écouler. Apprenez à ne compter que sur vous, car personne n'est plus qualifié que vous-même pour bâtir, réparer ou améliorer votre propre vie. Personne ne fera les choses à votre place. D'ailleurs, tout ce que les autres peuvent faire, c'est souhaiter que vous le fassiez. Et ne croyez pas que tout ceux qui vous entourent vous apporteront des solutions : certains font juste partie de vos problèmes. Transformez vos résolutions en actes, et dans douze mois, retournez-vous et souriez-vous fièrement : C'était long. C'était difficile. Mais ça y est : 2017 était une bonne année, merci Moi.

Que sont les objets ? L'exemple du téléphone portable

VBA (Visual Basic pour Applications) est un langage orienté objets. C'est à dire qu'il fonctionne avec des objets qui ont des propriétés et des méthodes.

Propriétés

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"
TélPortable.Marque = "Samsung"
TélPortable.Poids = 165
TélPortable.StyleOuverture = "Glissière"
TélPortable.Etanche = False ' False = Faux
ActiveCell.Value = "Bonjour"
ActiveCell.Orientation = xlVertical
ActiveCell.HorizontalAlignment = xlRight

Propriété par défaut

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.

Méthodes

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 ActiveCell.Deleted = 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

Paramètres des méthodes

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 :

  1. Le numéro de téléphone (paramètre obligatoire)
  2. Le préfixe international (33 pour la France par exemple - paramètre optionnel)
  3. Le nombre de coups que nous laissons sonner (paramètre optionnel)
  4. Le message que nous laissons en cas de non-réponse (paramètre optionnel)

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 "NoTel", PrefixePays, NbCoups, "Message"

TélPortable.Appelle "079 123.45.67", France, 5, "rappelle-moi quand tu peux" MsgBox "Bonjour", vbYesNo, "Message sympa"

Paramètres par défaut, manquants

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 :

  1. NoTel : Chaîne de caractères (Entre guillemets)
  2. PrefixePays : Variable interne plus simple a mémoriser qu'un chiffre (Pas de guillemets) - on aurait pu écrire 33
  3. NbCoups : Chiffre (pas de guillemets)
  4. Message : Chaîne de caractères (Entre guillemets)

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
TélPortable.Appelle "079 123.45.67",France , , MsgBox "Bonjour", ,

Ces virgules vides permettent des lignes de code plus courtes, mais finissent par nuire à la relecture et la compréhension.

Nommage des paramètres

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"

Objets non précisés

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"

Instructions sur plusieurs lignes

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"

Indexation, numérotation des objets

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)

Cells(2,3)

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"

Sheets("Bureau").Range("E2").AddComment "Ca marche"

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

Worbooks("Ventes mensuelles").Sheets("Janvier").Range("B8").Value

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

Regroupements avec With

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

Comparaison propriétés multiples - méthodes multi-paramétrées

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