Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Je voudrais activer des commandButton en passant par l'événement change de la feuille.
Je joins un petit exemple qui sera sûrement plus explicite.
Ma demande peut paraître bizarre mais mon appli a plus de 200
Boutons, et quant on connais le code cela sera plus facile de le
Taper que de chercher le bon bouton.
Merci à tous,
Je ne reviens que très rarement poster sur le forum, mais je le consulte toujours régulièrement, et j'avais remarqué hier ta question, Ziopizza. Alorts comme je vois aujourd'hui que tu es toujours sans réponse, voici quelques pistes:
Pour le code pour appeler ta procédure liée à l'événement Click de tes boutons, il suffit a priori d'écrire:
Call CommandButton2_Click, le mot Call n'étant pas obligatoire.
Sauf que, les procédures événementielles liées à tes boutons sont par défaut de niveau du module de ton UserForm, donc non accessibles depuis un autre module (en l'occurence depuis ton code lié à ta feuille)
Pour que cela fonctionne, il te faut supprimer devant chaque procédure Sub CommandButton(n)_Click de ton userform le mot Private, afin que ces procédures deviennent accessibles depuis les autres modules.
Ensuite, pour que ta procédure sache où les trouver, tu peux préciser:
Call UserForm1.CommandButton2_Click
Et le tour est joué!
Voilà ce que cela donne pour moi:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Range('A1'), Range(Target.Address)) Is Nothing Then
If Range('A1') = 2 Then
Call UserForm1.CommandButton2_Click
ElseIf Range('A1') = 3 Then
Call UserForm1.CommandButton3_Click
End If
End If
End Sub
Maintenant, je cherche (en vain) à te mettre une petite cerise sur le gateau. En effet, si tu as 200 boutons, tu vas devoir faire une boucle If...Elseif ou un Select Case 200 fois.
Je cherche donc à appeler la procédure en mettant son nom en variable
Quelque chose du type:
Call 'UserForm1.CommandButton' & Range('A1') & '_Click'
Mais je ne trouve pas pour le moment.
Je ne sais pas si c'est possible. L'idéal aurait été bien sûr au départ de créer une fonction regroupant toutes tes procédures.
Je squatte le fil de ziopizza pour te saluer Laurent. J'espère que tu vas bien ainsi que ta petite famille. Bon anniversaire en retard, le 06 novembre est pas si loin et Joyeuses Pâques en avance.
Merci de m'avoir envoyé ce petit coucou si rapidement.
Tout va très bien pour moi, et ma famille. Je vais d'ailleurs vite m'occuper des enfants.
Tu vois, de mon côté, je n'ai même pas eu le temps de me pencher sur le nouveau forum, et de voir comment remettre ma signature!
Mais comme David va nous concocter une nouvelle version encore plus perfomante, j'attendrai de voir le forum de 3ème génération!
En tout cas, je salue tout les membres de plus en plus nombreux d'XLD.
Bises
Bonsoir Yves, Laurent, Brigitte, bonsoir le forum,
Laurent, hier j'y ai passé un sacré bout de temps sur ce problème mais j'ai séché aussi sur la possibilité de pouvoir appeler une macro en y mettant une variable Sub CommandButton(n)_Click.
Si un jour tu trouves une réponse, mets-la je t'en prie dans ce fil je vais m'y inscrire.
Désolé, j'ai essayé ta proposition sans succès. Je m'y suis peut-être mal pris. Mais je pense qu'après Call, il faut le nom intrinsèque de la macro, et surtout pas de chaîne de caractères. J'ai poursuivi par ailleurs mes recherches, notamment dans un bouquin de John Walkenbach, où j'ai trouvé ceci dans le chapitre traitant de l'appel d'une procédure à partir d'une autre procédure:
D'abord, il explique comment on le fait classiquement avec Call
Puis il montre l'utilisation de Application.run LaProcAAppeler
Et enfin ceci (je le cite):
'La meilleure raison que l'on peut avoir d'utiliser la méthode Run concerne le cas où le nom de la procédure est affecté à une variable. En fait, il s'agit du seul moyen d'exécuter une procédure de cette manière.'
Voici son exemple:
Code:
Sub Main()
Dim SubAAppeler As String
Select Case Weekday(Now)
Case 1, 7: SubAAppeler = 'Weekend'
Case Else: SubAAppeler = 'JourSemaine'
End Select
Application.Run SubAAppeler
End Sub
Sub Weekend()
MsgBox 'Aujourd'hui, c'est le week-end'
End Sub
Sub JourSemaine()
MsgBox 'Aujourd'hui, c'est un jour de la semaine'
End Sub
Là, je me suis dit: 'EUREKA'
Malheureusement, je butte toujours.
J'ai essayé quelque chose du style:
Code:
Dim ProcAAppeler As String
ProcAAppeler = 'CommandButton' & Range('A1') & '_Click'
Application.Run ProcAAppeler
End Sub
Mais ça ne passe pas.
Je pense que quand on appelle une macro avec Run, Vba ne la trouve pas car elle appartient en fait au UserForm et non à un module standard.
J'ai essayé de passer par une procédure intermédiaire dans le Worksheet_Change, puis faire jouer le Run depuis le UserForm (voir pièce jointe), mais rien n'y fait.
Il y a peut-être quelque chose à faire en passant par un module de classe, mais je ne sais pas trop faire.
Sinon, il y a toujours possibilité de faire une macro qui réécrit elle-même tous les codes répétitifs (faire une recherche sur 'a la volée')
CallByName Appele-la par son nom !!! J'en ri encore tellement ça má énervé. Et c'est Michel qui gagne une tringle à rideau...
Un grand merci à tous car une fois de plus je vois à quel point le partage de connaissance est la raison d'être de ce site.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD