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

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 !

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

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

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.
 
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:
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.
 
À 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
 
À 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.
 
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
 
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
 
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

- 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

Discussions similaires

Retour