Макрос VBA в стиле таймера для запуска кода каждое заданное количество секунд, т. е. 120 секунд

Мне нужно запускать фрагмент кода каждые 120 секунд. Я ищу простой способ сделать это в VBA. Я знаю, что можно было бы получить значение таймера от Auto_Open событие, чтобы предотвратить использование магического числа, но я не могу понять, как запустить таймер, чтобы запустить что-то каждые 120 секунд.

Я действительно не хочу использовать бесконечный цикл со сном, если я могу этого избежать.


редактировать:

кросс-пост на основании предоставленного ответа: приложение Excel VBA.Благовременна. Я думаю, это плохая идея использовать это... мысли в любом случае?

6 ответов


при первом открытии книги выполните следующий код:

alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"

тогда просто имейте макрос в книге под названием "EventMacro", который повторит его.

Public Sub EventMacro()
    '... Execute your actions here'
    alertTime = Now + TimeValue("00:02:00")
    Application.OnTime alertTime, "EventMacro"
End Sub

Да, вы можете использовать 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 proceedure (прямо сейчас это просто обновление времени в A1 с ActiveSheet.Cells(1, 1).Value = Time).

Примечание: вы хотите код (кроме StartTimer) в модуле, а не в модуль листа. Если он есть в модуле рабочего листа, код требует незначительных изменений.


В книге событий:

Private Sub Workbook_Open()
    RunEveryTwoMinutes
End Sub

в модуле:

Sub RunEveryTwoMinutes()
    //Add code here for whatever you want to happen
    Application.OnTime Now + TimeValue("00:02:00"), "RunEveryTwoMinutes"
End Sub

Если вы хотите выполнить только первый фрагмент кода после откроется книга, а затем просто добавьте задержку в 2 минуты в Workbook_Open событие


(это перефразировано из файлов справки MS Access. Я уверен, что XL имеет что-то подобное.) В принципе, TimerInterval является свойством уровня формы. После установки используйте sub Form_Timer для выполнения запланированного действия.

Sub Form_Load()
    Me.TimerInterval = 1000 '1000 = 1 second
End Sub

Sub Form_Timer()
    'Do Stuff
End Sub

Я нашел, что с помощью OnTime может быть болезненным, особенно когда:

  1. вы пытаетесь кодировать, и фокус на окне прерывается каждый раз, когда событие срабатывает.
  2. у вас открыто несколько книг, вы закрываете ту, которая должна использовать таймер, и она продолжает запускать и открывать книгу (если вы забыли правильно убить событие).

эта статья чипа Пирсона было очень познавательно. Я предпочитайте использовать таймер Windows сейчас, а не OnTime.


мое решение:

Option Explicit
Public datHora As Date

Function Cronometro(action As Integer) As Integer 
'This return the seconds between two >calls
Cronometro = 0
  If action = 1 Then 'Start
    datHora = Now
  End If
  If action = 2 Then 'Time until that moment
    Cronometro = DateDiff("s", datHora, Now)
  End If
End Function

Как использовать? Простой...

dummy= Cronometro(1) ' This starts the timer

seconds= Cronometro(2) ' This returns the seconds between the first call and this one