Application.EnableEvents
не является переменной, это свойство. Вы не можете передать свойство по ссылке вроде этого в VB (A), компилятор создаст временную копию текущего значения свойства, и ваш часовой будет «закрыт» на копии.
Чтобы управлять свойствами объекта таким образом, вы можете сделать это:
Создайте класс, назовите его, например. SentryForPropertiesVariant
и использовать подобный код:
Option Explicit
Private m_Obj As Object
Private m_PropertyName As String
Private m_OldValue As Variant
Public Sub Init(ByVal obj As Object, ByVal PropertyName As String, ByVal NewValue As Variant)
Set m_Obj = obj
m_PropertyName = PropertyName
m_OldValue = CallByName(obj, m_PropertyName, VbGet)
CallByName m_Obj, m_PropertyName, VbLet, NewValue
End Sub
Private Sub Class_Terminate()
If Not m_Obj Is Nothing Then
CallByName m_Obj, m_PropertyName, VbLet, m_OldValue
End If
End Sub
Затем использовать:
Dim s As SentryForPropertiesVariant
Set s = New SentryForPropertiesVariant
s.Init Application, "EnableEvents", False
Вы также можете иметь вспомогательную функцию в модуле:
Public Function CreateSentry(ByVal obj As Object, ByVal PropertyName As String, ByVal NewValue As Variant) As SentryForPropertiesVariant
Set CreateSentry = New SentryForPropertiesVariant
CreateSentry.Init obj, PropertyName, NewValue
End Function
в какой момент использования становится проще:
Dim s As SentryForPropertiesVariant
Set s = CreateSentry(Application, "EnableEvents", False)
и в этом случае вы, вероятно, захотите заменить Public Sub Init
на Friend Sub Init
.
Если вы планируете хранить свой часовой класс в общей надстройке (.xla), в любом случае вы должны будете иметь такую вспомогательную функцию, потому что классы, определенные в надстройках, не могут быть созданы из кода, находящегося в других книгах, поэтому решение также должно определить функцию в той же книге, что и класс, который создаст экземпляр и вернет его внешнему вызывающему.
Наконец, удобно контролировать время жизни таких часовых с With
(напоминает C# 's using
):
With CreateSentry(Application, "EnableEvents", False)
'Here EnableEvents is False
End With
'Here it's True
Спасибо, это смехотворно прекрасный ответ за такое короткое время! Я подтвердил, что это работает полностью, как я ожидал, единственным недостатком будет то, что из-за имени свойства, переданного как строка, ошибка должна быть обнаружена только во время выполнения. Может быть, я должен определить часто используемые имена свойств как константы. – mnish