автоматически выполнять макрос Excel при изменении ячейки
-
03-07-2019 - |
Вопрос
Как я могу автоматически выполнять макрос Excel каждый раз, когда изменяется значение в определенной ячейке?
Прямо сейчас мой рабочий код:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
где "H5"
контролируется ли конкретная ячейка и Macro
это имя макроса.
Есть ли способ лучше?
Решение
Ваш код выглядит довольно хорошо.
Однако будьте осторожны, когда вы звоните Range("H5")
это команда быстрого доступа к Application.Range("H5")
, что эквивалентно Application.ActiveSheet.Range("H5")
.Это может быть хорошо, если единственные изменения - это изменения пользователя - что является наиболее типичным - но значения ячеек рабочего листа могут измениться, когда это не активный лист, посредством программных изменений, например.ВБА.
Учитывая это, я бы использовал Target.Worksheet.Range("H5")
:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub
Или вы можете использовать Me.Range("H5")
, если обработчик событий находится на кодовой странице рассматриваемого листа (обычно так и есть):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub
Надеюсь это поможет...
Другие советы
справиться с Worksheet_Change
событие или Workbook_SheetChange
событие.
Обработчики событий принимают аргумент «Цель как диапазон», поэтому вы можете проверить, включает ли изменяющийся диапазон интересующую вас ячейку.
Я предпочитаю этот способ: использовать не ячейку, а диапазон
Dim cell_to_test As Range, cells_changed As Range
Set cells_changed = Target(1, 1)
Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )
If Not Intersect(cells_changed, cell_to_test) Is Nothing Then
Macro
End If
Я потратил много времени на изучение этого и изучение того, как все это работает, после того, как сильно испортил триггеры событий.Поскольку информации было так много, я решил поделиться тем, что нашел, чтобы все работало в одном месте, шаг за шагом, следующим образом:
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
Это требует включения/выключения событий в модулях, что создает проблемы и просто запускает изменение, отключает события, запускает макрос и снова включает события.
У меня есть ячейка, которая связана с онлайн-базой данных акций и часто обновляется.Я хочу запускать макрос при каждом обновлении значения ячейки.
Я считаю, что это похоже на изменение значения ячейки программой или любое обновление внешних данных, но приведенные выше примеры у меня почему-то не работают.Я думаю, проблема в том, что внутренние события Excel не запускаются, но это мое предположение.
Я сделал следующее:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
'Run Macro
End Sub