首页 > 解决方案 > 动态添加 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,事件也会停止触发

标签: excelvba

解决方案


尝试在您的班级中初始化事件。尝试通过以下方式修改您的课程:

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

至少,这是我在动态创建控件时使用的包装类。我没有尝试复制您的代码并对其进行测试。

而且这段代码不是我创造的。几年前我在网上发现了类似的东西,我采用了它......


推荐阅读