Première analyse d'une macro

Vous pouvez télécharger ici la version de Cours.XLS de la leçon précédente

Nous allons ici regarder d'un peu plus près ce que l'enregistreur de macros fait. Nous allens jeter un oeil rapide sur la structure générale d'une macro : comment elle commence, comment elle se termine et comment y ajouter des commentaires.

Sommaire

Créons deux macros de test
Sub et End Sub
Insertions de commentaires
Rendez votre code lisible
Première analyse d'instructions VBA
Approximations de l'enregistreur de macro
Comparaison du code entre les références absolues et relatives

Résumé de la leçon
Avez-vous bien compris ?
Exercice

Créons deux macros de test

Une fois que vous avez téléchargé le classeur de la leçon précédente, nous allons commencer par créer deux macros. effacez le contenu de la feuille.

La première :

La deuxième :

Allez dans l'environnement VBA, et ouvrez Module4 :

Pour une raison que j'ignore complètement, lorsque vous enregistrez de nouvelles macros :
  - soit il crée un nouveau module et l'installe dedans
  - soit il l'ajoute dans un module existant.
Par exemple, chaque fois que nous avons enregistré une macro jusque là, il a créé Module1, Module2 et Module3, et cette fois, il a décidé de placer les deux nouvelles macros dans un seul nouveau module : Module4.
Je dis ça parce qu'il est possible que chez vous, le comportement de VBA sur ce point peut différer, et vous vous retrouvez avec des modules quelque peu différents (Ce n'est pas une question de version d'Excel).

Sub et End Sub

Chaque macro commence par Sub, un espace, le nom de la macro qui ne peut pas comporter d'espace (Sub Belle Macro 1 donnerait une erreur), deux parenthèses, le code VBA, et se termine par End Sub.

Sub BelleMacro1()
  '
  ' BelleMacro1 Macro
  ' Macro enregistrée le 03.09.2005 par M
  '
  '
  ActiveCell.FormulaR1C1 = "Banane"
  Range("C3").Select
  ActiveCell.FormulaR1C1 = "Orange"
  Range("C4").Select
End Sub

Sub BelleMacro2()
  '
  ' BelleMacro2 Macro
  ' Macro enregistrée le 03.09.2005 par M
  '
  '
  ActiveCell.FormulaR1C1 = "Poire"
  ActiveCell.Offset(1, 2).Range("A1").Select
  ActiveCell.FormulaR1C1 = "Prune"
  ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Insertion de commentaires

A l'intérieur de ces macros, constatez que certaines lignes sont écrites en vert. Ce sont des commentaires, c'est à dire que dans le code VBA, lorsque vous commencez une ligne par le signe apostrophe ('), la ligne s'écrit en vert (plus précisément, elle s'écrit en noir, et devient verte quand on change de ligne avec ENTER, ou les touches fléchées du clavier.

Sub BelleMacro1()
 '
 ' BelleMacro1 Macro
 ' Macro enregistrée le 03.09.2005 par M
 '
 '

  ActiveCell.FormulaR1C1 = "Banane"
  Range("C3").Select
  ActiveCell.FormulaR1C1 = "Orange"
  Range("C4").Select
End Sub

Ces commentaires sont censés éclaircir le code. Lorsque VBA voit des lignes commençant par un apostrophe, il les ignore purement et simplement. Mais pour le programmeur, il est indispensable de se placer ainsi des pense-bête dans son code, parce que pour l'instant, nous créons des petites macros de quelques lignes, mais quand vous créerez des macros de 3 pages, et que vous remettez le nez dedans 6 mois après, si vous n'avez pas commenté le code, je ne vous explique pas le malaise pour re-comprendre ce que vous avez pondu 6 mois avant !

Commentaires automatiques

D'ou viennent les commentaires qu'il aposé ? Simplement de la boîte de dialogue juste avant d'enregistrer votre macro.

Et d'ou vient le "M" ? C'est lors de l'installation d'Excel, il demande votre nom. J'ai répondu M, et on peut en changer en allant (Dans Excel) dans le menu Outils/Options/Onglet : Général, et dans le champ "Nom d'utilisateur".

Rendez votre code lisible

Ces commentaires insérés automatiquement ne sont pas très utiles. Je vous propose de les effacer pour vous retrouver avec ce code-ci :

Sub BelleMacro1()
  ActiveCell.FormulaR1C1 = "Banane"
  Range("C3").Select
  ActiveCell.FormulaR1C1 = "Orange"
  Range("C4").Select
End Sub

Sub BelleMacro2()
  ActiveCell.FormulaR1C1 = "Poire"
  ActiveCell.Offset(1, 2).Range("A1").Select
  ActiveCell.FormulaR1C1 = "Prune"
  ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

La ligne vide entre End Sub et Sub BelleMacro2 n'est pas obligatoire, c'est juste pour aérer un peu l'écriture.

Les espaces à gauche (Dans le cadre rouge) ne sont pas obligatoires non plus, c'est aussi pour rendre le code plus clair. Ca permet de mieux visualiser plus facilement les Sub et End Sub.

Cette manière d'avancer un peu les lignes de code porte le doux et poétique nom d'indentation.

Comparez avec un code pas du tout indenté ni aéré :

Sub BelleMacro1()
ActiveCell.FormulaR1C1 = "Banane"
Range("C3").Select
ActiveCell.FormulaR1C1 = "Orange"
Range("C4").Select
Sub BelleMacro2()
ActiveCell.FormulaR1C1 = "Poire"
ActiveCell.Offset(1, 2).Range("A1").Select
ActiveCell.FormulaR1C1 = "Prune"
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Vous voyez comme c'est confus ? Avez-vous remarqué qu'il manque le End Sub de Sub BelleMacro1() ? Ce sont des oublis courants quand on ne soigne pas la présentation.

Première analyse d'instructions VBA

Regardons enfin les lignes importantes. Prenons la première ligne de la première Macro :

Sub BelleMacro1()
  ActiveCell.FormulaR1C1 = "Banane"
  Range("C3").Select
  ActiveCell.FormulaR1C1 = "Orange"
  Range("C4").Select
End Sub

Sans connaître un seul mot de programmation, que fait cette première ligne ? Comme nous venons de l'enregistrer, la tâche est d'autant plus aisée. Il parle d'ActiveCell, de formulaR1C1 et d'une banane. ActiveCell, qu'est ce que c'est ? La cellule active ? C'est quoi la cellule active ? C'est en fait simplement la cellule dans laquelle vous vous trouviez lorsque vous avez lancé l'enregistrement de la macro.

Ensuite, qu'est ce que c'est que ce FormulaR1C1 ? Il écrit une fomule "Banane" ? Non, on se rappelle que nous avons simplement écrit Banane. Cette ligne écrit donc simplement Banane dans la cellule courante. Pourquoi Banane est il entre guillemets ? Parce que c'est du texte. Le texte est toujours entre guillemets.

Approximations de l'enregistreur de macros

Maintenant pourquoi n'a-t-il pas écrit ActiveCell.Ecrire = "Banane", ou en anglais ActiveCell.Write = "Banane", ça c'est inhérent au langage VBA. On écrit FormulaR1C1, et on ne discute pas !!! Non mais !!! Après tout, pourquoi, en français, doit-on mettre un x au pluriel de Chou, genou, hibou ou caillou et pas un s ? On ne le sait pas non plus.

Maintenant, je ne sais pas si vous vous êtes déjà amusé à traduire un texte en anglais vers le français avec un programme automatique, ça donne des résultats assez cocasses !

Par exemple, le proigramme de traduction gratuit de Google Traduit : Par
New Orleans Times-Picayune printed an open letter to President Bush, urging him to fire FEMA Director Mike Brown for his inept response Temps-Picayune de la Nouvelle-Orléans ont imprimé une lettre ouverte au Président Bush, l'invitant à mettre le feu à directeur de FEMA Mike Brown pour sa réponse déplacée

Si ça vous intéresse, la page de traduction de Google est ici.

De la même manière, rappelez-vous toujours que l'enregistreur de macro, tout comme un traducteur linguistique fait ce qu'il juge bon, mais ce n'est qu'un système simple. Aussi, sachez déjà que Les lignes suivantes donnent le même résultat dans notre exemple:

ActiveCell.FormulaR1C1 = "Banane"

Activecell.Value = "Banane"

ActiveCell = "Banane"

Maintenant, jetons un oeil sur la ligne suivante :

 Range("C3").Select

Cette fois, vous ne devriez pas avoir beaucoup de peine à deviner ce qu'il fait : Il sélectionne la cellule C3, comme si vous aviez cliqué dedans. Mais pourquoi C3 ? Rappelez-vous : quand nous avons enregistré BelleMacro1, nous étions dans la cellule A2. Nous avons écrit Banane, et nous avons appuyé sur <ENTER>, ce qui a eu pour conséquence directe de nous placer sur la cellule A3, et nous avons appuyé deux fois sur flèche droite du clavier, ce qui nous a envoyé dans ... C3 ! En d'autres mots, comme si nous l'avions sélectionnée.

Et maintenant, le reste de la macro ne nécessite pas vraiment d'explications supplémentaires :

Sub BelleMacro1()
  ActiveCell.FormulaR1C1 = "Banane"
  Range("C3").Select

  ActiveCell.FormulaR1C1 = "Orange"
  Range("C4").Select
End Sub

On écrit Orange dans la cellule active, donc C3. On appuye sur <ENTER>, donc on sélectionne C4, et on conclut la macro avec l'indispensable End Sub.

Comparaison du code entre les références absolues et relatives

Et ces références de cellules absolues (C3 et C4), c'est simplement parce que vous n'avons pas utilisé l'icône de déplacement relatif : . Mais justement, comparez BelleMacro1 et BelleMacro2 ou nous avons utilisé cette icône :

Sub BelleMacro1()
  ActiveCell.FormulaR1C1 = "Banane"

  Range("C3").Select
  ActiveCell.FormulaR1C1 = "Orange"
  Range("C4").Select
End Sub

Sub BelleMacro2()
  ActiveCell.FormulaR1C1 = "Poire"
  ActiveCell.Offset(1, 2).Range("A1").Select
  ActiveCell.FormulaR1C1 = "Prune"
  ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Range("C3").Select est remplacé par ActiveCell.Offset(1, 2).Range("A1").Select. Que veut dire Offset ? C'est un terme d'imprimerie qui veut dire Décalage. C'est à dire que depuis la cellule active (ActiveCell), je me décale de 1 cellule vers le bas (C'était la touche ENTER), et 2 cellules vers la droite (Les deux touches Flèche droite).

Maintenant pourquoi n'écrit-il pas ActiveCell.Offset(1, 2).Select au lieu de ActiveCell.Offset(1, 2).Range("A1").Select ? Il s'agit là de particularités liées à VBA qu'il serait un peu fastidieux de développer ici maintenant. Sachez juste que ActiveCell.Offset(1, 2).Select fonctionnerait pareillement.

Vous pouvez télécharger ici Cours .XLS tel qu'il devrait être à la fin de cette leçon

Nous avons constaté que VBA est un langage qui ressemble un peu a de l'anglais, qui comporte quelques bizarreries, mais qui, dans l'ensemble est assez logique. Nous avons vu la différence fondamentale qu'il y a entre les références absolues et relatives.
Et surtout, constatez que le vocabulaire VBA s'acquiert rapidement. Vous avez appris : Sub, End Sub, ActiveCell, Range, Select, FormulaR1C1, ainsi que la manière d'insérer des commentaires.

1. Par quoi commence obligatoirement une ligne de commentaires ?

Par rien
Par une apostophe
Par une double apostrophe
Par une apostophe au début, et une autre à la fin de la ligne
Par autre chose

Warning: Undefined variable $Q1 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 332

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 332

Warning: Undefined variable $Q1 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 333

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 333

2. Que fait cette ligne : Range("IV65536").FormulaR1C1 = "A1"?

Une erreur
Elle écrit A1 dans la cellule IV65536
Elle écrit IV65536 dans la cellule A1
Elle se place sur la cellule A1
Autre chose

Warning: Undefined variable $Q2 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 351

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 351

Warning: Undefined variable $Q2 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 352

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 352

3. Combien y a-t-il d'erreurs dans l'instruction suivante ?:
ActivCell,Offset(10101; 99) Select

0
1
2
3
4

Warning: Undefined variable $Q3 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 371

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 371

Warning: Undefined variable $Q3 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 372

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 372

4. Comment décririez-vous l'instruction suivante ?
ActiveCell.Select

Inutile
Très judicieuse
Génératrice d'erreur

Warning: Undefined variable $Q4 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 388

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 388

Warning: Undefined variable $Q4 in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 389

Deprecated: strspn(): Passing null to parameter #2 ($characters) of type string is deprecated in /home/clients/a41d66f74bcbcbdeacff232fbcd0dcfe/web/vbvba/cours/lecon005/lecon005.php on line 389

Dans votre classeur de cours, dans un module quelconque (Dans mon cas, je la place dans Module4), écrivez une macro que vous appelerez ExerciceLecon5. Cette Macro devra faire ceci :

C'est à dire écrire Vive B2 dans B2, J'aime B4 dans B4, B6 est le meilleur dans B6, et finalement replacer le curseur dans la cellule A1.
Solution de l'exercice ici