Utiliser un nommage dynamique de Sub

zorglubxp

XLDnaute Junior
Bonjour,

J'ai du mal à synthétiser mon souhait dans l'intitulé alors je vais tacher de bien l'expliquer.

Je compte affecter 2 macros à chaque bouton de ma feuille (feuille et non pas usf, même si ça ne change peut être pas grand chose)
Pour ce faire je vais utiliser, pour chaque bouton, 2 événements :
- 1 . bouton_MouseDown => déclenchement d'un Timer à l'appui sur le bouton)
- 2 . bouton_MouseUp => déclenchement de la macro1 ou la macro2 en fonction du temps entre l'appui sur le bouton(MouseDown) et son relâchement (MouseUp). Soit macro1 sur clic rapide et macro2 sur clic lent.
cette astuce
(j'ai récupéré cette méthode sur ce thread, merci à Fo_rum : Créer un Bouton-Clic pour 2 fonctions distinctes)

Dans la mesure où j'ai une vingtaine de boutons, j'aurais souhaité savoir s"il était possible d’alléger mon code plutôt que d'écrire 40 procédures

J'imagine un truc du style :
Private Sub Bouton.Add(FctClick)_MouseDown...
avec un fonction FctClick qui récupérerait le nom du bouton sur lequel j'ai cliqué.

Voilà.
Si vous avec compris quelque chose à ma requête,...
 

zorglubxp

XLDnaute Junior
Merci Philippe,

Application.Caller va me servir, si ce n'est pas pour ce besoin precis, ce sera pour un autre !

Pour expliciter ma demande (je me doutais que ça ne serait pas très claire)

Je te donne un exemple, voici ce à quoi va ressemebler le code de la feuille sur laquelle j'ai mes 20 boutons
VB:
Option Explicit
Dim T

Private Sub CommandButton1_MouseDown()
  T = Timer
End Sub

Private Sub CommandButton1_MouseUp()
  If Timer - T < 0.5 Then
         macro1
  Else
         macro2
  End If
End Sub

Private Sub CommandButton2_MouseDown()
  T = Timer
End Sub

Private Sub CommandButton2_MouseUp()
  If Timer - T < 0.5 Then
         macro3
  Else
         macro4
  End If
End Sub

Private Sub CommandButton3_MouseDown()
  T = Timer
End Sub

Private Sub CommandButton3_MouseUp()
  If Timer - T < 0.5 Then
         macro5
  Else
         macro6
  End If
End Sub

Private Sub CommandButton4_MouseDown()
  T = Timer
End Sub

Private Sub CommandButton4_MouseUp()
  If Timer - T < 0.5 Then
         macro7
  Else
         macro8
  End If
End Sub

Private Sub CommandButton5_MouseDown()
  T = Timer
End Sub

Private Sub CommandButton5_MouseUp()
  If Timer - T < 0.5 Then
         macro9
  Else
         macro10
  End If
End Sub

'....

Je mes suis arrêté à 5 itérations, mais ça va aller au delà.

De plus il serait pas mal que je trouve une astuce similaire pour appeler mes macro qui seront identiques au détail près de la couleur de remplissage.

Voilà, j'espère que cette illustration t'aura permis d'y voir un peu plus clair quant à ma motivation pour chercher ce type de solution. Mon but n'étant pas de gagner du temps pour tout écrire, mais plutôt d'alléger mon code et de progresser.
 

zorglubxp

XLDnaute Junior
Merci job75
Effectivement, lors de mes recherches, la solution des module de classe m'est apparu plusieurs fois. J'ai téléchargé un fichier d'un xldnaute qui répondait à une question qui allait dans le même sens que la mienne et le miracle ne s'est pas produit.
Le code est assez complexe pour un non averti.
Tu dis qu'il y a beaucoup d'exemple ici, peut-être même de trop.
Je ne demande pas à ce que tu fasses le boulot à ma place, mais si tu pouvais m'orienter vers une page qui irait dans le sens où je veux aller, ça me ferait gagner beaucoup de temps.

J'ai fini de coder tous mes boutons et ça fonctionne, mais j'aurais souhaité optimiser tout ça, mais pas à n'importe quel prix. Si c'est passer une nouvelle journée dessus, ça n'en vaut pas la peine pour le moment.

@+

Zorg
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,

Un exemple de module de classe dans le fichier joint ( avec quelques commentaires).
Il y a deux versions :
  • la v1 utilise une unique macro paramétrée pour effectuer les traitements de tous les boutons
  • la v2 utilise plusieurs macros pour effectuer les traitements des boutons (deux macros par bouton aux noms normalisés : macro1C et macro1L (1 pour le bouton 1, C pour un appui court, L pour un appui long)
la v2 est peut-être un peu plus lisible.

nota : la v2 utilise l'instruction RUN pour lancer des macros dont le nom se trouve dans une variable.
 

Pièces jointes

  • zorglubxp-module de classe- v1.xlsm
    40.7 KB · Affichages: 31
  • zorglubxp-module de classe- v2.xlsm
    41.1 KB · Affichages: 30
Dernière édition:

zorglubxp

XLDnaute Junior
Wahouh !!!!

C'est tout bonnement génial.
Merci beaucoup pour ce travail pédagogique.
Non seulement, ton code est adapté en fonction de mon besoin, sans aller trop loin, juste ce qu'il faut dans mon contexte, mais en plus tout est parfaitement explicité.

J'ai presque tout compris du 1er coup ! (j'ai commencé par la v2)
C'est sûr que je vais adopter ces modules de classe.
Il va tout de même falloir que je revienne à plusieurs fois dessus pour tout assimiler mais disons que tu as su mettre cette solution à ma porté.
Un grand Bravo !

il y a juste le Select Case du module 1 de la v1 que je ne comprends pas trop.
Dans la mesure où la procédure est entièrement dynamique, je ne comprends pas, à prime abord, pourquoi tu as reproduit ce même code à l’intérieur de chaque Case alors qu'il fait appel à des variables. Il y a un truc qui m'échappe, mais cela ne gêne en rien la compréhension du module de classe tel que tu l'as présenté dans ces fichiers.
Dans mon fichier j'ai déjà optimiser ma macro en utilisant le SelectCase pour les critères différenciant et ai fait appel à des arguments (byVal ....) pour les appliquer au sein de mon unique macro, ce dont je ne suis pas peu fier !

Donc une fois que j'aurais réuni les 2 (module de base + macro unique), je pourrais écarter les bras à la proue du bateau (juste avant que mes chevilles n'explosent) ;)

Merci encore !
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

(...) il y a juste le Select Case du module 1 de la v1 que je ne comprends pas trop.
Dans la mesure où la procédure est entièrement dynamique, je ne comprends pas, à prime abord, pourquoi tu as reproduit ce même code à l’intérieur de chaque Case alors qu'il fait appel à des variables. Il y a un truc qui m'échappe, mais cela ne gêne en rien la compréhension du module de classe tel que tu l'as présenté dans ces fichiers. (...)

Pour la v1, dans le Select, le code est le même pour chaque bouton uniquement pour l'exemple (par fainéantise :(). J'avais supposé, que dans la réalité, chaque code pourrait être différent des autres. Deux codes par boutons (Court et Long). Ces différents codes prendraient alors place dans les blocs Case du Select.

Si la procédure QueFaire est la même pour tous les boutons (aux arguments près), le code peut effectivement se réduire à:
VB:
Sub QueFaire(xObj, xCourt As Boolean)
' cette procédure contient le code pour tous les CommandButton
' dont les évènements seront gérés dans le module classeCMD
' deux paramètres: le premier est le CommandButton à traiter,
' le deuxième est une valeur booléenne qui vaut TRUE si l'appui a été court
' ou qui vaut FALSE si l'appui a été long

Dim numero&  'numéro du CommandButton

numero = Val(Mid(xObj.Name, 5, 99))  'numéro du CommandButton
If xCourt Then  'code si appui court
  MsgBox "Bouton : " & numero & vbLf & "Appui : " & IIf(xCourt, "court", "long")

  Else  'code si appui long
  MsgBox "CommandButton : " & numero & vbLf & "Appui : " & IIf(xCourt, "court", "long")
  End If
End Sub

nota :
(...) Donc une fois que j'aurais réuni les 2 (module de base + macro unique), je pourrais écarter les bras à la proue du bateau (juste avant que mes chevilles n'explosent) (...)
Attention, en cas d'explosion, tu risques de te transformer en V1 ou V2 (les missiles bien sûr, pas les versions :p)
 
Dernière édition:

Discussions similaires