Использование таймера в макросах MS Office VBA

Для тех из нас, кто глубоко задумался VB.NETпутешествие обратно в VB6 может быть путаница Использование таймера в VB6 похоже на это. В то же время добавление синхронизированных процессов в ваш код не очевидно для новых пользователей макросов VBA.

Таймеры для новичков

кодирование Макрос Word VBA для автоматического определения времени теста, написанного в Word, является типичной причиной использования таймера. Другая распространенная причина - видеть, сколько времени уходит на разные части вашего кода, чтобы вы могли работать над оптимизацией медленных разделов. Иногда вам может понадобиться проверить, происходит ли что-либо в приложении, когда компьютер, кажется, просто бездействует, что может быть проблемой безопасности. Таймеры могут сделать это.

Запустить таймер

Вы запускаете таймер, кодируя оператор OnTime. Это утверждение реализовано в Word и Excel, но имеет разный синтаксис в зависимости от того, какой вы используете. Синтаксис для Word:

выражение. Время (Когда, Имя, Допуск)

Синтаксис для Excel выглядит следующим образом:

instagram viewer

выражение. Временное время (Самое раннее время, Процедура, Самое позднее время, Расписание)

Оба имеют первый и второй общий параметр. Второй параметр - это имя другого макроса, который запускается при достижении времени в первом параметре. По сути, кодирование этого оператора похоже на создание подпрограммы события в терминах VB6 или VB.NET. Событие достигает времени по первому параметру. Подпрограмма события является вторым параметром.

Это отличается от того, как это кодируется в VB6 или VB.NET. С одной стороны, макрос, указанный во втором параметре, может быть в любом доступном коде. В документе Word Microsoft рекомендует поместить его в шаблон документа Normal. Если вы поместите его в другой модуль, Microsoft рекомендует использовать полный путь: Project. Модуль. Macro.

Выражение обычно является объектом Application. Документация Word и Excel гласит, что третий параметр может отменить выполнение макроса события в случае, если диалог или какой-либо другой процесс препятствует его запуску в течение определенного времени. В Excel вы можете запланировать новое время на случай, если это произойдет.

Кодирование макроса временного события

Этот код в Word предназначен для администратора, который хочет отобразить уведомление об истечении времени тестирования и распечатать результат теста.

Public Sub TestOnTime ()
Debug. Print "Будильник сработает через 10 секунд!"
Debug. Печать («До Времени:» и сейчас)
alertTime = Now + TimeValue ("00:00:10")
Заявка. OnTime alertTime, "EventMacro"
Debug. Печать («После Времени:» и сейчас)
End Sub
Sub EventMacro ()
Debug. Печать («Выполнение макроса события:» и сейчас)
End Sub

Это приводит к следующему содержанию в ближайшем окне:

Будильник сработает через 10 секунд!
До Времени: 25.12.2000 19:41:23
После Времени: 25.12.2000 19:41:23
Макрос события: 27.02.2010 19:41:33

Вариант для других приложений Office

Другие приложения Office не поддерживают OnTime. Для тех, у вас есть несколько вариантов. Во-первых, вы можете использовать функцию Timer, которая просто возвращает количество секунд, прошедших с полуночи на вашем ПК, и выполняет свою собственную математику, или вы можете использовать вызовы API Windows. Использование вызовов Windows API имеет преимущество в том, что он более точен, чем таймер. Вот процедура, предложенная Microsoft, которая делает свое дело:

Закрытое объявление функции getFrequency Lib "kernel32" _
Псевдоним "QueryPerformanceFrequency" (cyFrequency As Currency) как длинный
Закрытая функция объявления getTickCount Lib "kernel32" _
Псевдоним "QueryPerformanceCounter" (cyTickCount As Currency) как долго
Sub TestTimeAPICalls ()
Dim dTime As Double
dTime = MicroTimer
Dim StartTime как одиночный
StartTime = Таймер
Для я = 1 до 10000000
Dim J As Double
J = Sqr (я)
следующий
Debug. Печать («Время MicroTimer было:» & MicroTimer - dTime)
End Sub
Функция MicroTimer () как двойная
'
«Возвращает секунды.
'
Dim cyTicks1 в качестве валюты
Статическая cyFrequency As Currency
'
MicroTimer = 0
«Получить частоту.
Если cyFrequency = 0, тогда getFrequency cyFrequency
«Получить клещи.
getTickCount cyTicks1
Секунды
Если cyFrequency, то MicroTimer = cyTicks1 / cyFrequency
Конечная функция

instagram story viewer