【发布时间】: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