Appeler un événement avec .OnClick d'un bouton créé dynamiquement

Bonjour,

Je crée un formulaire excel VBA qui nécessite la création de nombreux boutons en fonction d'un paramètre entré par l'utilisateur. C'est pourquoi j'ai besoin de les créer dynamiquement, au moment de l'exécution du code. J'aimerais assigner une subroutine à ces boutons, de sorte que lorsqu'ils sont cliqués, une subroutine s'exécute.

La façon classique d'y procéder Button_Click() ne fonctionne pas à cause du fait que les boutons n'existent pas avant l'exécution du code. J'essaie donc d'utiliser .OnClick. Voici mon code :

Private Sub UserForm_Initialize()
    Dim myButton As MSForms.CommandButton
    Set myButton = Controls.Add("Forms.CommandButton.1", "myButton", True)

    With myButton
        .Caption = "Mon Bouton"
        .Left = 10
        .Top = 10
        .Width = 90
        .Height = 24
    End With
    myButton.OnClick = "myButton_Click"
End Sub

Sub myButton_Click()
    'Mon code
End Sub

Malheureusement, je rencontre l'erreur

Erreur d'exécution '438':

Propriété ou méthode non gérée par cet objet

à cause de myButton.OnClick = "Button_Click"

J'ai recherché dans plusieurs forums et j'ai cru comprendre qu'il y a une autre façon de s'y prendre, en créant des modules de classe mais je ne comprends pas comment m'y prendre . Est-ce que quelqu'un saurait comment m'en sortir s'il vous plaît ?

Merci beaucoup et bonne journée !

Un collègue a finalement pu m'expliquer comment utiliser la méthode du module de classe :

  1. Créer un nouveau module de classe.
  2. Dans le code de cet exemple fonctionne avec le module de classe nommé "MyButton" et mon formulaire nommé UserForm1, alors les nommer ainsi.
  3. Dans le module de classe, définir les propriétés et méthodes du bouton:
    Option Explicit
    
    Private WithEvents m_button As MSForms.CommandButton
    
    Public Property Get Button() As MSForms.CommandButton
        Set Button = m_button
    End Property
    
    Public Sub Initialize(ByVal caption As String, ByVal left As Long, ByVal top As Long, ByVal width As Long, ByVal height As Long)
        Set m_button = UserForm1.Controls.Add("Forms.CommandButton.1", "Button", True)
        With m_button
            .Caption = caption
            .Left = left
            .Top = top
            .Width = width
            .Height = height
        End With
    End Sub
    
    Private Sub m_button_Click()
        MsgBox "Button clicked!"
    End Sub
  4. Dans le code du formulaire, écrire ceci :
    Option Explicit
    
    Private myButton As MyButton
    
    Private Sub UserForm_Initialize()
        Set myButton = New MyButton
        myButton.Initialize "Click me", 10, 10, 90, 30
    End Sub

Le module de classe s'occupe donc d'assigner directement un gestionnaire d'événement au bouton qu'il crée.

Rechercher des sujets similaires à "appeler evenement onclick bouton cree dynamiquement"