Применение функции Timer в VBA Excel для приостановки выполнения приложений и определения времени работы процедур. Примеры использования.
Описание функции Timer
На сайте разработчика сказано, что в Windows функция Timer возвращает дробные части секунды. О порядке дробной части там информации нет. Попробуем выяснить это сами, запустив в редакторе VBA Excel подпрограмму со строкой
1 |
MsgBox "Timer = " & Timer |
Исходя из результата, отображенного в информационном окне MsgBox, будем считать, что функция Timer возвращает сотые доли секунды. Во время экспериментов с процедурой Vremya из Примера 2 результат вычисления разницы между двумя значениями функции Timer достигал шести знаков после запятой, и один раз – семи.
Примеры использования в VBA Excel
Пример 1
Присвоение значения функции Timer переменной:
1 2 |
Dim x As Single x = Timer |
Пример 2
Код VBA Excel для приостановки приложений:
1 2 3 4 5 6 |
Dim Start As Single, Pause As Single Start = Timer Pause = 0.5 Do While Timer < Start + Pause DoEvents Loop |
- Start – переменная, в которую записывается первоначальное значение таймера.
- Pause – время в секундах (до сотых значений), на которое следует приостановить программу.
Функция DoEvents во время выполнения цикла передает управление операционной системе для обработки других событий. По рекомендации разработчиков не следует использовать DoEvents в тех случаях, когда
- приостановленная процедура может быть запущена повторно из другой части вашего кода;
- другие приложения могут обратиться к приостановленной процедуре.
Код для приостановки приложений можно использовать как отдельную подпрограмму, вставляя ее имя с указанием интервала в нужные места других процедур:
1 2 3 4 5 6 7 |
Sub StopSub(Pause As Single) Dim Start As Single Start = Timer Do While Timer < Start + Pause DoEvents Loop End Sub |
Проверяем работоспособность подпрограммы StopSub:
1 2 3 4 5 6 |
Sub Vremya() Dim x As Single x = Timer Call StopSub (3) MsgBox Timer - x End Sub |
Точный или почти точный результат будет только при использовании в качестве аргумента целых секунд, в том числе и в примере кода, предложенного разработчиком.
Такой способ приостановки приложений можно использовать в VBA Excel при создании бегущей строки.
Пример 3
Функцию Timer можно использовать для замера времени работы процедуры. Мы ее уже использовали для определения времени выполнения подпрограммы StopSub:
1 2 3 4 5 6 |
Sub Vremya() Dim x As Single x = Timer Call MySub MsgBox Timer - x End Sub |
Замените MySub на имя вашей подпрограммы и запустите код в редакторе VBA Excel. Информационное окно MsgBox покажет время работы процедуры.
Фразы для контекстного поиска: пауза, задержка, приостановка, задержка выполнения кода.
Здравствуйте, Евгений! Здравствуйте, коллеги!
Помогите, пожалуйста, разобраться. Положенные сутки в одиночку продумал 🙂
Задача: в UserForm нужно подсветить контрол SpinButton1 при событии Change, изменив на 2с его фон .BackColor, после 2с вернуть .BackColor на начальный. Код ниже.
Код не работает в смысле назначения – изменения .BackColor на экране. При этом Debug’и исправно выдают коды будто бы изменённых цветов, и раскомментированный любой MsgBox тоже приводит к искомой покраске контрола.
Добавление DoEvents: перед Loop тоже приводит к нужной покраске на экране, но возникает дребезг, т.е. срабатыванию Change 2-3 раза при одном нажатии.
Что в коде не так, и в каком направлении думать, если данный код почему-то не имеет права на существование?
Мои тесты показали, что элемент управления SpinButton ведет себя очень странно. С этим кодом, через несколько кликов, SpinButton начинает срабатывать от наведения на него курсора:
Не работает SpinButton правильно даже в этом варианте, где изменение цвета происходит в TextBox1:
Здравствуйте, Евгений!
Спасибо за ответ и уделённое время.
Неожиданной оказалась причина не в неумении писать код, а в ошибках софта.
После плясок с бубном решил искомую задачу установкой Delay на 5’000 в настройках контрола SpinButton1 (можно и в коде):
Остался такой бубен: 5’000мс это же 5с; что за задержка, чего задержка аж на 5с решает задачу без какой-либо видимой задержки выполняемого кода; когда с этим бубном плясать нужно в будущих случаях.
Экспериментировать с настройками Delay не стал, некогда, авось, потом.
Обсуждение закрыто.