Détection de clic - identification du bouton

Bonjour à tous,

Sur mon modèle excel, j'ai trois onglets qui ont la même fonction, destinées à trois utilisateurs différents. Une macro est présente dans chaque onglet pour faire un ensemble de tâches identiques mais appliquées à des onglets différents :

Macro onglet A => fait la tâche dans l'onglet D

Macro onglet B => fait la tâche dans l'onglet E

Macro onglet C => fait la tâche dans l'onglet F

Les macros font exactement la même chose, mais à des endroits différents selon le bouton cliqué. Vous voyez où je veux en venir ? J'aimerais faire de ces 3 macros une seule macro propre avec la structure suivante :

Si Bouton A cliqué, faire X,

Si Bouton B cliqué, faire Y,

Si Bouton C cliqué, faire Z,

Sinon End.

Mais je ne vois pas comment faire la déclaration pour identifier les boutons : apparemment on doit faire appel à un booléen c'est ça ?

Vu le nombre de macros déjà présentes, ce sera pas du luxe de réduire la liste en optimisant les codes ^^

Merci pour votre aide !!

Bonjour,

Mets un fichier exemple simplifié.

Soit tu fais appel à Application.caller pour identifier le bouton et ensuite un select case

Soit tu fais 3 macros simples qui renvoient à une macro générique avec paramètre.

Bonjour,

complément à la réponse de Steelson pour Application.caller : le bouton doit être du type Formulaire, pas ActiveX.

eric

Voici 2 exemples ...

148boutons-bis.xlsm (17.45 Ko)
149boutons.xlsm (22.66 Ko)

Bonjour tout le monde !

Merci beaucoup de vos réponses aussi rapides ! Oui, j'ai regardé le Application .Caller, cependant Steelson, quand j'ai voulu ouvrir tes exemples, je n'ai pas vu de macros affichées mis à part le Application.Caller => où est la partir du code qui fait que cliquer sur le bouton X te fait aller sur l'onglet X ? (je débute encore pas mal en vba :-p )

Surtout que les boutons de ton exemple sont bleus ce qui signifie qu'ils sont de type ActiveX non ? Or le Application.Caller ne marche pas avec ceux-là ?

Salut Steelson !

Tu compliques ! Pas besoin de ShapeRange pour un seul Shape...

@Bartoli : si tu renommes tes boutons de façon à en extraire les noms des feuilles (ou leur rang le cas échéant), tu pourras faire un code plus simple. Exemple :

    Sheets(Right(Application.Caller,1)).Select

Cordialement.

Bonjour Bartoli, mes salutations MFerrand

Oui, j'ai regardé le Application .Caller, cependant Steelson, quand j'ai voulu ouvrir tes exemples, je n'ai pas vu de macros affichées mis à part le Application.Caller => où est la partir du code qui fait que cliquer sur le bouton X te fait aller sur l'onglet X ? (je débute encore pas mal en vba :-p )

Le code tient en effet en une seule ligne !!

Sub test()
Sheets(ActiveSheet.Shapes.Range(Array(Application.Caller)).TextFrame.Characters.Text).Select
End Sub

j'aurais même pu mettre en effet

Sub test()
Sheets(ActiveSheet.Shapes(Application.Caller).TextFrame.Characters.Text).Select
End Sub

prends d'ailleurs la solution de MFerrand encore plus simple !! mais elle va exploiter le nom du rectangle, pas son contenu, c'est la différence

Surtout que les boutons de ton exemple sont bleus ce qui signifie qu'ils sont de type ActiveX non ? Or le Application.Caller ne marche pas avec ceux-là ?

le couleur ne veut rien dire puisque cela peut se changer

il s'agit ici d'une forme en effet "shape" et pas d'un bouton de formulaire

Mais, il y a encore plus simple ... si tu n'as qu'un seul bouton par page, alors tu peux exploiter worksheet.name ! et diriger vers la macro ad-hoc

Voici quelque chose plus adaptée à ton cas, quelque soit le type de "bouton" de la feuille ...

Sub MaMacro()

Select Case ActiveSheet.Name
Case Is = "A"
    MsgBox "j'exécute la macro sur la feuille D"
    Sheets("D").Select

Case Is = "B"
    MsgBox "j'exécute la macro sur la feuille E"
    Sheets("E").Select

Case Is = "C"
    MsgBox "j'exécute la macro sur la feuille F"
    Sheets("F").Select

End Select

End Sub

Bien sût il ne s'agit pas de tripler la macro dans chaque "case is", mais de renvoyer vers la macro principale avec le paramètre ad-hoc

43boutons-ter.xlsm (21.27 Ko)

Rebonjour !

Wow ha oui on sent l'expérience là parce que vous me proposez une solution encore plus optimisée que celle que j'ai en tête !

Comme tu l'expliques Steelson, je comptais justement tripler ma macro en la copiant dans chaque Case Is...

En soi, je serai ravi d'utiliser votre solution à paramètres, mais dans ce cas, il faut que je mette une sorte de CHOOSE() en place de chaque cellule / onglet utilisé dans la formule de la macro principale, afin de pouvoir passer d'une cible à l'autre selon les cas, et je ne vois pas par quoi remplacer justement mes cellules et onglets de la sorte.

Pour aller dans le détail, il y a plusieurs boutons par page, dont un seul doit activer ladite macro à paramètres. Aussi je ne peux pas me contenter juste de "tel onglet est actif" comme vérification. En revanche, je peux faire une double vérification en vérifiant à la fois le bouton et l'onglet, mais ce serait inutile pour le coup, puisque les boutons sont nommés.

Je vais déjà analyser vos codes histoire de les comprendre en profondeur avant de continuer ; leur simplicité comparée à ce que je souhaite faire me dépasse pour l'instant, alors je m'y mets.

Merci beaucoup pour d'une part votre rapidité de réponse qui est surprenante, et pour la qualité de vos réponses qui me donne encore plus d'idées pour la suite !

P.S : petite frustration, je ne pourrai pas vous envoyer ledit modèle car c'est pour le travail, donc confidentiel...

EDIT : en fait j'ai tort : même si j'ai plusieurs boutons sur une même page, comme il n'y en a qu'un seul par page qui doit lancer la macro dont on parle, la détection par le nom d'onglet marche en fait, puisque les autres boutons de la page ne lanceront pas la même macro

J'essaye ça d'ici ce soir et je vous dis

Messieurs (dames ?),

Permettez-moi de vous remercier pour toutes vos bonnes idées ! J'ai adapté la macro avec un Select Case, et je n'ai plus que des macros uniques, plus de doublons !

En revanche j'ai repensé à votre idée de macro à paramètre et je n'y parviens pas : je pense que c'est parce que je ne maîtrise pas les statuts des macros (public, private, modules, etc.), ni les relations entre elles (comme faire appel à une macro dans une autre, ou faire appel à un module.

C'est également pour ça que j'ai un mal de chien à faire une barre de progression sur ces macros (mais chaque chose en son temps, il y aura la réponse sur ce forum).

Là pour la fonction à paramètre, j'ai 2 types de paramètres qui entrent en compte : des noms d'onglets et des noms de cellules (parfois des références H8 et parfois des noms "Hache 8").

Il me faudrait déclarer autant de variables qu'il y a de cellules et d'onglets différents à utiliser dans ma macro, ce qui reviendrait à déclarer entre 5 et 15 variables à chaque fois, donc un peu lourd à faire... Mais pour la compréhension du principe, en gros, dois-je déclarer mes variables dans ma macro ou bien dans le Select Case ? Et j'imagine que je dois déclarer la valeur de mes variables dans le select case : mais alors comment faire communiquer "Variable" dans mon Select Case avec "Variable" dans ma macro ?

Il s'agit plus de comprendre ici les relations entre tous ces éléments de VBA que de vous demander une solution pratique ici parce que mon système marche déjà (à vos yeux, il n'est pas optimisé, mais ça marche haha all i need ^^)

Bonne journée !!

Exemple de passage de paramètre

Sub MaMacro()

macroprincipale (ActiveSheet.Name)

End Sub

Sub macroprincipale(nom As String)

Select Case nom
Case Is = "A"
    MsgBox "j'exécute la macro sur la feuille D"
    Sheets("D").Select

Case Is = "B"
    MsgBox "j'exécute la macro sur la feuille E"
    Sheets("E").Select

Case Is = "C"
    MsgBox "j'exécute la macro sur la feuille F"
    Sheets("F").Select

End Select

End Sub

Salut Steelson,

Hum ta structure ici fait que tu répètes l'opération

Case Is X

Sheet("d").Select

Ma macro fait plusieurs dizaines de lignes, en guise du Sheet("d").Select, et avec non pas seulement le "D" en paramètre, mais environ 5 variables différentes, qui prennent des valeurs sur 3 cas possibles chacune.

Je me demandais si on ne pouvait pas avoir une structure de ce type :

Macro principale "MaMacro" :

Dim VAR1 as string

Dim VAR 2 as string

Dim VAR3 as string

Dim VAR4 as string

Dim VAR5 as string

-> code de ma macro avec uniquement les variables citées plus haut.

Puis dans une autre macro, on mettrait le select case comme suit :

Select Case nom

Case Is "A"

Call MaMacro with

VAR1 = "Sheet 1"

Dim VAR 2 = "Sheet 2"

Dim VAR3 = "A24"

Dim VAR4 = "E9:EZ18:"

Dim VAR5 = "Sheet 6"

Case Is "B"

Call MaMacro with

VAR1 = "Sheet 12"

Dim VAR 2 = "Sheet 1"

Dim VAR3 = "B4"

Dim VAR4 = "A9:EZ18:"

Dim VAR5 = "Sheet 2"

Case Is "C"

Call MaMacro with

VAR1 = "Sheet 6"

Dim VAR 2 = "Sheet 1"

Dim VAR3 = "U8"

Dim VAR4 = "A9"

Dim VAR5 = "Sheet 6"

Ainsi, cela m'éviterait d'avoir ma grosse macro répétée une fois dans chacun des Case Is. C'est possible ?

tu mets alors

sub MaMacro(VAR1 as string,VAR 2 as string,VAR3 as string,Dim VAR4 as string,VAR5 as string)

et ensuite tu fais juste

Case Is = "A"

    MaMacro (et tous tes paramètres entre parenthèse ici)

si problème mets un fichier simple avec ta macro

Bonjour, Salut Steelson !

Bon ! Une macro lancée par 3 boutons différents, qui fait la même chose différemment à des endroits différents selon bouton qui l'a lancée... On est quand même dans un truc ultra-simpliste... ! Plutôt que de se placer en observateur des réponses, essayant de faire croire que la réponse n'est pas au niveau de la complexité de la question, Bartoli ferait bien de dévoiler intégralement sa problématique configuration, ça n'effraiera personne, et il aura en retour une solution au niveau de détail qu'il aura fourni, dont on peut espérer que cette fois il la comprendra.

Bjr MFerran,

je plussoie ... et pourtant il a toutes les solutions possibles !

Mesdames et messieurs,

Désolé pour le temps de réponse, je sors d'une période de travail intense

Je tiens à vous remercier car j'ai mis en pratique vos conseils et tout marche nickel ! J'aurais probablement passé pas mal d'heures pour rien sans votre aide

Un nouveau défi (qui vous semblera probablement tout bête) me pose problème sur des questions de sélections dynamiques, mais ceci n'étant pas le sujet, je vais en créer un autre.

Ainsi, je peux clore ce sujet

Rechercher des sujets similaires à "detection clic identification bouton"