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

标签 vba excel events

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

相关文章:

vba - 如何在合并工作簿末尾添加特定数字

python - Pyglet - 游戏运行缓慢,对事件和东西感到困惑

events - 如何创建具有 `target`属性设置的“事件”实例?

excel - 将多个文本文件的第二行导入 Excel

VBA在预定列中的不同工作表上过去某些单元格值

excel - 带有空单元格的 VLookup

javascript - JS触摸事件挂件点击

excel - 在 Excel 单元格中显示姓名不起作用

excel - 将选定的工作表保存在另一个工作簿中

php - 使用 PHPExcel 数组到 Excel 2007