Я настраиваю книгу 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 и программировании, я думаю, что мне здесь чего-то не хватает в отношении объекта и его свойств.Особенно о жизни объекта.Может ли кто-нибудь просветить меня?