автоматическое выполнение макроса Excel при изменении ячейки
как я могу автоматически выполнять макрос Excel при каждом изменении значения в определенной ячейке?
прямо сейчас, мой рабочий код:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
здесь "H5"
отслеживается ли конкретная ячейка и Macro
- это имя макроса.
есть ли лучший способ?
5 ответов
ваш код выглядит довольно хорошо.
будьте осторожны, однако, для вызова Range("H5")
ярлык команду Application.Range("H5")
, что эквивалентно Application.ActiveSheet.Range("H5")
. Это может быть хорошо, если единственными изменениями являются пользовательские изменения, что является наиболее типичным, но возможно, что значения ячеек листа изменятся, когда он не является активным листом с помощью программных изменений, например VBA.
имея это в виду, я хотел бы использовать 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
событие.
обработчики событий принимают аргумент "Target As Range", поэтому вы можете проверить, включает ли изменяющийся диапазон интересующую вас ячейку.
Я предпочитаю этот способ, не через ячейку, а диапазон
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) представление кода по умолчанию - " General."Из выпадающего списка в верхней середине выберите " рабочий лист."
3) Private Sub Worksheet_SelectionChange уже существует, как и должно быть, оставьте его в покое. Скопируйте / вставьте код Майка Розенблюма сверху и измените его .Диапазон ссылки на ячейку, за которой вы наблюдаете для изменения (B3, в моем случае). Однако не размещайте свой макрос (я удалил слово "макрос" после "тогда"):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
или из выпадающего списка в левом верхнем углу выберите "Изменить" и в пространстве между Private Sub и конец 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")) Is Nothing Then
'Run Macro
End Sub