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
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.
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).
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
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 !
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".
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() |
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.
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