Возникла необходимость запуска процедуры на VBA в Excel через равные промежутки времени. Был найден вот такой пример:
[vba]
Код
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 MsgBox ("Таймер остановлен") 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
[/vba]
Запускается вот так: [vba]
Код
Sub ButtonStartClick() StartTimer 1200, "НАША ПРОЦЕДУРА()" 'интервал в секундах MsgBox ("Внимание! Таймер запущен") End Sub
[/vba]
Но, к сожалению, работает пока некорректно: срабатывает не через равные промежутки и время срабатывания намного меньше заданного интервала. Где искать ошибку?
Всем привет!
Возникла необходимость запуска процедуры на VBA в Excel через равные промежутки времени. Был найден вот такой пример:
[vba]
Код
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 MsgBox ("Таймер остановлен") 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
[/vba]
Запускается вот так: [vba]
Код
Sub ButtonStartClick() StartTimer 1200, "НАША ПРОЦЕДУРА()" 'интервал в секундах MsgBox ("Внимание! Таймер запущен") End Sub
[/vba]
Но, к сожалению, работает пока некорректно: срабатывает не через равные промежутки и время срабатывания намного меньше заданного интервала. Где искать ошибку?mrdc
Сообщение отредактировал mrdc - Вторник, 21.10.2014, 12:00
Спасибо, видел этот пример, в моем случае надо указывать разные таймеры для разных процедур, поэтому обычный OnTime с рекурсией не подходит, к сожалению.
Спасибо, видел этот пример, в моем случае надо указывать разные таймеры для разных процедур, поэтому обычный OnTime с рекурсией не подходит, к сожалению.mrdc
Ну так и указывайте, кто вам запрещает-то? Вы поймите: в приведенном коде Procedura_2() - это процедура сброса/установки таймера для ОДНОЙ ВАШЕЙ процедуры Proc(). А в Proc() в нужном месте вставляется вызов Procedura_2() :). Таких связок из пары процедур можно нарисовать сколько угодно - в процедуре с .Ontime вы планируете запуск процедуры с каким-то именем и нужным вам кодом действий, а при работе вашей процедуры - должен быть вставлен где-то код вызова соответствующей процедуры с планировщиком...
Ну так и указывайте, кто вам запрещает-то? Вы поймите: в приведенном коде Procedura_2() - это процедура сброса/установки таймера для ОДНОЙ ВАШЕЙ процедуры Proc(). А в Proc() в нужном месте вставляется вызов Procedura_2() :). Таких связок из пары процедур можно нарисовать сколько угодно - в процедуре с .Ontime вы планируете запуск процедуры с каким-то именем и нужным вам кодом действий, а при работе вашей процедуры - должен быть вставлен где-то код вызова соответствующей процедуры с планировщиком...AndreTM