【问题标题】:VBA Excel Userform EventHandler for dynamically generated controls not working as expected用于动态生成的控件的 VBA Excel Userform EventHandler 无法按预期工作
【发布时间】:2016-08-26 21:18:09
【问题描述】:

我正在使用 Excel 2013 设计一个用户窗体,其中包含在运行时创建的控件。我无法创建一个会在动态创建的控件的更改事件上触发的函数。

控件包含在一个单独的类模块中,该模块创建并管理它们。我想添加一个触发组合框更改事件的函数,因此我将其声明为 WithEvents:

Private WithEvents myComboBox As MSForms.ComboBox
... other controls and variable declarations...

我有一个函数,它传递了我希望控件所在的框架,以便我可以从类中创建所有组件。

Sub initialize(myID As String, myFrame As MSForms.Frame, Left As Double, Top As Double)
    ...
    Set myComboBox = myFrame.Controls.Add("Forms.ComboBox.1", myID & "_comboBox")
    ...
End Sub

这一切都有效,尽管myComboBox 成功更改了 ComboBox 的显示方式,但已创建 ComboBox 并更改了属性。

因为myComboBox被声明为WithEvents,所以我可以在下拉菜单中找到myComboBox_Change作为选项并将其放入模块中:

Private Sub myComboBox_Change()
    MsgBox ("Change Event Fired")
End Sub

但是这个函数不会运行,我不知道为什么。进行更改时不会出现消息框,并且在此函数中放置的断点不会阻止任何代码运行。我做错了什么?

【问题讨论】:

  • 我自己无法检查,也不确定是否记得正确,但是...尝试“Public WithEvents myComboBox As MSForms.ComboBox”而不是“Private...”
  • 感谢您的建议,但没有任何影响。
  • 你有不止一个吗?动态分配名称为myID & "_comboBox"的目的是什么?
  • 您是否将myComboBox 添加到集合中?如果您可以发布完整的初始化代码,那就更好了。
  • 在调查这一点时,我想通了。谢谢! myComboBox 不直接在集合中。我认为组合框所在的类在一个集合中,但该集合仅在用户窗体的函数中声明。一旦我为整个用户窗体的范围声明了包含组合框的类集合,事件处理就起作用了。

标签: excel vba event-handling userform


【解决方案1】:

在 cyboashu 提出的一些探究性问题的帮助下,我发现了问题所在。包含myComboBox 的类未由为整个用户窗体范围声明的变量持有。函数创建完成后,组件还在myFrame,但是事件触发的函数忘记了

【讨论】:

  • 它可以与Private WithEvents myComboBox As MSForms.ComboBox一起使用吗?
  • 是的,一旦在正确的范围内声明了类,组件是公共的还是私有的都没有关系。两种方式都有效。
猜你喜欢
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2012-10-30
  • 2015-06-23
  • 2019-09-08
相关资源
最近更新 更多