автоматическое выполнение макроса 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 Then4) в строке после "затем" отключите события, чтобы при вызове макроса он не запускал события и не пытался снова запустить этот Worksheet_Change в бесконечном цикле, который аварийно завершает работу Excel и/или иным образом все портит:
Application.EnableEvents = False5) назовите макрос
Call YourMacroName6) включите события обратно, так что следующее изменение (и любые/все другие события) триггер:
Application.EnableEvents = True7) завершите блок 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