VBA:我如何真正停止 Application.onTime()?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20002666/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
VBA: How do I really stop Application.onTime()?
提问by rex
[SOLVED]: Please see answers for solution. Thanks @DaveU.
[已解决]:请参阅解决方案的答案。谢谢@DaveU。
I have already read some questions/threads (eg thisor this) about how to stop the VBA Application.OnTime
procedure, but I just can't get it to stop!
我已经阅读了一些关于如何停止 VBA程序的问题/线程(例如this或this)Application.OnTime
,但我无法停止它!
I am using it to pull some data every x seconds. I understand that when I call the OnTime()
method I need to pass to it the same time value that was used to schedule the event.
我正在使用它每 x 秒提取一些数据。我知道当我调用该OnTime()
方法时,我需要将用于安排事件的相同时间值传递给它。
I have also tried to introduce multiple commands (that try to cause an error for example) to stop the execution but it still doesn't work! The program just keeps running... This is how my code looks:
我还尝试引入多个命令(例如尝试导致错误)来停止执行,但它仍然不起作用!程序一直在运行......这是我的代码的样子:
In Worksheet code I have:
在工作表代码中,我有:
Public TimerActive As Boolean
Public tick As String
Public idx As Long
Public counter As Long
Public Sub UpdateOff_Click()
TimerActive = False
tick = "Off"
counter = 1
idx = 1
Call StopTimer(idx, counter, tick, TimerActive)
End ' force quit??
End Sub
Public Sub UpdateOn_Click()
TimerActive = True
tick = "live"
counter = 1
idx = 1
Call StartTimer(idx, counter, tick, TimerActive)
End Sub
and in a seperate module i have:
在一个单独的模块中,我有:
Public fireTime As Date
Sub StartTimer(ByVal idx As Long, ByVal counter As Long, ByVal tick As String, ByVal TimerActive As Boolean)
fireTime = Now + TimeValue("00:00:05")
sMacro = " 'pullData " & idx & " , " & counter & ", " & Chr(34) & tick & Chr(34) & ", " & TimerActive & "'"
Application.OnTime EarliestTime:=fireTime, Procedure:=sMacro, Schedule:=True
End Sub
Sub StopTimer(ByVal idx As Long, ByVal counter As Long, ByVal tick As String, ByVal TimerActive As Boolean)
sMacro = "cause error" ' cause an error (by giving false sub name so program stops?
Application.OnTime EarliestTime:=fireTime, Procedure:=sMacro, Schedule:=False
End
End Sub
Public Sub pullData(ByVal idx As Long, ByVal counter As Long, ByVal tick As String, ByVal TimerActive As Boolean)
DoEvents
If TimerActive = True Then
' pull the data do some stuff, print the data, etc...
idx = idx + 1
counter = counter + 1
tick = tick + " ."
If counter = 6 Then
counter = 1
tick = "live"
End If
Call startTimer(idx, counter, tick, TimerActive)
End If
End Sub
I understand that I may have introduced a few extra measures to stop the execution but none seem to work!
我知道我可能已经引入了一些额外的措施来停止执行,但似乎没有任何效果!
回答by DaveU
It's because your start & stop routines are referring to different macros. Define sMacro as Public, then it will work
这是因为您的启动和停止例程指的是不同的宏。将 sMacro 定义为 Public,然后它将起作用
Public sMacro As String
Public fireTime As Date
Sub startTimer(ByVal idx As Long, ByVal counter As Long, ByVal tick As String, ByVal TimerActive As Boolean)
fireTime = Now + TimeValue("00:00:05")
sMacro = " 'pullData " & idx & " , " & counter & ", " & Chr(34) & tick & Chr(34) & ", " & TimerActive & "'"
Application.OnTime EarliestTime:=fireTime, Procedure:=sMacro, Schedule:=True
End Sub
Sub StopTimer(ByVal idx As Long, ByVal counter As Long, ByVal tick As String, ByVal TimerActive As Boolean)
Application.OnTime EarliestTime:=fireTime, Procedure:=sMacro, Schedule:=False
End Sub