Я динамически добавляю флажки в лист 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