Enregistreur : déplacements absolus et relatifs

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

L'enregistreur de macros est bien sympathique, mais nous allons constater que parfois, il se comporte de manière apparemment étrange : il ne semble pas se déplacer parmi les cellules comme on s'y attend. Que se passe-t-il ? Ce sont les références absolues et relatives qui sont dans le coup !

Une première macro "ListeChiffre"
Déplacements absolus
Utilisation de références relatives

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

Une première macro "ListeChiffre"

Je présume que vous êtes bien dans votre fichier habituel Excel.

Cliquez dans une cellule : disons B5. Lancez l'enregistreur de macros (Outils/Macros/Nouvelle Macro : ListeChiffre, dans Ce Classeur). Ecrivez Un, tapez sur la touche <ENTER>, tapez "Deux", <ENTER>, Trois, <ENTER>, et arrêtez la macro.
Maintenant, placez vous ailleurs, disons en D2, et lancez cette macro ListeChiffre (Alt-F8). Regardez comme c'est étrange, on dirait qu'il n'a écrit que Un, et pas les deux autres chiffres...

On peut effectivement se gratter la tête un sacré moment pour comprendre pourquoi il n'a pas tout pris en compte. Nous allons maintenant mieux comprendre. Commencez par effacer toute la feuille (CTRL-A, et Menu Edition/Effacer/Tout). N'appuyez pas simplement sur la touche DELETE, parce que le fond jaune de la cellule B2 ne disparaitrait pas.

Déplacements absolus

Maintenant, cliquez dans une autre cellule, disons C1. Lancez à nouveau la macro ListeChiffre. Regardez ce qui s'est passé:

Il écrit bien Un là où vous étiez, mais il a ensuite sauté sur B6 pour écrire Deux, et en dessous : Trois. Il s'est passé que lorsque nous avons enregistré notre macro à la base, nous étions dans la cellule ... B5. Et lorsque nous avons fini d'écrire Un, nous avons appuyé sur <ENTER>, mais L'enregistreur n'a pas compris "Descend d'une cellule", mais "Va en B6". Eh oui ! Et ensuite écris Deux, et va en B7, et écris Trois.

La métaphore du commis de cuisine

Comme vous le constatez, L'enregistreur de macro se comporte vraiment comme un "militaire borné". Il n'a aucune intuition ! Pour donner une image parlante, imaginez que vous êtes un cuisinier, et que vous apprenez à un nouveau commis à éplucher des pommes de terre. Vous vous placez à côté de lui, et vous tendez le bras pour prendre une patate dans le saladier devant vous. Le commis tend aussi le bras pour prendre une patate dans son propre saladier. Vous prenez la patate et l'épluchez doucement. Il vous regarde, prend la patate et l'épluche doucement.

Maintenant, si vous prenez une 2ème patate, mais que dans le saladier du commis, il y a par exemple une banane, il va prendre la banane sans sourciller et tenter de l'éplucher comme une patate, bêtement ! Si vous toussez, le commis va tousser aussi (à chaque patate), et lorsque le saladier est vide, ce commis idiot va simplement faire semblant de prendre une patate et s'éplucher les doigts !

Gardez à l'esprit que l'enregistreur de macro est aussi bête que ce commis de cuisine ! Vraiment !!!

Utilisation de références relatives

Maintenant, comment peut-on lui dire qu'il ne doit pas se déplacer de manière "absolue", mais "relativement par rapport ou il était". C'est à dire que quand on appuie sur <ENTER>, ou <FLECHE BAS>, il doit se déplacer d'une cellule vers le bas ?

Placez-vous dans une cellule, disons A3. Enregistrez une nouvelle macro : ListeChiffre2. Maintenant, regardez la petite barre d'outils "Arrêter l'enregistrement". Il y a une petite icône au dessus du carré bleu.

Cliquez dessus

Ca ne fait rien, ça change juste sa couleur pour donner l'impression que ce bouton est "enfoncé"

Mais le fait d'avoir "allumé" ce bouton, l'enregistreur va mieux comprendre les déplacements.

Ecrivez Un, <ENTER>, Deux, <ENTER>, Trois, <ENTER>, et arrêtez la macro.
Maintenant, placez-vous sur une autre cellule, disons C4, et lancez la macro. Cette fois, la macro se comporte comme on s'y attendait.

Que nous soyons bien d'accord . ce n'est pas forcément MIEUX d'avoir l'icône enfoncée, tout dépend ce que vous désirez faire. Il s'agit souvent d'écrire du texte à des emplacemens fixes, auquel cas il faut évidemment ne pas allumer ce bouton..

Attention : Lors de l'enregistrement de votre prochaine macro, Excel se souviendra si cette icône était allumée ou éteinte, et la laissera dans le même état. Ca peut parfois jouer des tours.

Attention encore : Il arrive fréquemment qu'on commence à enregistrer une macro, et qu'on oublie de l'arrêter, et l'on continue à travailler comme si de rien n'était. Au bout d'un moment, comme on peut le deviner, Excel va simplement se planter, et vous serez bon pour redémarrer Excel... Le conseil du jour, c'est : SAUVEGARDEZ REGULIEREMENT votre travail !

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

L'enregistreur de macro est certes simple et sympathique, mais il est quelque peu borné. Par défaut, il ne comprend pas que la touche <ENTER> (Ou les touches fléchées du clavier) descend d'une cellule (ou se déplacent d'une cellule vers la droite, la gauche ou même le haut le cas échéant), mais il mémorise bêtement les références absolues des cellules dans lesquelles il se trouve.
L'icône "Référence relative" est une icône qui s'enfonce simplement et qui informe l'enregistreur qu'il faut, jusqu'à ce qu'on reclque sur ce même bouton, enregistrer les déplacements RELATIVEMENT à la place ou on se trouve.

1. Qu'est ce qui est préférable : enfoncer le bouton référence relative ou pas ?

L'enfoncer est mieux
Evitez de l'enfoncer, sauf cas exceptionnels
Ca dépend des cas

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

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

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

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

2. Je suis dans la cellule Z665. J'enregistre une macro, mais je n'enfonce pas le bouton "Référence relative". J'appuie sur la touche du clavier <Flèche Gauche>, j'arrête la macro. Je me place sur la cellule C6, et je lance la macro que je viens donc d'enregistrer :

Il me place sur la cellule B6
Il me place sur la cellule C7
Il me place sur la cellule Y665
Il ne se déplace pas

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

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

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

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

3. Je suis dans la cellule Z665. J'enregistre une macro, ET J'ENFONCE le bouton "Référence relative". J'appuie sur la touche du clavier <Flèche Gauche>, j'arrête la macro. Je me place sur la cellule C6, et je lance la macro que je viens donc d'enregistrer :

Il me place sur la cellule B6
Il me place sur la cellule C7
Il me place sur la cellule Y665
Il ne se déplace pas

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

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

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

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

4. Il est possible de commencer une macro avec l'enregistreur, et enfoncer le bouton Référence Relative, écrire des choses dans des cellules, et réappuyer sur le bouton pour l'éteindre, et, encore après ça, se déplacer dans d'autres cellules, et y écrire d'autres choses avant d'arrêter la macro.

Bien sûr. Mais il faut être attentif à ce qu'on enregistre
Non
Oui, mais juste une fois

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

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

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

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

Ce schéma suppose que vous étiez dans la cellule A1 au moment de l'exercice :

Dans un nouveau classeur, que vous nommerez "Exercice leçon 3.XLS", créer une macro "Deplacement"
- Ecrire Abricot dans la cellule ou vous vous trouvez
- Se déplacer d'une cellule vers le bas et une cellule vers la droite
- Ecrire Artichaut
- Se déplacer de DEUX cellules vers le bas et UNE cellule vers la droite
- Ecrire Mandarine
- Se placer sur la cellule A8
- Ecrire Manivelle
Téléchargez la solution de l'exercice ici