Я провел много времени, исследуя это и изучая, как все это работает, после того, как действительно испортил триггеры событий. Поскольку было так много разрозненной информации, я решил поделиться тем, что я нашел, чтобы работать все в одном месте, шаг за шагом, следующим образом:
1) Откройте редактор VBA, в проекте VBA (YourWorkBookName.xlsm) откройте объект Microsoft Excel и выберите лист, к которому будет относиться событие изменения.
2) Представление кода по умолчанию - «Общее». В раскрывающемся списке вверху по середине выберите «Рабочий лист».
3) Private Sub Worksheet_SelectionChange уже существует, как и должно быть, оставьте его в покое. Скопируйте / вставьте код Майка Розенблюма сверху и измените ссылку .Range на ячейку, за которой вы наблюдаете изменения (B3, в моем случае). Однако не размещайте свой макрос (я удалил слово «Макрос» после слова «Затем»):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
или в раскрывающемся списке слева вверху выберите «Изменить» и в промежутке между Private Sub и End Sub вставьте If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
4) В строке после «Затем» отключите события, чтобы при вызове макроса он не вызывал события и не пытался снова запустить этот Worksheet_Change в бесконечном цикле, который приводит к сбою Excel и / или иным образом все портит. :
Application.EnableEvents = False
5) Назовите свой макрос
Call YourMacroName
6) Снова включить события, чтобы сработало следующее изменение (и любые / все другие события):
Application.EnableEvents = True
7) Завершить блок If и Sub:
End If
End Sub
Весь код:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
Application.EnableEvents = False
Call UpdateAndViewOnly
Application.EnableEvents = True
End If
End Sub
Это включает в себя включение / выключение событий из модулей, что создает проблемы и просто позволяет переключать изменения, выключать события, запускать макрос и снова включать события.