Pop-up : une seule exécution...
Dans l’article publié il y a
quatre jours, nous avons constaté que la macro appelée par la commande choisie
dans le menu pop-up s’exécutait deux fois au lieu d’une…
Mon collègue Excel-omane et
ami François Sermier s’est penché sur ce problème et en a tiré les conclusions
suivantes, que j’ai enrichies de mes propres commentaires…
On trouve une réponse sur le forum :
Apparemment, quand on définit
une fonction « OnAction » avec paramètres, on ne peut pas utiliser la
notation classique Macro(param) : il faut obligatoirement
utiliser le passage d'arguments sans parenthèses Macro param. Et, comme cela doit être
inclus dans des guillemets de texte, cela ne marche pas avec le code proposé
dans l’article précédent.
Il faut donc utiliser une
kyrielle de guillemets simples et doubles, comme indiqué dans le forum.
Voici dont les cinq lignes
qui doivent remplacer, dans la macro publiée il y a quatre jours, les cinq
commandes « OnAction » :
.OnAction = "'Macro
""" & 1 & """'"
.OnAction
= "'Macro 2'"
.OnAction
= "'Macro 3'"
.OnAction
= "'Macro 4'"
.OnAction
= "'Macro 5'"
Pour la première ligne, la
formule est plus lourde, mais elle permet de remplacer le « 1 » par
une formule afin de rendre le paramètre réellement modifiable. Pour les macros
2 à 5, l’argument numérique est saisi en dur, mais – du coup – la formule est
plus légère.
Pour améliorer la lisibilité
de la première formule, voici la décomposition, caractère par caractère, de
l’argument utilisé dans la première commande :
Avec ces changements, le menu
pop-up fonctionne parfaitement bien, les macros ne s’exécutant plus qu’une
seule fois chacune.
Pourquoi Excel doublait-il l’affichage
du dialogue ?
On peut imaginer que c’était
dû à la façon dont l'analyseur syntaxique d'Excel (le parser)
analyse la chaîne de caractères passée en argument de la commande « OnAction ». Le
mélange des quotes simples et quotes doubles
tendrait à prouver qu'il s'agit d'un bricolage monté en catastrophe à l’origine
du Visual Basic et que tout ça est en fait assez salopé dans le code original
de Microsoft !
Ou, autre option, à la façon
dont la boucle d’événement gère l’interception du déclenchement de l’événement.
En navigant dans les interrogations des forums, on voit qu’il y a une autre
occasion où l’affichage du dialogue a lieu deux fois, c'est quand on utilise la
propriété Tag du CommandBarButton.
Il est possible que Microsoft utilise ce mécanisme du Tag pour déclencher
le OnAction. Mais allez savoir…
Nous sommes preneurs de
commentaires par des lecteurs ou lectrices qui pourraient enrichir ce
débat !