Выполнение процедуры VBA Excel без аргументов в назначенное время или через определенный промежуток времени с помощью метода Application.OnTime.
Синтаксис метода Application.OnTime
1 |
Application.OnTime EarliestTime, Procedure, LatestTime, Schedule |
Параметры метода Application.OnTime
Основные параметры:
- EarliestTime – время, когда необходимо выполнить указанную процедуру.
- Procedure – имя выполняемой процедуры.
Процедура Procedure
не должна иметь аргументов и не может быть объявлена в модуле формы.
В качестве аргументов параметра EarliestTime
используются следующие функции:
- TimeValue(«hh:mm:ss») – чтобы запланировать выполнение указанной процедуры в определенное время суток.
- Now + TimeValue(«hh:mm:ss») – чтобы запланировать выполнение указанной процедуры по истечении заданного времени с момента запуска процедуры с методом
Application.OnTime
.
Дополнительные параметры:
- LatestTime – интервал времени, в течение которого можно запустить указанную процедуру, если Microsoft Excel в назначенное время выполняет другую процедуру. По умолчанию указанная процедура будет запущена в любом случае после завершения предыдущей процедуры. Подробнее об этом читайте на сайте разработчика.
- Schedule – если задано значение True, будет запланировано выполнение указанной процедуры, False – очистка ранее установленной процедуры. Значение по умолчанию – True.
Параметр LatestTime я не тестировал, а вот любое применение параметра Schedule в значении False у меня в Excel 2016 вызывает ошибку. Поэтому в примерах я эти параметры не использую.
Примеры выполнения процедур по времени
Пример 1
Однократный запуск внешней процедуры через заданный промежуток времени:
1 2 3 4 5 6 7 |
Sub Primer1() Application.OnTime Now + TimeValue("00:00:10"), "Procedure1" End Sub Sub Procedure1() MsgBox "Процедура запущена!" End Sub |
Процедура Procedure1
будет выполнена через 10 секунд после запуска процедуры Primer1
.
Пример 2
Однократный запуск внешней процедуры в заданное время:
1 2 3 4 5 6 7 |
Sub Primer2() Application.OnTime TimeValue("12:00:00"), "Procedure2" End Sub Sub Procedure2() MsgBox "Системное время - 12 часов!" End Sub |
Процедура Procedure2
будет выполнена в 12 часов по системному времени компьютера, если ранее была запущена процедура Primer2
.
Пример 3
Многократный запуск внешней процедуры:
1 2 3 4 5 6 7 8 9 |
Sub Primer3() Application.OnTime Now + TimeValue("00:00:01"), "Procedure3" End Sub Sub Procedure3() Cells(1, 1) = Cells(1, 1) + 1 If Cells(1, 1) = 100 Then Exit Sub Call Primer3 End Sub |
Процедура Primer3
запускает «условно бесконечный» секундомер в ячейке A1 активного рабочего листа, ограниченный 100 секундами с помощью условия.
Пример 4
Сохранение рабочей книги Excel каждые 10 минут:
1 2 3 4 5 6 7 8 |
Sub Primer4() Application.OnTime Now + TimeValue("00:10:00"), "Procedure4" End Sub Sub Procedure4() ThisWorkbook.Save Call Primer4 End Sub |
Процедуры Primer4() и Procedure4() будут работать в бесконечном цикле, сохраняя рабочую книгу Excel каждые 10 минут, до закрытия этой книги. Закрывать книгу следует не менее, чем через 10 минут после внесения последних изменений, для гарантированного их сохранения.
Фразы для контекстного поиска: пауза, задержка, приостановка, задержка выполнения кода.
Если пример первый запустить без изменений, то произойдет ошибка, т.к. эту процедуру просто не найдут, но если убрать в названии процедуры «my», то все отлично работает!)
Sub Primer1()
Application.OnTime Now + TimeValue("00:00:10"), "Procedure1"
End Sub
Sub Procedure1()
MsgBox "Процедура запущена!"
End Sub
Спасибо, Александра! Ошибку исправил.
Обсуждение закрыто.