我试图使用VBA构建倒计时器,结果可以动态输出到Excel单元格。我让程序abc和def递归地相互调用(没有为测试设置停止点),并且它有效。但是,稍后我再次运行这个完全相同的代码,它失败了,错误信息是:
代码执行已中断。
只是无法弄清楚为什么,我没有改变任何东西,它怎么可能工作然后失败?
我尝试了On Error Resume Next
和Application.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
而不是尝试以递归方式执行此操作,而不考虑调用堆栈,我会使用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
你的整个代码对我来说都很好(也包括[a2]
部分)。我在使用Excel 2013的Windows 7上。
我建议你加入abc()
的停止条件
If [a1] > 0 Then
Call def
End If
请提供更多信息。
为什么不创建功能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