Connaitre quelle marco a appellé telle macro

Bonjour à tous !

Je vous présente les choses :

J'ai une macro 1 et une macro 2 qui appellent toutes les deux à un certain niveau la même macro 3.

Le soucis c'est que je veux que la macro 3 se comporte un tout petit peu différemment selon qu'elle soit appellée par la macro 1 ou la 2.

Le but étant de ne pas faire deux macros quasi semblables, et éviter par la même occasion de passer par une variable globale boolean que je devrai mettre en TRUE dans la macro 1 et FALSE dans la macro 2 et venir la tester sur la macro 3.

Je cherche donc une ligne de code pour tester si l'on est venu dans la macro 3 via la macro 1 ou la 2.

Est ce que c'est possible ?

Merci à vous et joyeux Noël !

Salut le Forum

J'avais en-tête Application.Caller mais je ne suis pas certain à 100 %

Mais il y aussi comme ceci

Sub macro1()
    Call macro3(1)
End Sub

Sub macro2()
    Call macro3(2)
End Sub

Sub macro3(Idx As Byte)
    MsgBox Idx
End Sub

Mytå

Bonjour,

Oui, Application.Caller (je ne peux pas tester) ou utiliser un argument dans la procédure appelée demandant le nom de la macro appelante puis tester cet argument

Bonjour et merci pour vos réponses !

Cependant je n'arrive pas à mettre en place Application.Caller, j'ai pourtant suivi les tutos sur internet mais rien n'y fait. à chaque fois Application.Caller retourne Error 2023 alors que j'ai besoin qu'elle retourne le nom de la macro qui a appelé la macro suivante.

Bonjour,

si tu regardes l'aide sur .Caller tu vois que tu n'est pas dans les cas de fonctionnement.

Utilise la 2nde proposition de myta.

eric

Bonjour,

Application.Caller renvoie selon le cas une donnée String, un objet Range, une valeur d'erreur...

Il faut savoir comment sont lancées tes macros 1 et 2.

Si elles sont affectées à un bouton de formulaire ou un objet Shape, tu récupèreras le nom du bouton ou de l'objet avec cette commande.

Cependant, si cette méthode est fort utile pour affecter la même macro à plusieurs boutons, et détecter au lancement de la macro le bouton appelant pour opérer en conséquence, dans le cas que tu décris, ce n'est pas la méthode la plus logique à appliquer !

Macro1 et Macro2 appellent Macro3 : si l'action de Macro3 doit être différenciée selon l'appel, la distinction se fait par passation d'un argument (qui peut être éventuellement un argument optionnel doté d'une valeur par défaut, ce qui permet dans l'un des cas d'appeler sans argument, le cas étant tout de même distingué...)

Cordialement.

Bonjour,

En effet, je vous donne grossièrement comment fonctionnent mes macros :

Pour la macro 1

*Clique sur le bouton macro 1

sub macro1 ( )

{Bloc d'instruction 1}

macro3.show

End sub

C'est la même chose pour la macro 2 :

*Clique sur le bouton macro 2

sub macro2 ( )

{Bloc d'instruction 2}

macro3.show

End sub

J'aimerai ajouter plus de précision concernant les boutons : Ce sont des boutons mis sur le ruban en haut (j'ai crée un nouvel onglet qui regroupe mes macros). Donc ce ne sont pas des boutons sur la feuille Excel. Les deux boutons lance un formulaire différent.

Aussi, la macro 1 et 2 sont se déclenchent quand on clique sur un certain bouton dans leur formulaire respectifs (la macro 3 est appelée à ce moment là).

Je ne sais pas si j'étais clair...

Bonne journée !

Macro3.Show !!! C'est pas une macro que tu appelles ! Tu ouvres une Userform. Ce n'est pas la même chose !

On a du mal se compendre depuis le début du coup...J'en suis navré ! Est-ce plus clair maintenant ou alors vous avez besoin de plus de précision ?

bonjour,

moi j'utiliserais une variable globale. je ne comprends pas pourquoi tu veux t'en passer.

hoosp a écrit :

On a du mal se compendre depuis le début du coup...J'en suis navré ! Est-ce plus clair maintenant ou alors vous avez besoin de plus de précision ?

Quand tu écris : Macro3.Show, tu utilises la méthode Show appliquée à un Userform nommé "Macro3" !

On n'est donc pas dans la situation d'appel d'une procédure !

Il serait bon de préciser la distinction qui doit intervenir selon que l'appel est fait par Macro1 ou Macro2.

Cordialement.

Disons que c'est ce que je fais en ce moment, mais avec le nombre de variable globale que j'ai créer pour relier tel ou tel fonction, ça commence à faire beaucoup.

C'est vraiment pour des questions de pratique car j'ai l'impression ne pas utiliser une méthode "Clean", j'ai l'impression d'être un peu sous une montagne de variable globale.

Je cherche des methodes differentes qui me feront créer un minimum de variable globale et un minimum de ligne.

variables globales ? Je suppose que tu veux parler de variables publiques ?

Si tu ne confirmes pas que tu ouvres un Userform, et ne répond pas aux questions, je décroche !

Désolé je n'ai pas eu le temps de répondre plus tôt !

Oui, je parle bien des variables publiques, je me suis renseigné apparement global n'existe pas...

En gros pour la première "fonction" :

*J'appuie sur un bouton sur le ruban en haut

Ce bouton lance un Userform 1

*J'appuie sur un bouton dans cet Userform 1

Ce bouton lance un bloc d'instruction et termine par le lancement de l'Userform 3

La deuxième "fonction" :

*J'appuie sur un autre bouton sur le ruban en haut

Ce bouton lance directement l'Userform 3

Quant à l'Userform 3 :

*J'appuie sur un certain bouton dans cet Userform 3

il teste si la "fonction" qui l'a appelée est la première ou la deuxième, et execute un certain bloc d'instruction selon le cas.

J'espère avoir été plus clair !

Merci !

Conclusion :

  • Application.Caller n'est pas utilisable.
  • Le passage d'argument à une procédure non plus (pas de procédure).
  • Reste une variable publique booléenne dans Userform3, que Userform1 (par exemple) initialise à True avant d'ouvrir Userform3.
Le test sur cette variable permettra d'effectuer la procédure adéquate...

- Autre solution éventuelle : si les instructions exécutées dans chacun des cas sont liées à des éléments initialisables de Userform3, cette initialisation peut être alors faite de façon différenciée avant son ouverture, et ne nécessiterait donc aucun élément supplémentaire.

bonjour,

MFerrand :

...cette initialisation peut être alors faite de façon différenciée avant...

Pour reformuler la suggestion de MFerrand :

UserForm3.Tag = "1"
UserForm3.Show

A+

Salut Galopin !

Le Tag est une solution, bien sûr... !

Le tag est la solution que je cherchais !

Merci à vous pour votre aide !

Rechercher des sujets similaires à "connaitre quelle marco appelle telle macro"