автоматически выполнять макрос Excel при смене ячейки - PullRequest
86 голосов
/ 03 января 2009

Как я могу автоматически выполнять макрос Excel при каждом изменении значения в определенной ячейке?

Сейчас мой рабочий код:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub

, где "H5" - конкретная отслеживаемая ячейка, а Macro - имя макроса.

Есть ли лучший способ?

Ответы [ 5 ]

105 голосов
/ 06 января 2009

Ваш код выглядит довольно хорошо.

Будьте осторожны, однако, для вашего звонка на 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

Надеюсь, это поможет ...

7 голосов
/ 03 января 2009

Обработка события Worksheet_Change или Workbook_SheetChange.

Обработчики событий принимают аргумент "Target As Range", поэтому вы можете проверить, включает ли изменяемый диапазон ячейку, в которой вы заинтересованы.

3 голосов
/ 04 января 2009

Я предпочитаю этот способ, не используя ячейку, а диапазон

    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
2 голосов
/ 12 июля 2018

Я провел много времени, исследуя это и изучая, как все это работает, после того, как действительно испортил триггеры событий. Поскольку было так много разрозненной информации, я решил поделиться тем, что я нашел, чтобы работать все в одном месте, шаг за шагом, следующим образом:

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

Это включает в себя включение / выключение событий из модулей, что создает проблемы и просто позволяет переключать изменения, выключать события, запускать макрос и снова включать события.

0 голосов
/ 20 апреля 2010

У меня есть ячейка, которая связана с онлайн-базой данных и часто обновляется. Я хочу запускать макрос всякий раз, когда значение ячейки обновляется.

Я считаю, что это похоже на изменение значения ячейки программой или любым внешним обновлением данных, но приведенные выше примеры как-то не работают для меня Я думаю, что проблема в том, что внутренние события 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...