Как сделать таймер обратного отсчета в excel?
Содержание
Здесь можно получить ответы на вопросы по Microsoft Excel | 57402 | 469667 |
2 Окт 2018 14:00:50 |
|
44519 | 357828 |
29 Янв 2017 17:28:40 |
||
Лучшие избранные темы с основного форума | 14 | 80 |
28 Июн 2018 15:25:11 |
|
Если вы — счастливый обладатель Mac 😉 | 217 | 1059 |
21 Сен 2018 06:21:34 |
|
Раздел для размещения платных вопросов, проектов и задач и поиска исполнителей для них. | 2087 | 13298 |
2 Окт 2018 13:43:49 |
|
Если Вы скачали или приобрели надстройку PLEX для Microsoft Excel и у Вас есть вопросы или пожелания — Вам сюда. | 307 | 1580 |
28 Сен 2018 09:07:46 |
|
803 | 11511 |
2 Окт 2018 13:43:03 |
||
Обсуждение функционала, правил и т.д. | 269 | 3465 |
1 Окт 2018 11:22:35 |
|
Сейчас на форуме (гостей: 886, пользователей: 35, из них скрытых: 2) , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
Сегодня отмечают день рождения (48), (36), (34), (51), (44), (27)
Всего зарегистрированных пользователей: 82907
Приняло участие в обсуждении: 31752
Всего тем: 105615
Не помню кто из великих сказал… И не помню что. Но в процессе разработки vba-приложений время от времени возникает необходимость использовать таймер. «Из коробки» решения, к сожалению, нет.
Application.OnTime?
Данный метод отложенных вызовов сам по себe решает проблему, но лишь один раз. В том смысле, что таймер срабатывает лишь единожды — указать переодичность вызовов, увы, нельзя.
Application.OnTime + рекурсия?
Очевидно, что в конце необходимой процедуры можно вызывать её же с помощью данного метода, но не менее очевидны и недостатки этого решения — отсутствие достаточного контроля и неудобство вызова:
- не таймер вызывает действие;
- чтобы остановить цикл придётся объявлять глобальную переменную;
- добавление «костыля» в тело отдельно взятой процедуры. Если в следующий раз будет нужно вызвать по таймеру другую — то и в неё придётся переносить данный «костыль».
Evaluate в помощь?
Написать свой класс и вызывать внутри необходимую процедуру с помощью Application.Evaluate. Особо упорные в стремлении создать приемлемый метод вызова таймера доходят до этого решения и упираются в стран/ш/ный баг, отловить который достаточно сложно: udf-функция переданная в переменной будет вызываться каждый раз по два(!) раза.
Потому что гладилус
Способ обойти этот баг пока найден лишь один:
ActiveSheet.Evaluate "0+" & nameOfProcedure
Решение
Для простоты вызова написан не класс, а метод. Достаточно указать интервал, имя вызываемой процедуры и, опционально, кол-во необходимых вызовов:
StartTimer 60, "CalculateTotal()", 30 'вызов CalculateTotal() каждую минуту в течении получаса. StopTimer 'остановка таймера
модуль
Option Explicit Private Type Timer interval As Long procedure As String times As Long enabled As Boolean initialized As Boolean ticks As Long End Type Private Timer As Timer Public Sub StartTimer(ByRef interval As Long, _ ByRef procedure As String, _ Optional ByRef times As Long) With Timer .interval = interval .procedure = procedure .times = times .enabled = True .initialized = False .ticks = 0 End With InvokeTimer End Sub Public Sub StopTimer() Timer.enabled = False End Sub Private Function InvokeTimer() If Timer.ticks > Timer.times And Not Timer.times = 0 Then StopTimer If Not Timer.enabled Then Exit Function If Timer.initialized Then ActiveSheet.Evaluate "0+" & Timer.procedure Else Timer.initialized = True End If Timer.ticks = Timer.ticks + 1 Application.OnTime Now + 1 / 86400 * Timer.interval, "InvokeTimer" End Function
Приветствую всех!
Суть вопроса:
Имеется несколько ячеек таблицы. В первую вносится произвольная дата в формате (порядок ДДММГГ не принципиален). В соседнюю ячейку должна автоматом записаться некая дата (в том же формате), которая получается путем прибавления конкретного количества часов к первой дате. В третью ячейку необходимо вывести разницу между полученной датой из второй ячейки и текущей датой в формате , либо, если сутки невозможно использовать, то просто . Также интересует такой функционал: возможно ли окрашивание последней ячейки в зависимости от оставшегося времени: более суток — красный, менее суток — желтый, время вышло — зеленый?
Подскажите, пожалуйста, как такое осуществить в таблицах OpenOffice’a? Заранее спасибо.
Господа, не хотел беспокоить, но видно самому не разобраться.
Необходимо на форме (на label) выводить посекундно время начиная с некоторого заданного значения до нуля. Когда время истечет, форму необходимо закрыть. Таймер должен запускаться командной кнопкой на той же форме. Пытаюсь делать это через Application.OnTime, но время на метке не изменяется ну и форма не закрывается. Нашел код подобной задачи для Excel и пытался адаптировать его для Word, но без результатно. Вот этот код:
Private Sub CommandButton1_Click()
minut = 0
secund = 3
vremya = TimeValue(«00:» & minut & «:» & secund & «»)
tmr
Application.OnTime Now + TimeValue(«00:00:01»), «Module1.tmr»
End Sub
Это Module1
Public vremya As Date, minut As Variant, secund As Variant
Sub tmr()
UserForm1.Label1.Caption = Format(vremya, «nn:ss»)
vremya = vremya — TimeValue(«0:00:01»)
If vremya > 0 Then
Application.OnTime Now + TimeValue(«00:00:01»), «tmr»
Else
Unload UserForm1
End If
End Sub
И как, кстати, остановить этот таймер?
Заранее благодарен