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

是否有可能以编程方式创build一个组合comboBox上的event method

在工作表上,我有一个ComboBox ,我可以通过代码得到它的名字:

  Dim ole As OLEObject For Each ole In ActiveSheet.OLEObjects If TypeName(ole.Object) = "ComboBox" Then ' ole.Name '<<<<<<<< here End If Next ole 

我现在如何创build和分配一个ole.Nameevent method

  Private Sub myComboBox_Change() ... End Sub 

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

您需要创build一个带有一个声明为WithEvents的comboboxvariables的类模块。 然后,当您创buildcombobox时,将其分配给类的variables。 这样,您可以在devise时编写事件过程,但是只有在创buildcombobox后才能听到它。

创build一个名为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 

现在,当combobox发生变化时,事件将会触发。

您必须以不同于创buildcombobox的过程来连接combobox。有一个错误(或function),阻止在同一过程中执行它。 与devise模式有关,我想。 这就是为什么在创build代码完成后使用Application.OnTime运行连接代码的原因。