Как сделать таймер обратного отсчета в 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

И как, кстати, остановить этот таймер?

Заранее благодарен