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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 17:13:33  来源:igfitidea点击:

VBA: How do I really stop Application.onTime()?

excelvbaexcel-vbatimerontime

提问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.OnTimeprocedure, but I just can't get it to stop!

我已经阅读了一些关于如何停止 VBA程序的问题/线程(例如thisthisApplication.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