Activer CommandButton

ziopizza

XLDnaute Occasionnel
Bonjour le Forum,

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,

Yves [file name=essai_20051126203805.zip size=11278]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/essai_20051126203805.zip[/file]
 

Pièces jointes

  • essai_20051126203805.zip
    11 KB · Affichages: 75
L

LaurentTBT

Guest
Bonjour à 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.

En espérant t'avoir déjà un peu dépanné.

Bonne soirée,

Laurent.
 

Brigitte

XLDnaute Barbatruc
Bonsoir à tous,


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.

Bises pour l'occasion.

Edition :



J'avais oublié l'essentiel, coucou de
3-picture1.gif


Message édité par: Brigitte, à: 27/11/2005 17:03
 
L

LaurentTBT

Guest
Bonjour, Brigitte,

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

Laurent.
 

Robert

XLDnaute Barbatruc
Repose en paix
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.

Merci.
 
L

LaurentTBT

Guest
Bonsoir, Justine,

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')

Bref, voici un sujet à suivre de près.

Bonne soirée à tous

Laurent. [file name=AppelProcVariable.zip size=14704]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/AppelProcVariable.zip[/file]
 

Pièces jointes

  • AppelProcVariable.zip
    14.4 KB · Affichages: 73

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir le fil, bonsoir le forum,

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.
 

Discussions similaires

Réponses
8
Affichages
1 K
Réponses
3
Affichages
2 K
P
Réponses
4
Affichages
964
placis
P
H
Réponses
2
Affichages
705
henri
H
B
Réponses
6
Affichages
2 K
Bertrand
B
P
Réponses
9
Affichages
1 K
philest
P
Réponses
2
Affichages
789
maqfisto
M
S
Réponses
0
Affichages
1 K
Sébastien
S

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 294
Messages
2 086 896
Membres
103 404
dernier inscrit
sultan87