автоматически выполнять макрос Excel при изменении ячейки

StackOverflow https://stackoverflow.com/questions/409434

Вопрос

Как я могу автоматически выполнять макрос 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top