Monsieur Excel
Pour tout savoir faire sur Excel !

28 juin 2012

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 !


1 Commentaire(s):

  • Bonjour,

    Sympa comme code mais cela fait encore beaucoup de "

    L'objectif est de créer la chaine
    Macro 1 et d'indiquer à Excel ou s’arrête la chaine via les simples quotes 'Macro 1'

    .OnAction = "'Macro " & "1'"

    Arnaud

    By Anonymous Anonyme, sur 9:24 PM  

Enregistrer un commentaire

<< Accueil