以编程方式在VBA中创建事件侦听器

时间:2014-02-12 20:02:41

标签: excel vba excel-vba events

是否可以在event method上以编程方式创建comboBox

在工作表上我有ComboBox,我可以通过代码获取其名称:

       Dim ole As OLEObject
       For Each ole In ActiveSheet.OLEObjects

       If TypeName(ole.Object) = "ComboBox" Then
       ' ole.Name '<<<<<<<< here 
       End If
       Next ole

我现在如何为event method创建和分配ole.Name

 Private Sub myComboBox_Change()
   ...
 End Sub

在Java中,可以使用:myComboBox.setOnChangeListener(...some code of listener interface...);)

1 个答案:

答案 0 :(得分:6)

您需要使用声明为WithEvents的组合框变量创建一个类模块。然后在创建组合框时,将其分配给类的变量。这样,您可以在设计时编写事件过程,但只有在创建组合框后才能监听。

创建一个名为CControlEvents的类模块

Private WithEvents mclsCbx As MSForms.ComboBox

Public Property Set Cbx(ByVal clsCbx As MSForms.ComboBox): Set mclsCbx = clsCbx: End Property
Public Property Get Cbx() As MSForms.ComboBox: Set Cbx = mclsCbx: End Property

Private Sub mclsCbx_Change()

    MsgBox Me.Cbx.name

End Sub

然后在标准模块中

'this is public so it doesn't go out of scope
Public gclsControlEvents As CControlEvents

Sub MakeCombo()

    Dim oleCbx As OLEObject

    'Create the combobox
    Set oleCbx = Sheet1.OLEObjects.Add("Forms.ComboBox.1")
    oleCbx.Object.AddItem "1"
    oleCbx.Object.AddItem "2"

    'hookup the events
    Application.OnTime Now, "HookupEvents"

End Sub

Sub HookupEvents()

    Set gclsControlEvents = New CControlEvents
    Set gclsControlEvents.Cbx = Sheet1.OLEObjects(1).Object

End Sub

现在当组合框发生变化时,事件将会触发。

您必须使用与创建组合框不同的过程来连接组合框。有一个错误(或功能)阻止在同一过程中执行它。我认为与设计模式有关。这就是为什么在创建代码完成后使用Application.OnTime来运行连接代码的原因。