VBA:我怎样才能停止Application.onTime()?

[已解决]:请参阅解答的答案。 谢谢@DaveU。

我已经阅读了关于如何停止VBA Application.OnTime过程的一些问题/线程(例如this或this ),但是我不能让它停下来!

我正在使用它来每隔x秒拉一些数据。 我明白,当我调用OnTime()方法时,我需要传递给它用于安排事件的相同时间值。

我也尝试引入多个命令(例如试图导致错误)来停止执行,但它仍然不起作用! 该程序只是继续运行…这是我的代码看起来如何:

在工作表代码中我有:

 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 

并在一个单独的模块,我有:

 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 

我明白,我可能已经采取了一些额外的措施来阻止执行,但似乎没有任何工作!

这是因为你的开始和停止例程指的是不同的macros。 将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