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

Résolu
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016 - 17 août 2010 à 13:08
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016 - 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 !
A voir également:

16 réponses

lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016
20 août 2010 à 11:27
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 ^_^
3
CTAC Messages postés 133 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 8 juin 2012 5
19 août 2010 à 17:50
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
1
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 août 2010 à 19:39
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 ...
1
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 août 2010 à 13:19
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 août 2010 à 13:22
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
0
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016
17 août 2010 à 15:31
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 ^^
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 août 2010 à 17:20
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))
0
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016
18 août 2010 à 11:27
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 ?
0
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016
18 août 2010 à 13:05
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 ?
0
lmlmike Messages postés 22 Date d'inscription mardi 17 août 2010 Statut Membre Dernière intervention 4 juin 2016
18 août 2010 à 13:57
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 >_<'
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 août 2010 à 08:31
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)
0
CTAC Messages postés 133 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 8 juin 2012 5
19 août 2010 à 12:09
Bonjour,

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

ctac
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 août 2010 à 12:37
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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 août 2010 à 12:45
0
CTAC Messages postés 133 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 8 juin 2012 5
19 août 2010 à 12:56
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
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 août 2010 à 14:14
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)
0
Rejoignez-nous