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