excel - 动态添加 OLEObject。事件不会触发
问题描述
我正在使用类模块将 CheckBoxes 动态添加到 Excel 工作表中,并希望它们触发事件。因此,首先我将 OLEObjects 添加到工作表中,然后通过使用这些 OLEObjects 创建我的类对象并将它们添加到 Collection 中来初始化它们,以便所有 CheckBoxes 都有一个事件处理函数。
如果我运行 subs 来添加 OLEObjects,然后分别初始化它们,那么它可以正常工作。事件被触发。但是,如果我结合添加 OLEObjects 和初始化,则不会触发任何事件。更重要的是,如果 OLEObjects 先前已初始化并且事件正常,然后我添加了另一个 OLEObject,那么它似乎会禁用所有 OLEObjects 中的事件。Application.EnableEvents = TRUE 一直
这是代码。类模块(clsCheckBox):
Public WithEvents cmdCheckBox As MSForms.CheckBox
Private Sub cmdCheckBox_Change()
MsgBox "Changed"
End Sub
工作表模块中的代码:
Dim coll_obj As Collection
Public Sub InitializeObjects()
Dim myObj As OLEObject
Dim obj As clsCheckBox
Set coll_obj = New Collection
For Each myObj In Worksheets("Objects").OLEObjects
If TypeName(myObj.Object) = "CheckBox" Then
Set obj = New clsCheckBox
Set obj.cmdCheckBox = myObj.Object
coll_obj.add obj
End If
Next myObj
Set obj = Nothing
End Sub
Public Sub AddObjects()
' a set of something like this
ActiveSheet.OLEObjects.add "Forms.CheckBox.1", Left:=10, top:=10, Height:=13, Width:=13
End Sub
因此,如果我先运行 AddObjects,然后运行 InitializeObjects,则会触发 CheckBoxes 事件。但是如果我运行以下事件不会触发
Public Sub DoObjects()
AddObjects
InitializeObjects
End Sub
此外,如果 OLEObjects 先前已初始化并且事件被触发 OK,然后我添加另一个 OLEObject,例如再次运行 AddObjects,那么即使对象存在于集合中并且 Application.EnableEvents = true,事件也会停止触发
解决方案
尝试在您的班级中初始化事件。尝试通过以下方式修改您的课程:
Option Explicit
Public WithEvents cmdCheckBox As MSForms.CheckBox
Public Sub Initialize(ByVal ctrl As MSForms.CheckBox)
Set cmdCheckBox = ctrl
End Sub
Private Sub cmdCheckBox_Change()
MsgBox "Changed"
End Sub
至少,这是我在动态创建控件时使用的包装类。我没有尝试复制您的代码并对其进行测试。
而且这段代码不是我创造的。几年前我在网上发现了类似的东西,我采用了它......
推荐阅读
- devextreme - Devextreme Angular 模态对话框
- java - Android/Java:“错误:找不到符号导入 com.here.android.mpa.mapping.SupportMapFragment;”
- javascript - Firebase 函数 - 如何从云函数返回文档快照?
- javascript - 如何避免胜利图表中 x 轴上的重复日期
- python - RuntimeError:执行任何类型的 PIP 操作时都需要 Python 3.5 或更高版本
- deep-learning - 获取 nan 作为损失值
- java - 具有 Maven 依赖项的 Java 项目编译但运行时不选择导入的类
- python - 如何更改名为 x 的字符串?
- java - 如何删除 Java 中的序列化对象?
- bash - 将 bash 中的行分组到最大行数