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

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) представление кода по умолчанию - "общие."Из выпадающего списка в верхней средней части выберите " рабочий лист."

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

или из выпадающего списка в верхнем левом углу, выберите "Изменить" и в пространстве между частными суб и конец подпрограммы, вставить 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 и Тема:

    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