Module de classe : un sub pour plusieurs boutons
Bonjour à tous,
Etant débutant sur VBA je sollicite votre aide afin d'essayer de résoudre un des problèmes auxquelles je suis confronté et par la même occasion en apprendre un peu plus sur les modules de classe.
Je dispose d'un userform avec une trentaine de CommandButton auxquels j'affecte la même procédure. Le problème étant que je ne trouve pas de moyen de ne pas avoir à recopier 30 fois l'appel à cette procédure et je trouve ça très lourd niveau code.
Je souhaiterai pouvoir harmoniser tout cela et que chaque bouton n'appelle qu'une seule et même procédure m'évitant ainsi un nombre incalculable de ligne de code à retranscrire.
En naviguant sur les forums, on parle souvent de module de classe pour faire face à ce problème mais mes connaissances ne me permettent pas d'aller plus loin.
Merci d'avance à tous
- Messages
- 4'096
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Un module de classe relatif à un CommandButton va vous permettre de définir dans votre userform, un événement générique "Clic" pour tous vos boutons de commande .
Il faudra créer pour chaque bouton de commande une instance de cette classe, c'est à dire stocker en mémoire toutes les caractéristiques de cette classe (propriétés, événements, actions) relatives à ce bouton.
Ci-dessous exemple de code avec un module appelé "CmdButton" :
' définition événements bouton de commande
Public WithEvents bouton As CmdButton
Private Sub UserForm_Initialize()
Dim ws As Worksheet
Dim obj As Object
Dim n As Integer
Dim Code As String
n = 0
Me.Height = 30
Me.Width = 230
For Each ws In ThisWorkbook.Worksheets
n = n + 1
Me.Height = Me.Height + 30
Set obj = Me.Controls.Add("Forms.Label.1", "Label1", True)
With obj
.name = "Label" & n
.caption = ws.name
.Top = Me.Height - 49
.Left = 18
.Height = 12
.Width = 162
End With
Set obj = Me.Controls.Add("Forms.CommandButton.1", "CommandButton1", True)
With obj
.name = "CommandButton" & n
.caption = "Go"
.Top = Me.Height - 54
.Left = 186
.Height = 20
.Width = 20
End With
Dim cmdbutton_i As Object
'création pour le bouton de commande du formulaire, d'une instance de la classe "CmdButton"
Set cmdbutton_i = New CmdButton
'stockage dans l'instance créée des 2 objets : l'instance de la classe "CmdButton" et le commandbutton
Set cmdbutton_i.Init(cmdbutton_i) = obj
Next ws
End Sub
Private Sub bouton_Click()
On Error Resume Next
n = Right(bouton.name, 1)
Sheets(Me.Controls("Label" & n).caption).Select
End Sub
ci-dessous exemple de module de classe "CmdButton"
Option Explicit
'# Instance de la clase
Public button_i As Object
'# Formulaire appelant
Private USF As Object
'# Evénement déclenché par la classe
Public Event Click()
'# Evénements pour bouton de commande
Private WithEvents button As MSForms.CommandButton
Public Property Set Init(ByVal instance As Object, ByVal contrôle As Object)
Set button_i = instance
Set button = contrôle
Set USF = button.Parent
End Property
Public Property Get caption() As String
caption = button.caption
End Property
Public Property Get name() As String
name = button.name
End Property
Private Sub button_Click()
'assignation de la variable "bouton" du formulaire à l'instance de la classe pour activation des événements
Set USF.bouton = button_i
'activation événement Click
RaiseEvent Click
End Sub
Ce module est d'abord composé de 3 variables :
button_i : stocke l'objet instance de la classe,
USF : stocke l'objet formulaire appelant,
button défini par "Private WithEvents button As MSForms.CommandButton" : stocke l'objet CommandButton,
Ensuite, d'un événement "Click",
défini par "Public Event Click()" pour être utilisé dans le formulaire ,
Après, de propriétés :
Init : permet d'assigner les 3 variables du module à partir du formulaire,
caption et name : reprennent les propriétés du CommandButton stocké dans la variable "button" pour être utilisées dans le formulaire.
Enfin, de la gestion de l'événement "Clic" dans le module de classe qui permet :
1- de créer l'événement "Clic" qui sera utilisé dans le formulaire : "RaiseEvent Click"
2- d'assigner dans le formulaire l'instance associée au bouton qui a déclenché l'événement : "Set USF.bouton = instance_button", où "bouton" est dans le formulaire la variable d'instance de la classe CmdButton.
ci-joint fichier
Merci beaucoup à vous deux c'est exactement ce que je cherchais et cela marche parfaitement.
Merci thev pour le temps et les explications que tu m'as donné qui me permettent de mieux comprendre comment fonctionnent les modules de classe.
Merci encore, vous êtes géniaux.
Bonjour à tous,
@galopin01 et thev
Je viens de comprendre le principe des modules de classe et j'ai pu adapter à un autre projet.
Merci
ric