使用VBA在Excel中建立倒数计时器的问题

时间:2019-03-20 13:52:18

标签: excel vba countdown

我试图使用VBA构建倒数计时器,并且结果可以动态输出到Excel单元格。我让过程abc和def递归调用(没有为测试设置停止点),并且它起作用了。但是,稍后使用完全相同的代码再次运行,它失败了,错误消息是:

  

代码执行被中断。

只是不知道为什么,我没有做任何更改,它如何工作然后失败?

我尝试了On Error Resume NextApplication.DisplayAlert = False,它们都不能阻止错误消息的弹出和代码执行的中断。如果我逐步执行这些程序,那似乎很好...

我还希望在另一个单元格中添加动态文本,例如“在几秒钟内开始”。可以这样实现吗?

谢谢!

Sub abc()

    [a1] = [a1] - 1
    ' [a2] = "Start in " & [a1] & " seconds."
    Call def

End Sub


Sub def()

    Application.Wait (Now + TimeValue("0:00:01"))

    Call abc

End Sub

3 个答案:

答案 0 :(得分:2)

我会使用Application.OnTime。而不是尝试递归地执行此操作,而要考虑调用堆栈。

Sub Button1_Click()
    Call MyTimer

End Sub

Sub MyTimer()
    [a1] = [a1] - 1

    Application.OnTime Now + TimeValue("00:00:01"), "MyTimer"
End Sub

我以某种方式认为这仍然是“递归”的,但是过程每次都会退出。只有经过1秒后,它才会再次执行该过程。

但是,无论哪种方式,您都应该包括一些停止进程的方法。例如,

Sub MyTimer()
    [a1] = [a1] - 1

    If [a1] > 0 Then
        Application.OnTime Now + TimeValue("00:00:01"), "MyTimer"
    End If
End Sub

答案 1 :(得分:0)

您的整个代码对我来说都很正常(还包括[a2]部分)。我在Windows 7上使用Excel 2013。

我建议您在abc()中加入停止条件,例如

If [a1] > 0 Then
   Call def
End If

请提供更多信息。

答案 2 :(得分:0)

为什么不创建函数btw?对您有用吗?

Function wait(seconds As Long)

    Dim originalStatusBar As String, i As Long
    originalStatusBar = Application.StatusBar

    For i = seconds To 0 Step -1
        Application.wait (Now + TimeValue("0:00:01"))
        Application.StatusBar = "Start in " & i & " seconds"
    Next

    Application.StatusBar = originalStatusBar

End Function

然后在子目录中按如下方式称呼它:

wait 5 'waits 5 seconds and updates status bar with remaining time

wait [a1]-1