автоматическое выполнение макроса 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