У меня есть потребность выполнять часть кода каждые 120 секунд. Я ищу простой способ сделать это в VBA. Я знаю, что было бы возможно получить значение таймера от Auto_Open
событие для предотвращения необходимости использовать магическое число но я не могу вполне добраться, как исчерпать таймер, чтобы заставить что-то работать каждые 120 секунд.
Я действительно не хочу использовать бесконечный цикл со сном, если я могу избежать его.
Править:
Кросспостинг на основе предоставленного ответа в: Excel Приложение VBA. OnTime. Я думаю, что это - плохая идея использовать это... мысли так или иначе?
Да, вы можете использовать для этого Application.OnTime
, а затем поместить его в цикл. Это что-то вроде будильника, где вы удерживаете нажатой кнопку повтора, когда хотите, чтобы он снова зазвонил. Следующее обновляет ячейку A1 каждые три секунды со временем.
Dim TimerActive As Boolean
Sub StartTimer()
Start_Timer
End Sub
Private Sub Start_Timer()
TimerActive = True
Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
End Sub
Private Sub Stop_Timer()
TimerActive = False
End Sub
Private Sub Timer()
If TimerActive Then
ActiveSheet.Cells(1, 1).Value = Time
Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
End If
End Sub
Вы можете поместить процедуру StartTimer
в событие Auto_Open
и изменить то, что делается в процедуре Timer
(сейчас это просто обновление времени в A1 с ActiveSheet.Cells (1, 1) .Value = Time
).
Примечание : вам понадобится код (помимо StartTimer
) в модуле, а не в модуле рабочего листа. Если он у вас есть в модуле рабочего листа, код требует небольшой модификации.
(Это перефразировано из файлов справки MS Access. Я уверен, что в XL есть нечто подобное.) По сути, TimerInterval - это свойство уровня формы. После установки используйте вспомогательный Form_Timer для выполнения намеченного действия.
Sub Form_Load()
Me.TimerInterval = 1000 '1000 = 1 second
End Sub
Sub Form_Timer()
'Do Stuff
End Sub