В зависимости от ваших потребностей, любой из трех различных подходов может удовлетворить ваши потребности.
Событие Excel Worksheet_Change возникает, когда рабочий лист изменяется пользователем, исключая изменения значений формул ячеек из-за пересчета, но включая изменения по коду. Код VBA обычно будет выглядеть так:
Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
' <test or set scope of action of the macro>
' <do something>
Application.EnableEvents = True
End Sub
Аргумент Target является встроенным и всегда ссылается на ячейку, которая была изменена и инициировала событие. Ваш код должен быть размещен в модуле рабочего листа (доступ к нему проще всего щелкнуть правой кнопкой мыши на вкладке рабочего листа и выбрать «Просмотреть код»), а не в стандартном модуле.
Событие Worksheet_Calculate наступает после пересчета листа, включая автоматический пересчет. Код будет выглядеть так:
Sub Worksheet_Calculate()
Application.EnableEvents = False
' <do something>
Applicaton.EnableEvents = True
End Sub
Обратите внимание, что это событие не обеспечивает цель, то есть срабатывает для всех пересчитанных ячеек, а не для одной. Если ваш код не вызывает перерасчет, вам не нужно будет отключать, а затем повторно включать события. Если вы хотите, чтобы ваш код пересчитывал только выбранные ячейки, вы можете установить расчет вручную (Application.Calculation = xlManual), а затем сбросить его на автоматический при выходе из процедуры (Application.Calculation = xlAutomatic). Как и в случае события Worksheet_Change, ваш код должен быть помещен в модуль рабочего листа.
Или, наконец, вы можете установить таймер для периодического перезапуска кода, используя событие Excel.OnTime или таймеры Windows. Ваша процедура должна включать код для запуска таймера и его остановки. Пример использования события OnTime см. В этом SO answer . Объяснение использования таймера Windows (а также события Application.OnTime) см. В обзоре Чипа Пирсона здесь .