VBA:我如何真正停止Application.onTime()?

rex*_*rex 3 excel ontime vba timer excel-vba

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

我已经阅读了一些关于如何停止VBA 程序的问题/线程(例如这个这个)Application.OnTime,但我无法让它停下来!

我每隔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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我知道我可能已经引入了一些额外的措施来阻止执行但似乎没有工作!

Dav*_*veU 5

这是因为你的启动和停止例程指的是不同的宏.将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
Run Code Online (Sandbox Code Playgroud)

  • 您需要原始时间和宏名称来停止您已经开始的`StartTime`。 (2认同)