XL 2010 Initiation module de classe - Bouton cliqué dans variable public

cathodique

XLDnaute Barbatruc
Bonjour:),

Bien qu'avoir trouvé des exemples sur le forum, mais j'avoue ne pas avoir réussi à adapter à mon usage.
J'ai un userform contenant que des boutons permettant de faire un choix d'opération.
Certains de ces derniers appellent des userforms pour autoriser l’exécution de l’opération (déclencher macro).
Je voudrais réduire ce nombre d'userform, c-à-d n'utiliser qu'un seul avec un Select Case basé sur le caption du bouton cliqué.
Je sais qu'un module de classe est le plus indiqué pour ce genre de gestion. Hélas, je n'ai encore appris à manipuler les classes.
SVP, un code commenté serait le bienvenu.
Mon objectif est de récupérer dans une variable public le Caption du bouton cliqué à réutiliser dans un seconde userform.

Merci bien.

ps: je n'ai mis que 3 boutons pour faciliter le codage.

Bon dimanche.
 

Pièces jointes

  • Module de Classe Boutons.xlsm
    18 KB · Affichages: 18
Solution
Bonjour,

Un exemple qui traite les commandButton de votre userForm1
La classe (clsMyClass) en elle même est très simple.

Et dans userForm1_Initialise il suffit juste d'alimenter un tableau d'objets clsMyClass

Cordialement

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Cathodique,
Il suffit d'affecter le nom à la variable publique avant de sortir :
VB:
Option Explicit
Private Sub CommandButton1_Click()
    BoutonActive = "Bouton1"
    Unload UserForm1
End Sub
Private Sub CommandButton2_Click()
    BoutonActive = "Bouton2"
    Unload UserForm1
End Sub
Private Sub CommandButton3_Click()
    BoutonActive = "Bouton3"
    Unload UserForm1
End Sub
Private Sub CommandButton4_Click()
    BoutonActive = "Bouton4"
    Unload UserForm1
End Sub
Pour le test j'ai rajouté dans la macro Afficher :
Code:
MsgBox "Vous avez appuyé sur : " & BoutonActive
Donc ensuite il vous suffit de faire Select case BoutonActive ....
 

Pièces jointes

  • Module de Classe Boutons.xlsm
    18.8 KB · Affichages: 7

cathodique

XLDnaute Barbatruc
Bonjour Cathodique,
Il suffit d'affecter le nom à la variable publique avant de sortir :
VB:
Option Explicit
Private Sub CommandButton1_Click()
    BoutonActive = "Bouton1"
    Unload UserForm1
End Sub
Private Sub CommandButton2_Click()
    BoutonActive = "Bouton2"
    Unload UserForm1
End Sub
Private Sub CommandButton3_Click()
    BoutonActive = "Bouton3"
    Unload UserForm1
End Sub
Private Sub CommandButton4_Click()
    BoutonActive = "Bouton4"
    Unload UserForm1
End Sub
Pour le test j'ai rajouté dans la macro Afficher :
Code:
MsgBox "Vous avez appuyé sur : " & BoutonActive
Donc ensuite il vous suffit de faire Select case BoutonActive ....
Bonjour Sylvanu;),

Je te remercie pour ta proposition. En fait, ça je sais le faire.
J'ai ouvert cette discussion pour m'initier au module de classe.

Encore merci pour ton retour.

Bon dimanche.
 

cathodique

XLDnaute Barbatruc
Vraiment désolé, c'était ambigüe. A lire ça j'ai "traduit" : je préfère éviter les modules de classe car je ne connais pas. :)
Non, tu n'as pas à être désolé. Tu as voulu aider comme je le fais avec ce que je connais. ;)

edit: @sylvanu : Merci de m'indiquer ce qui vous introduit en erreur. Car je ne vois pas où je dois faire ma reformulation. Je pensais que le titre était très significatif. :)
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour,

Un exemple qui traite les commandButton de votre userForm1
La classe (clsMyClass) en elle même est très simple.

Et dans userForm1_Initialise il suffit juste d'alimenter un tableau d'objets clsMyClass

Cordialement
Bonjour Roblochon ;),

Je te remercie pour ton fichier et tes commentaires. Tout fonctionne bien.
Du coup, nul besoin de coder les boutons.

Encore merci. Bon dimanche.
 

Dranreb

XLDnaute Barbatruc
À moins que vous ne souhaitiez que les CommandButton soient créés à la volée, il me semble que ce module de classe SupportCBn n'apporterait pas grand chose :
VB:
Option Explicit
Private WithEvents CBn As MSForms.CommandButton, Lab As MSForms.Label ', Parent As CBnCollect
Public Sub Init(ByVal CBnUF As MSForms.CommandButton, ByVal LabUF As MSForms.Label)
   Set CBn = CBnUF
   Set Lab = LabUF
   End Sub
Private Sub CBn_Click()
'   Parent.MéthodeRéservéeÀSupportCBn CBn.Caption
   Lab.Caption = CBn.Caption
   End Sub
Il vaudrait mieux appeler une Private Sub commune dans chaque Private Sub CommandButtonX_Click
 

cathodique

XLDnaute Barbatruc
À moins que vous ne souhaitiez que les CommandButton soient créés à la volée, il me semble que ce module de classe SupportCBn n'apporterait pas grand chose :
VB:
Option Explicit
Private WithEvents CBn As MSForms.CommandButton, Lab As MSForms.Label ', Parent As CBnCollect
Public Sub Init(ByVal CBnUF As MSForms.CommandButton, ByVal LabUF As MSForms.Label)
   Set CBn = CBnUF
   Set Lab = LabUF
   End Sub
Private Sub CBn_Click()
'   Parent.MéthodeRéservéeÀSupportCBn CBn.Caption
   Lab.Caption = CBn.Caption
   End Sub
Il vaudrait mieux appeler une Private Sub commune dans chaque Private Sub CommandButtonX_Click
Bonjour Dranreb ;),

Merci. Je ne suis pas arrivé à ce niveau. Je voulais juste récupérer le nom du bouton cliqué dans une variable à réutiliser dans un autre userform pour exécuter des tâches suivant le bouton cliqué.

En tout cas merci pour ton code. Il pourrait m'être utile lorsque j'aurai peut-être atteint votre niveau.

Bon dimanche.
 

Dranreb

XLDnaute Barbatruc
Vous pouvez aussi équiper votre UserForm2 d'une méthode Vérifier :
VB:
Option Explicit
Private MotPasse As String
Public Sub Vérifier(ByVal Nom As String, ByVal MP As String)
   Me.Caption = Nom
   MotPasse = MP
   Me.Show
   End Sub
Private Sub CommandButton1_Click()
   Me.Hide
   If TextBox1.Value <> MotPasse Then
      MsgBox "Accès refusé!", vbExclamation, Me.Caption
   Else
      MsgBox "Accès autorisé!", vbInformation, Me.Caption
      End If
   End Sub
Et mettre des séries de procédures sur ce modèle dans votre UserForm1 :
Code:
Private Sub CommandButton1_Click()
   UserForm2.Vérifier CommandButton1.Caption, "XYZMotDePasseTordu"
   End Sub
 

Dranreb

XLDnaute Barbatruc
Ou d'une méthode MotDePasseOK, pour pouvoir être informé de l'issue dans l'UserForm1 :
Code:
Option Explicit
Private MotPasse As String, OK As Boolean
Public Function MotDePasseOK(ByVal Nom As String, ByVal MP As String) As Boolean
   Me.Caption = Nom
   MotPasse = MP
   Me.Show
   MotDePasseOK = OK
   End Function
Private Sub CommandButton1_Click()
   Me.Hide
   OK = TextBox1.Value = MotPasse
   If OK Then
      MsgBox "Accès autorisé!", vbInformation, Me.Caption
   Else
      MsgBox "Accès refusé!", vbExclamation, Me.Caption
      End If
   End Sub
Code:
Private Sub CommandButton1_Click()
   If UserForm2.MotDePasseOK(CommandButton1.Caption, "XYZMotDePasseTordu") Then
'      …
   Else: Unload Me: End If
   End Sub
 

patricktoulon

XLDnaute Barbatruc
bonjour un petit exemple tout simple
classer 3 boutons sans module classe avec un controls associé reconnu sans préfixer le parent dans chaque instance de bouton
et controls du userform1 mémorisé et identifiable et accessible par le userform2
le tout sans module classe 😁 😁 avec un code tout rikiki
 

Pièces jointes

  • exemple classe bouton sans module classe cathodique.xlsm
    18.7 KB · Affichages: 10

Discussions similaires

Réponses
29
Affichages
953

Membres actuellement en ligne

Statistiques des forums

Discussions
312 276
Messages
2 086 714
Membres
103 378
dernier inscrit
phdrouart