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

在VBA中以编程方式创建事件侦听器,vba,excel,events,Vba,Excel,Events,是否可以通过编程方式在组合框上创建一个事件方法 在工作表上,我有一个组合框,我可以通过代码获取其名称: Dim ole As OLEObject For Each ole In ActiveSheet.OLEObjects If TypeName(ole.Object) = "ComboBox" Then ' ole.Name '<<<<<<<< here End If

是否可以通过编程方式在组合框上创建一个
事件方法

在工作表上,我有一个
组合框
,我可以通过代码获取其名称:

       Dim ole As OLEObject
       For Each ole In ActiveSheet.OLEObjects

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

在Java中,可以使用:
mycombox.setOnChangeListener(…监听器接口的一些代码…
;)

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

创建名为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
现在,当组合框更改时,事件将触发


您必须在与创建组合框不同的过程中连接组合框。有一个bug(或特性)阻止在同一过程中执行此操作。我认为这与设计模式有关。这就是为什么在创建代码完成后使用Application.OnTime运行连接代码。

请参阅“创建事件过程”-您不能在设计时而不是在运行时设置它吗?这个问题可能有帮助吗@看起来像我想要的。出于好奇,现在就试试吧,为什么你要用编程的方式来做呢?是因为您动态创建了这些对象吗?这值得打个绿色的勾:-)
'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