是否可以以编程方式在 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
现在如何为 ole.Name
创建并分配一个事件方法
:
Private Sub myComboBox_Change()
...
End Sub
在 Java 中,可以通过以下方式完成:myComboBox.setOnChangeListener(...监听器接口(interface)的一些代码...)
;)
最佳答案
您需要创建一个类模块,其中包含声明为 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 在创建代码完成后运行连接代码。
关于vba - 在 VBA 中以编程方式创建事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21738405/