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
Merci beaucoup et bonne journée !
Un collègue a finalement pu m'expliquer comment utiliser la méthode du module de classe :
- Créer un nouveau module de classe.
- Dans le code de cet exemple fonctionne avec le module de classe nommé "MyButton" et mon formulaire nommé UserForm1, alors les nommer ainsi.
- 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
- 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.