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

bonjour,

Un exemple de gestion de CommandButton en pièce jointe

A+

314classe-buttonusf.zip (11.99 Ko)

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

207exemple1.xlsm (32.75 Ko)

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

Rechercher des sujets similaires à "module classe sub boutons"