Как долго живет объект в VBA? - PullRequest
0 голосов
/ 07 мая 2019

Я настраиваю книгу Excel с несколькими макросами, которые помогают работать с документом.Одна часть состоит в том, чтобы скопировать существующий Рабочий лист, удалить все Объекты, защитить его паролем и дать ему новое имя.Проблема возникла с функциями, которые у меня были в коде листа.Они скопированы с рабочего листа.Это означало, что копия, которую я имел на Рабочем листе, которая не должна ничего делать, все еще вызывала эти События.

Я нашел обходной путь, который работает следующим образом: я создал класс, который каким-то образом работает как рабочий лист.Класс:

Private WithEvents mwsThis As Worksheet

Public Property Set This(ByVal wsThis As Worksheet): Set mwsThis = wsThis: End Property
Public Property Get This() As Worksheet: Set This = mwsThis: End Property

Создайте объект и «прикрепите» его к рабочему листу.Этот код находится в модуле.

Public gclsEvent As CEvent

Sub Auto_Open()

        Set gclsEvent = New CEvent
        Set gclsEvent.This = Sheet2

End Sub

Объект будет создан при открытии рабочей книги.

Важное замечание: Из-за соображений безопасности удаление кода VBA из кода VBA не является опцией!Я пытался это сделать.

Я добавляю сюда код моего класса.Sub Hide_it_all - еще одна функция класса.Пользовательская форма Verwendungsauswahl является отдельным Code-Modul.Я удалил все комментарии к коду, потому что их не было на английском.

Private WithEvents mwsThis As Worksheet


Public Property Set This(ByVal wsThis As Worksheet): Set mwsThis = wsThis: End Property
Public Property Get This() As Worksheet: Set This = mwsThis: End Property


Private Sub mwsThis_Change(ByVal Target As Range)

   Dim KeyCells As Range


    Set KeyCells = Range("B11", "B8")


    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
            Call Hide_it_all

        MsgBox "Bitte Inbetriebnahmedaten überprüfen."

    End If
End Sub

Private Sub mwsThis_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Cancel = True

    Dim KeyCells As Range

    Set KeyCells = Range("B8")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
            Verwendungsauswahl.Show
    End If

    Cancel = False

End Sub

Теперь к моей проблеме: это работает.И иногда это не так.Я добавил в класс больше методов, которые будут срабатывать, например, когда я дважды щелкаю ячейку и т. Д.

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

Поскольку я относительно новичок в VBA и программировании, я думаю, что мне здесь чего-то не хватает в отношении объекта и его свойств.Особенно о жизни объекта.Может ли кто-нибудь просветить меня?

...