如何为动态写入的控件覆盖control_Change事件?



我有一个带有以下代码模块的工作簿:

类模块:clsComboBox


Option Explicit
Private WithEvents MyComboBox As MSForms.ComboBox
Public Property Set cmboControl(cmboBox As MSForms.ComboBox)  
    Set MyComboBox = cmboBox  
End Property
Private Sub MyComboBox_Change()  
    If MyComboBox.Value = "2" Then  
        MsgBox "I will be so happy if this ever runs"  
    End If  
End Sub  

UserForm: UserForm1(包含单个按钮,CommandButton1)


Option Explicit
Private Sub CommandButton1_Click()  
    Dim ctlcombobox As ComboBox  
    Dim clsobject As clsComboBox  
    Set ctlcombobox = Me.Controls.Add("Forms.ComboBox.1", "ComboBox1", True)  
    Set clsobject = New clsComboBox  
    Set clsobject.cmboControl = ctlcombobox  
    With ctlcombobox  
        .Top = 100  
        .Left = 5  
        .Width = 200  
        .Height = 25  
        .Visible = True  
        .List = Array("1", "2")  
    End With  
End Sub  

我试图用我在飞行中创建的每个新组合框覆盖combobox_change事件。然而,代码不能工作。当在组合框上选择"2"时,什么也不会发生。我做错了什么?

示例工作簿:https://www.dropbox.com/s/ctr51lote86fbox/test%20combo%20box.xlsm?dl=0

编辑

谢谢你的回答,蒂姆。我必须创建一个变长数组来保存我在内存中动态创建的所有组合框。(原来的问题是关于一个单一的组合框,但在我的实际工作表中,我在运行时创建一个未知的数字)。
 Dim clsobject As clsComboBox

这需要是一个全局变量:在您当前的代码中,只要CommandButton1_Click退出,它就会超出作用域。如果您想要捕获以后的事件,它需要持久化。

就像Tim说的那样——只需要移动那一行代码:

Option Explicit
Dim clsobject As clsComboBox  
Private Sub CommandButton1_Click()  
    Dim ctlcombobox As ComboBox  
    Set ctlcombobox = Me.Controls.Add("Forms.ComboBox.1", "ComboBox1", True)  
    Set clsobject = New clsComboBox  
    Set clsobject.cmboControl = ctlcombobox  
    With ctlcombobox  
        .Top = 100  
        .Left = 5  
        .Width = 200  
        .Height = 25  
        .Visible = True  
        .List = Array("1", "2")  
    End With  
End Sub

最新更新