2014-02-12 80 views
12

是否有可能以编程方式在comboBox上创建event method以编程方式在VBA中创建事件侦听器

表上我有一个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 methodole.Name

Private Sub myComboBox_Change() 
    ... 
End Sub 

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

+6

请参阅“创建事件过程”​​ - http://www.cpearson.com/excel/vbe.aspx –

+0

您是否可以在设计时而不是运行时设置它? –

+2

也许这个问题可能有帮助吗? http://stackoverflow.com/questions/14994235/handling-events-for-oleobject-commandbuttons-created-at-runtime – hstay

回答

4

您需要创建一个带有声明为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运行连接代码的原因。

+0

这值得一个绿色的勾号:-) – SlowLearner

相关问题