Применение функции Timer в VBA Excel для приостановки выполнения приложений и определения времени работы процедур. Примеры использования.
Timer – это функция без аргументов, которая возвращает количество секунд, прошедших после полночи. Значение типа Single.
На сайте разработчика сказано, что в Windows функция Timer возвращает дробные части секунды. О порядке дробной части там информации нет. Попробуем выяснить это сами, запустив в редакторе VBA Excel подпрограмму со строкой
MsgBox «Timer = « & Timer |
Исходя из результата, отображенного в информационном окне MsgBox, будем считать, что функция Timer возвращает сотые доли секунды. Во время экспериментов с процедурой Vremya из Примера 2 результат вычисления разницы между двумя значениями функции Timer достигал шести знаков после запятой, и один раз – семи.
Примеры использования в VBA Excel
Пример 1
Присвоение значения функции Timer переменной:
Пример 2
Код VBA Excel для приостановки приложений:
Dim Start As Single, Pause As Single Start = Timer Pause = 0.5 Do While Timer < Start + Pause DoEvents Loop |
- Start – переменная, в которую записывается первоначальное значение таймера.
- Pause – время в секундах (до сотых значений), на которое следует приостановить программу.
Функция DoEvents во время выполнения цикла передает управление операционной системе для обработки других событий. По рекомендации разработчиков не следует использовать DoEvents в тех случаях, когда
- приостановленная процедура может быть запущена повторно из другой части вашего кода;
- другие приложения могут обратиться к приостановленной процедуре.
Код для приостановки приложений можно использовать как отдельную подпрограмму, вставляя ее имя с указанием интервала в нужные места других процедур:
Sub StopSub(Pause As Single) Dim Start As Single Start = Timer Do While Timer < Start + Pause DoEvents Loop End Sub |
Проверяем работоспособность подпрограммы StopSub:
Sub Vremya() Dim x As Single x = Timer Call StopSub (3) MsgBox Timer — x End Sub |
Точный или почти точный результат будет только при использовании в качестве аргумента целых секунд, в том числе и в примере кода, предложенного разработчиком.
Такой способ приостановки приложений можно использовать в VBA Excel при создании бегущей строки.
Пример 3
Функцию Timer можно использовать для замера времени работы процедуры. Мы ее уже использовали для определения времени выполнения подпрограммы StopSub:
Sub Vremya() Dim x As Single x = Timer Call MySub MsgBox Timer — x End Sub |
Замените MySub на имя вашей подпрограммы и запустите код в редакторе VBA Excel. Информационное окно MsgBox покажет время работы процедуры.
OlegSmirnov Пользователь Сообщений: 137 |
#1 15.03.2019 21:25:09 Доброго вечера всем. Вопрос касается операции со временем. Как надежно отключить таймер, чтобы он намертво вырубался и начинал работать только тогда — когда я вновь нажму на кнопку «включить таймер» ? То есть если запустить таймер, выждать секунду, отключить таймер и закрыть книгу — чтобы эта книга не открывалась бы сама по себе. Макрос выглядит так:
Прикрепленные файлы
Изменено: OlegSmirnov — 16.03.2019 00:22:30 |
||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
Изменено: БМВ — 15.03.2019 21:34:40 По вопросам из тем форума, личку не читаю. |
OlegSmirnov Пользователь Сообщений: 137 |
#3 15.03.2019 21:41:10 БМВ, что-то не работает. Подсвечивает строку :
Прикрепленные файлы
Изменено: OlegSmirnov — 15.03.2019 21:50:23 |
||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#4 15.03.2019 21:55:54 ну нельзя ж просто бездумно копировать
По вопросам из тем форума, личку не читаю. |
|
БМВ, так… ну вроде теперь книга повторно не открывается. |
|
в программировании не бывает «надежно отключить таймер» Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
Hugo Пользователь Сообщений: 23251 |
#7 15.03.2019 23:59:02
— кстати это довольно надёжно описано как ни странно в описании этого «таймера» и в справке, и на MSDN |
||
OlegSmirnov Пользователь Сообщений: 137 |
#8 16.03.2019 00:13:00 Нет, все равно что-то не работает.
Все равно отказывается работать. Выдает ту же самую ошибку : Runtime error 1004: Method OnTime of object _Application failed Макрос выглядит так:
Почему в одном случае данная строчка работает, а в другом случае — выдает ошибку ? Изменено: OlegSmirnov — 16.03.2019 00:46:48 |
||||
Hugo Пользователь Сообщений: 23251 |
Потому что NextStart — совершенно ничего не означает, не нужно это слово переводить Изменено: Hugo — 16.03.2019 00:26:55 |
OlegSmirnov Пользователь Сообщений: 137 |
#10 16.03.2019 00:39:27
Ничего не понимаю.
|
||||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#11 16.03.2019 00:47:35 OlegSmirnov, посмотрите внимательно тот код что я написал выше, я специально менял его минимально, только дополнил необходимым и закомментил ненужное.
нужно ж запомнить как-то это точное время. По вопросам из тем форума, личку не читаю. |
||
БМВ, у вас там в начале кода — не хватало строки пропуска ошибок On Error Resume Next |
|
БМВ, в общем все теперь работает. |
|
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#14 16.03.2019 01:03:40 OlegSmirnov, не у меня а у Вас, и это не заблокирует повторные клацания по кнопке старт. А так как каждый раз будет переписано значение NextStart, то стоп отключит только последнее. Ну тут уже надо понимать что нужно и по факту или кнопки блокировать или алгоритм менять. А так просто можно , да и правильнее, чтоб не плодить ошибок , обнулять и проверять
По вопросам из тем форума, личку не читаю. |
||
0 / 0 / 0 Регистрация: 02.10.2012 Сообщений: 62 |
|
1 |
|
Запуск и остановка Таймера25.02.2016, 16:00. Показов 16030. Ответов 10
Уважаемые форумчане, добрый день!
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
||||||||
26.02.2016, 09:34 |
2 |
|||||||
Можно не запускать таймер после какого-то нажатия кнопки
Можно применить АПИ таймер
1 |
A_3485 0 / 0 / 0 Регистрация: 02.10.2012 Сообщений: 62 |
||||||||||||
26.02.2016, 11:59 [ТС] |
3 |
|||||||||||
Первый способ для меня, как мало грамотного в этих вопросах более понятен. Хочется уточнить пару моментов:
— через эту переменную идет включение и выключение таймера?
— объявляем переменную для управления таймером?
— эта строчка мне не очень понятна. Если перевести на русский, то ЕСЛИ st False, то выход из программы?
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
|
26.02.2016, 17:36 |
4 |
Ну как-то так: при загрузке формы запускаем таймер и после истечения времени проверяем состояние переменной. Если она True, то запускаем снова таймер.
0 |
A_3485 0 / 0 / 0 Регистрация: 02.10.2012 Сообщений: 62 |
||||
09.03.2016, 09:11 [ТС] |
5 |
|||
Доброго времени суток!
Что может быть не так?
0 |
es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
|
09.03.2016, 09:29 |
6 |
Я попробовал применить к VBA 6.0
0 |
0 / 0 / 0 Регистрация: 02.10.2012 Сообщений: 62 |
|
09.03.2016, 10:22 [ТС] |
7 |
Вот этот компонент я и не могу применить.
0 |
SoftIce es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
||||
09.03.2016, 10:46 |
8 |
|||
время работы таймера (например 3 минуты Timer1.Interval = 30000 Ну, во-первых, 3 минуты — это будет 180000.
а как совместить это все вместе не понимаю Например,так
0 |
0 / 0 / 0 Регистрация: 02.10.2012 Сообщений: 62 |
|
09.03.2016, 11:20 [ТС] |
9 |
SoftIce, спасибо за помощь. Сегодня вечером обязательно проверю и отпишусь.
0 |
0 / 0 / 0 Регистрация: 02.10.2012 Сообщений: 62 |
|
11.03.2016, 22:30 [ТС] |
10 |
SoftIce, спасибо за примеры. С ними мне все понятно. А каким образом в этот пример можно добавить обратный отсчет например 5 минут в формате 05:00, 04:59 и т.д.
0 |
SoftIce es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
||||
11.03.2016, 23:00 |
11 |
|||
Сообщение было отмечено The trick как решение Решение
апример 5 минут в формате 05:00, 04:59
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
11.03.2016, 23:00 |
11 |
Отключение таймера (Application.OnTime) |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Метод Timer.Stop ()
.NET Framework (current version)
Опубликовано: Октябрь 2016
Останавливает таймер.
Пространство имен: System.Windows.Forms
Сборка: System.Windows.Forms (в System.Windows.Forms.dll)
Синтаксис
C#
C++
F#
VB
Public Sub Stop
Комментарии
Таймер также можно остановить, задав Enabled Свойства false. Объект Timer может быть включен и отключен несколько раз в одном сеансе приложения.
Вызов Start после отключения Timer путем вызова Stop вызовет Timer перезапуск прерванной интервал. Если ваш Timer имеет значение для интервала 5000 миллисекунд, и вызывать Stop на около 3000 миллисекунд, вызов Start приведет к Timer ожидать 5000 миллисекунд перед порождением Tick событий.
Примечание |
Вызов Stop для какого-либо Timer в Windows Forms приложения может вызвать сообщения от других Timer компоненты в приложении для обработки немедленно, так как все Timer компоненты работают на основной поток приложения. При наличии двух Timer компонентов, одно значение 700 миллисекундах и один набор для 500 миллисекунд, и вызывать Stop на первом Timer , приложение может сначала получает обратный вызов события для второй компонент. Если это вызывает проблемы, рассмотрите возможность использования Timer класса в System.Threading имен вместо. |
Примеры
В следующем примере кода реализуется простой интервальный таймер, вызывающий аварийный сигнал каждые пять секунд. При подаче сигнала MessageBox отображает количество время начала сигнала и пользователю предлагается ли таймер должны продолжать работу.
C#
C++
VB
Public Class Class1
Private Shared WithEvents myTimer As New System.Windows.Forms.Timer()
Private Shared alarmCounter As Integer = 1
Private Shared exitFlag As Boolean = False
‘ This is the method to run when the timer is raised.
Private Shared Sub TimerEventProcessor(myObject As Object, _
ByVal myEventArgs As EventArgs) _
Handles myTimer.Tick
myTimer.Stop()
‘ Displays a message box asking whether to continue running the timer.
If MessageBox.Show(«Continue running?», «Count is: « & alarmCounter, _
MessageBoxButtons.YesNo) = DialogResult.Yes Then
‘ Restarts the timer and increments the counter.
alarmCounter += 1
myTimer.Enabled = True
Else
‘ Stops the timer.
exitFlag = True
End If
End Sub
Public Shared Sub Main()
‘ Adds the event and the event handler for the method that will
‘ process the timer event to the timer.
‘ Sets the timer interval to 5 seconds.
myTimer.Interval = 5000
myTimer.Start()
‘ Runs the timer, and raises the event.
While exitFlag = False
‘ Processes all the events in the queue.
Application.DoEvents()
End While
End Sub
End Class
Информация о версии
.NET Framework
Доступно с 1.1
См. также
E nabled
Класс Timer
Пространство имен System.Windows.Forms