我试图使用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
答案 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