Récupérer le nom du bouton dans lequel est la macro [Résolu]

lmlmike 22 Messages postés mardi 17 août 2010Date d'inscription 4 juin 2016 Dernière intervention - 17 août 2010 à 13:08 - Dernière réponse : lmlmike 22 Messages postés mardi 17 août 2010Date d'inscription 4 juin 2016 Dernière intervention
- 20 août 2010 à 11:27
Bonjour,

J'ai actuellement un petit soucis sur du VBA Excel, sur une macro assignée à plusieurs boutons (bouton1, bouton2, bouton3 ... bouton 250).

Je cherche dans cette macro a récupérer le nom du bouton qui est associé à cette macro. Jusque là ça va...
Le soucis, c'est que comme celle-ci est assignée à plusieurs boutons, je ne peux pas inscrire le nom du bouton directement dans la macro. Il faut donc que je le récupère avec une propriété genre "bouton_cliqué.name" au lieu de "nom_du_boutton.name" (j'espère être clair).

Après, il faudrait juste extraire le numéro de ce bouton et le passer en variable.

_______________________

J'ai regardé partout sur la toile, mais tous les exemples se basent sur "nom_du_bouton.name" et moi, ben le nom il est jamais le même ^_^'


Merci pour vos précieux conseils !
Afficher la suite 

16 réponses

Répondre au sujet
lmlmike 22 Messages postés mardi 17 août 2010Date d'inscription 4 juin 2016 Dernière intervention - 20 août 2010 à 11:27
+3
Utile
mdr,

désolé j'étais pas à mon travail hier, petite réunion au head office :)

Première chose, finalement je préfère travailler avec des Form buttons.
En effet, par ce biais je peux assigner Une seule et unique macro à toute une série de boutons. J'avais tout passé en ActiveX, je crois que je vais tout repasser en formbuttons (ça me saoule, c'est super chiant à faire lol)

Deuxième chose, eh bien, j'ai trouvé la solution grâce à ce post. Tout fonctionne grâce à vous et je peux utiliser mes boutons avec une seule et unique macro

Voilà le code, commenté plus bas :



Sub Impressions()

'Commentaire 1
nom_bouton =  Application.Caller
numpc = Val(Mid$(nom_bouton, Len("Impressions_") + 1))

 'Commentaire 2 
    Worksheets("PC").Activate
    Range("d1").Activate
            ligne  = Range("d1").Row
            col = Range("d1").Column
    
            While Cells(ligne, col).Value <> numpc
                ligne = ligne + 1
            Wend
            
            Cells(ligne, col).Activate
    
            ActiveCell.Offset(1, 0).Activate
            If ActiveCell.Value = "" Then
                MsgBox ("Aucun client n'est présent sur le PC !")
            Else
                Impressions = InputBox("Combien de feuilles ont été imprimées ?", "Impressions")
                Impressions = Impressions * 0.2

[i]'Commentaire 3/i]               
                ActiveCell.Offset(-1, 4).Activate
                
    
                While ActiveCell.Value <> ""
                    ActiveCell.Offset(0, 1).Activate
                Wend
[i]'Commentaire 4/i]
            
                ActiveCell.Value = Time
                ActiveCell.Offset(1, 0).Activate
                ActiveCell.Value = "Impression"
                ActiveCell.Offset(1, 0).Activate
                ActiveCell.Value = Impressions
            End If
End Sub


Commentaire 1 :
Chaque bouton s'appelle Impressions_X , X étant le numéro du poste ou se trouve le client. Le nom du bouton est donc récupéré et le X extrait pour l'utiliser plus tard.

Commentaire 2 :
On récupère le numéro du PC en effectuant une recherche sur la colonne D du numéro correspondant a celui extrait du nom du bouton. On force la recherche dans la colonne car sinon avec les cellules fusionnées la cellule activée est décalée.

Commentaire 3 :
Le programme regarde si quelque chose est déjà marqué dans les commandes passées par le client. Si c'est pas le cas, il passe à la case suivante...

Commentaire 4 :
Il rentre l'heure de l'impression, la nature de la commande (en l'occurence, une impression :P), et le montant à régler à la clôture du PC.


Ca commence à avoir de la gueule, j'aime beaucoup !
Merci encore, à très bientôt pour de nouveaux défis ^_^
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de lmlmike
CTAC 133 Messages postés mardi 24 décembre 2002Date d'inscription 8 juin 2012 Dernière intervention - 19 août 2010 à 17:50
+1
Utile
Bonjour,

Il ne faut justement pas que ce soit un Forms.CommandButton
Sur XL2003, il y a 2 barres d'outils qui permettent de dessiner des boutons.
La barre d'outils Control pour les ActiveX (Forms.CommandButton) et la barre d'outils Formulaires.
C'est celle là qu'il faut utiliser.
Tu peux aussi dessiner un rectangle avec la boite à outils dessin et lui affecter une macro avec
MsgBox Application.Caller qui te retournera Rectangle 1.

ctac
Commenter la réponse de CTAC
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 19 août 2010 à 19:39
+1
Utile
Ah, quelle nouille je suis.
Pas très attentif ...
Merci d'avoir pris la peine de me remettre les pendules à l'heure (des fois faut secouer fort !)

Et lmlmike, qu'est ce qu'il en dit ?
C'est quand même lui qui posa la question initiale ...
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 17 août 2010 à 13:19
0
Utile
Salut

En VBA, il est impossible d'indexer les boutons.
Donc, si ta Sub est commune à tous tes boutons, c'est que tu dois lancer cette Sub depuis le code de chaque bouton.
Me trompe-je ?

Si c'est bien ça, il te suffit d'ajouter un paramètre à ta Sub pour accueillir le nom du bouton.
Je te propose :
Private Sub monBouton1_Click
    Call maSubCommune("monBouton1")
End Sub
Private Sub monBouton2_Click
    Call maSubCommune("monBouton2")
End Sub
Private Sub maSubCommune(NomDuBouton As String)
    MsgBox "On vient du bouton " & NomDuBouton
End Sub

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 17 août 2010 à 13:22
0
Utile
Arg, je suis con (si si).
Si tu cliques sur un bouton, il récupère le focus et devient actif.
ActiveControl.Name te fournira son nom, tout simplement
Commenter la réponse de cs_Jack
lmlmike 22 Messages postés mardi 17 août 2010Date d'inscription 4 juin 2016 Dernière intervention - 17 août 2010 à 15:31
0
Utile
Merci, j'ai passé la matinée à chercher ce paramètre >_<'

Maintenant, j'aimerais savoir comment à partir de ce nom, disons :

nom_bouton = activecontrol.name

je puisse extraire le numéro de ce bouton...

Si nom_bouton = button154 alors
extraire 154 ^^
pas de else, il a forcément un numéro entre 1 et 250...

Je sais qu'il faut utiliser len(nom_boutton, I, 1) to 1 step 1 mais je n'arrive pas à faire en sorte de récupérer un nombre supérieur a 9...

T'as une idée ?

Merci encore ^^
Commenter la réponse de lmlmike
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 17 août 2010 à 17:20
0
Utile
Bah si le nom de tous tes boutons commence par "button", il te suffit d'utiliser un Mid
    Dim ButtonNumber As Long
    ButtonNumber = Val(Mid$(nom_bouton, Len("button") + 1))
Commenter la réponse de cs_Jack
lmlmike 22 Messages postés mardi 17 août 2010Date d'inscription 4 juin 2016 Dernière intervention - 18 août 2010 à 11:27
0
Utile
Rah, l'intégralité de mes boutons sur ma feuilles étaient des formcontrols et pas des ActiveXControls, ce qui implique que je ne pouvais pas utiliser la propriété ActiveName.

Donc en gros maintenant que je ne plus assigner une seule macro à mes plusieurs boutons, qu'est-ce que je fais, une ligne Call qui renvoie sur une fonction publique unique ?
Commenter la réponse de lmlmike
lmlmike 22 Messages postés mardi 17 août 2010Date d'inscription 4 juin 2016 Dernière intervention - 18 août 2010 à 13:05
0
Utile
Je ne m'en sors plus...en ayant passé les boutons en ActiveX, certaines de mes variables ne deviennent plus publiques, tout devient le bord** le plus complet...

Revoyons d'une autre manière : est-il possible d'extraire le nom de la macro ?
Commenter la réponse de lmlmike
lmlmike 22 Messages postés mardi 17 août 2010Date d'inscription 4 juin 2016 Dernière intervention - 18 août 2010 à 13:57
0
Utile
J'ai remis tout en place en passant tout en public sub, donc ça remarche...

En attendant, la propriété ActiveControl.name fonctionne dans un userform mais pas sur ma feuille...

Impossible de savoir comment savoir quel bouton à le focus >_<'
Commenter la réponse de lmlmike
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 19 août 2010 à 08:31
0
Utile
Et non, hélas, il n'est pas possible de récupérer le nom de la procédure courante.
Pour tes boutons, il ne reste plus qu'à faire ceci :
Déclarer une variable qui récupèrera le nom du dernier bouton utilisé
Public sLastButtonName As String
et, dans chaque bouton, ajouter cette ligne
Private Sub CommandButton1_GotFocus()   ' ou _Click, à voir
    sLastButtonName = "CommandButton1"
End Sub

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
CTAC 133 Messages postés mardi 24 décembre 2002Date d'inscription 8 juin 2012 Dernière intervention - 19 août 2010 à 12:09
0
Utile
Bonjour,

Tu garde tes boutons formcontrols et tu utilise Application.Caller dans ta macro.

ctac
Commenter la réponse de CTAC
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 19 août 2010 à 12:37
0
Utile
Tiens, je ne connais pas.
Je viens de l'essayer, mais ça ne donne pas grand chose :
Private Sub CommandButton1_Click()
    Call zzzz
End Sub

Sub zzzz()    ' extrait de l'aide de Caller
    Dim v
    Select Case TypeName(Application.Caller)
        Case "Range"
            v = Application.Caller.Address
        Case "String"
            v = Application.Caller
        Case "Error"
            v = "Error"
        Case Else
            v = "unknown"
    End Select
    MsgBox "caller = " & v
End Sub

renvoie systématiquement "Error" (Erreur 2023)
Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 19 août 2010 à 12:45
Commenter la réponse de cs_Jack
CTAC 133 Messages postés mardi 24 décembre 2002Date d'inscription 8 juin 2012 Dernière intervention - 19 août 2010 à 12:56
0
Utile
Bonjour,

Il faut que ce soit des boutons formulaires pas des activeX
Tu en dessine un sur ta feuille de calcul.
Excel ouvre une boite de dialogue Affecter une macro avec par défaut Bouton1_Clic
Clic sur nouvelle
Un module est créé avec Sub Bouton1_Clic()
Ici MsgBox Application.Caller

Bouton 1 sera affiché si tu clic sur le bouton

ctac
Commenter la réponse de CTAC
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 19 août 2010 à 14:14
0
Utile
lol
Oui oui, le bouton est bien un bouton "Forms.CommandButton"
Bah chez moi, ça me renvoie ce texte "Erreur 2023" (Excel 2003 à jour)
Pourtant, sur le net, j'ai trouvé des discutions qui parlait déjà ce cette fonction sur la version 95, donc ce n'est pas nouveau.
Pas grave, ce doit être ma config qui déconne.

Et toi, lmlmike, est-ce que ça répond à ta question initiale ?

(merci CTAC)
Commenter la réponse de cs_Jack

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.