是否可以在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...)
;)
答案 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来运行连接代码的原因。