Динамически добавленный OLEObject. События не стреляют - PullRequest
1 голос
/ 02 марта 2020

Я динамически добавляю флажки в лист Excel с помощью модуля классов и хочу, чтобы они запускали события. Поэтому сначала я добавляю OLEObjects на лист, а затем инициализирую их, создавая объекты класса с этими OLEObjects и добавляя их в Collection, чтобы была единая функция обработки событий для всех CheckBoxes.

Если я запускаю подпрограммы, чтобы добавить объекты OLEObject, а затем инициализировать их отдельно, тогда все работает хорошо. События происходят. Но если я объединю добавление OLEObjects и инициализацию, то никакие события не запускаются. Более того, если объекты OLEObject были предварительно инициализированы и события были в порядке, а затем я добавляю другой объект OLEObject, то создается впечатление, что он отключает события от всех объектов OLEObject. 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

Также, если объекты OLEObject были предварительно инициализированы и события были запущены, а затем я добавляю еще один объект OLEObject, как снова запустить AddObjects, тогда события перестают срабатывать, даже если объекты существуют в коллекции и Application.EnableEvents = true

Ответы [ 3 ]

0 голосов
/ 02 марта 2020

Я обнаружил, что это известная проблема с объектами ActiveX. Решение состоит в разделении процесса и использовании каждой части на отдельном событии. Как я могу использовать кнопку, чтобы запустить процесс и добавить объекты в событие button_MouseDown и инициализировать объекты в button_Click. Это работает.

0 голосов
/ 02 марта 2020

Вы можете использовать application.ontime: (в этом случае ваши IntitalizeObjects будут запускаться после End Sub DoObjects ()

Public Sub DoObjects()
    AddObjects
    Application.OnTime Now, "InitializeObjects"
End Sub
0 голосов
/ 02 марта 2020

Попробуйте инициализировать событие внутри вашего класса. Попробуйте изменить свой класс следующим образом:

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

По крайней мере, это класс-оболочка, который я использовал при создании элементов управления на лету. Я не пытался воспроизвести ваш код и протестировать его.

И этот фрагмент кода не является моим творением. Я нашел что-то похожее на net несколько лет go, и я принял это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...