【问题标题】:Programmatically create event listener in VBA在 VBA 中以编程方式创建事件侦听器
【发布时间】:2014-02-12 20:02:40
【问题描述】:

是否可以在comboBox 上以编程方式创建event method

在工作表上我有一个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 创建和分配event method

 Private Sub myComboBox_Change()
   ...
 End Sub

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

【问题讨论】:

  • 参见“创建事件过程”​​-cpearson.com/excel/vbe.aspx
  • 你不能在设计时而不是运行时设置它吗?
  • 也许这个问题会有所帮助? stackoverflow.com/questions/14994235/…
  • @hstay 看起来像我想要的。立即尝试
  • 出于好奇,为什么必须以编程方式执行此操作?是因为你动态地创建了这些对象吗?

标签: vba excel events


【解决方案1】:

您需要使用声明为 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 来运行连接代码的原因。

【讨论】:

  • 这值得一个绿色勾号:-)
猜你喜欢
  • 2011-12-26
  • 2020-05-30
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多