VBA Macro On Timer для запуска кода с каждым заданным количеством секунд, то есть 120 секунд

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

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


EDIT :

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

Когда рабочая книга открывается первым, выполните этот код:

 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 

Вы можете поместить процедуру Auto_Open событие Auto_Open и изменить то, что сделано в режиме Timer (прямо сейчас он просто обновляет время в 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 

Если вы хотите, чтобы первый fragment кода выполнялся после открытия рабочей книги, просто добавьте задержку в 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 Timer сейчас вместо 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 
  • Как вы используете TimerTask для запуска streamа?
  • Interesting Posts

    Динамический путь к файлу в Django

    Первое развертывание Heroku не выполнено «код ошибки = H10»

    Есть ли способ предотвратить создание Mac файлов подчеркивания dots?

    Безопасно ли использовать блок питания с другим ноутбуком?

    Android копирует существующий проект с новым именем в Android Studio

    Как использовать на странице JSF? Единая форма? Несколько форм? Вложенные формы?

    Отобразить раздел системы EFI

    Почему моя таблица страниц занимает столько памяти?

    Защита от вирусов для флэш-накопителей

    Как я могу использовать тип ввода электронной почты HTML5 с серверной .NET.

    ADB – Android – Получение названия текущей деятельности

    Java не поддерживает множественное наследование, но неявно каждый class в java расширяет Object и позволяет еще один

    Как я могу получить новый выбор в «select» в Angular 2?

    API 2.2 для Wi-Fi Wi-Fi

    Работа над Canvas.clipPath (), которая больше не поддерживается в android

    Давайте будем гением компьютера.