gpt4 book ai didi

vba - 在 VBA 中以编程方式创建事件监听器

转载 作者:行者123 更新时间:2023-12-01 18:18:48 24 4
gpt4 key购买 nike

是否可以以编程方式在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com