使用 VBA 在 Excel 中构建倒数计时器时出现问题
Problem with building count down timer in Excel using VBA
我正在尝试使用 VBA 构建一个倒数计时器,结果可以动态输出到 Excel 单元格。我让过程 abc 和 def 递归地相互调用(没有设置停止点只是为了测试),它起作用了。然而,后来我再次使用完全相同的代码 运行,它失败了,错误消息是:
Code execution has been interrupted.
就是想不通为什么,我什么都没改,怎么会运行然后就失效了?
我试过On Error Resume Next
和Application.DisplayAlert = False
,两者都没有停止弹出的错误消息和代码执行的中断。如果我逐步完成这些程序,似乎没问题...
我还想在另一个单元格的评论中添加动态文本,如 "start in how many seconds"。可以这样实现吗?
谢谢!
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
你的整个代码对我来说工作正常(也包括 [a2]
部分)。我在 Windows 7 和 Excel 2013.
我建议你在 abc()
中添加一个停止条件,比如
If [a1] > 0 Then
Call def
End If
请提供更多信息。
为什么不顺便创建一个函数?它对你有用吗?
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
考虑到调用堆栈的问题,我不会尝试递归地执行此操作,而是使用 Application.OnTime.
Sub Button1_Click()
Call MyTimer
End Sub
Sub MyTimer()
[a1] = [a1] - 1
Application.OnTime Now + TimeValue("00:00:01"), "MyTimer"
End Sub
我想这在某种程度上仍然是 'recursive',但程序每次都会退出。仅在 1 秒后才再次执行该过程。
但是,无论哪种方式,您都应该包括一些停止进程的方法。例如,
Sub MyTimer()
[a1] = [a1] - 1
If [a1] > 0 Then
Application.OnTime Now + TimeValue("00:00:01"), "MyTimer"
End If
End Sub
我正在尝试使用 VBA 构建一个倒数计时器,结果可以动态输出到 Excel 单元格。我让过程 abc 和 def 递归地相互调用(没有设置停止点只是为了测试),它起作用了。然而,后来我再次使用完全相同的代码 运行,它失败了,错误消息是:
Code execution has been interrupted.
就是想不通为什么,我什么都没改,怎么会运行然后就失效了?
我试过On Error Resume Next
和Application.DisplayAlert = False
,两者都没有停止弹出的错误消息和代码执行的中断。如果我逐步完成这些程序,似乎没问题...
我还想在另一个单元格的评论中添加动态文本,如 "start in how many seconds"。可以这样实现吗?
谢谢!
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
你的整个代码对我来说工作正常(也包括 [a2]
部分)。我在 Windows 7 和 Excel 2013.
我建议你在 abc()
中添加一个停止条件,比如
If [a1] > 0 Then
Call def
End If
请提供更多信息。
为什么不顺便创建一个函数?它对你有用吗?
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
考虑到调用堆栈的问题,我不会尝试递归地执行此操作,而是使用 Application.OnTime.
Sub Button1_Click()
Call MyTimer
End Sub
Sub MyTimer()
[a1] = [a1] - 1
Application.OnTime Now + TimeValue("00:00:01"), "MyTimer"
End Sub
我想这在某种程度上仍然是 'recursive',但程序每次都会退出。仅在 1 秒后才再次执行该过程。
但是,无论哪种方式,您都应该包括一些停止进程的方法。例如,
Sub MyTimer()
[a1] = [a1] - 1
If [a1] > 0 Then
Application.OnTime Now + TimeValue("00:00:01"), "MyTimer"
End If
End Sub