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

问题描述 投票:0回答:3

我试图使用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
excel vba countdown
3个回答
3
投票

而不是尝试以递归方式执行此操作,而不考虑调用堆栈,我会使用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

0
投票

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

我建议你加入abc()的停止条件

If [a1] > 0 Then
   Call def
End If

请提供更多信息。


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

然后在你的sub中你就像这样称呼它:

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

要么

wait [a1]-1
© www.soinside.com 2019 - 2024. All rights reserved.