在循环移动到 VBA 中的下一次迭代之前调用 sub 未完成
Calling sub not completing before loop moves to next iteration in VBA
我正在编写一段 VBA 代码来显示倒数计时器。 Excel Sheet 1 列出事件的时间和描述,sheet 2 显示倒计时。
想法是,一旦第一个事件成功倒计时,它就会检查第二个事件的日期,如果是今天,它会继续倒计时到第二个事件,依此类推。倒计时方面在第一次和描述中成功运行,但是当它完成倒计时到第一个事件时它完全停止。
有 3 个子项,第一个计算是否是今天的活动以及需要倒计时多长时间。第一个调用第二个,它通过减去 TimeSerial(0,0,1)
进行倒计时,第三个是计时器。我承认我从网上找到的一篇写得很好的文章中借用了第 2 和第 3 篇(感谢写这篇文章的人,谢谢)。
我已经简化了下面写的内容:
For i=1 to 10
If *Conditions to determine if countdown should happen exist*
*calculate time to countdown and sets it to sheets("Countdown").Cells("A13")*
Cells(13, 1) = TotaltimeCountdown
Call Countdowntimer
End if
Next i
Sub Countdowntimer()
Sheets("Countdown").Activate
Dim Counter As Range
Set Counter = ActiveSheet.Range("A13")
If Counter.Value > 0 Then
Counter.Value = Counter.Value - TimeSerial(0, 0, 1)
Call Timer
ElseIf Counter.Value <= 0 Then
Sheets("Countdown").Range("A13:H17").ClearContents
Exit Sub
End If
End Sub
'Sub to trigger the reset of the countdown timer every second
Sub Timer()
Dim gCount As Date
gCount = Now + TimeValue("00:00:01")
Application.OnTime gCount, "Countdowntimer"
End Sub
我在第一个子程序中调用 Countdowntimer 后放置了一个消息框,并且能够确定它显示倒计时的时间量,然后显示消息框并循环显示 i
的每个值。只有然后它才真正进行倒计时。
关于如何使 for 循环完全暂停直到被调用子的倒计时结束,有什么建议吗?
感谢任何建议
问题在于使用 Application.OnTime
,对于倒计时计时器,请使用 Do
循环和 DoEvents
进行倒计时。
类似的东西:
Option Explicit
Public Sub CountDownTimer()
With ThisWorkbook.Worksheets("Countdown")
Dim Duration As Long
Duration = 10 ' needs to be in seconds!
'if your cell has a real datetime then use
Duration = .Range("A13").Value * 24 * 60 * 60
Dim TimerStart As Double
TimerStart = Timer()
Do While Timer <= TimerStart + Duration
.Range("A13").Value = TimeSerial(0, 0, TimerStart + Duration - Timer)
DoEvents
Loop
ThisWorkbook.Worksheets("Countdown").Range("A13:H17").ClearContents
End With
End Sub
我正在编写一段 VBA 代码来显示倒数计时器。 Excel Sheet 1 列出事件的时间和描述,sheet 2 显示倒计时。
想法是,一旦第一个事件成功倒计时,它就会检查第二个事件的日期,如果是今天,它会继续倒计时到第二个事件,依此类推。倒计时方面在第一次和描述中成功运行,但是当它完成倒计时到第一个事件时它完全停止。
有 3 个子项,第一个计算是否是今天的活动以及需要倒计时多长时间。第一个调用第二个,它通过减去 TimeSerial(0,0,1)
进行倒计时,第三个是计时器。我承认我从网上找到的一篇写得很好的文章中借用了第 2 和第 3 篇(感谢写这篇文章的人,谢谢)。
我已经简化了下面写的内容:
For i=1 to 10
If *Conditions to determine if countdown should happen exist*
*calculate time to countdown and sets it to sheets("Countdown").Cells("A13")*
Cells(13, 1) = TotaltimeCountdown
Call Countdowntimer
End if
Next i
Sub Countdowntimer()
Sheets("Countdown").Activate
Dim Counter As Range
Set Counter = ActiveSheet.Range("A13")
If Counter.Value > 0 Then
Counter.Value = Counter.Value - TimeSerial(0, 0, 1)
Call Timer
ElseIf Counter.Value <= 0 Then
Sheets("Countdown").Range("A13:H17").ClearContents
Exit Sub
End If
End Sub
'Sub to trigger the reset of the countdown timer every second
Sub Timer()
Dim gCount As Date
gCount = Now + TimeValue("00:00:01")
Application.OnTime gCount, "Countdowntimer"
End Sub
我在第一个子程序中调用 Countdowntimer 后放置了一个消息框,并且能够确定它显示倒计时的时间量,然后显示消息框并循环显示 i
的每个值。只有然后它才真正进行倒计时。
关于如何使 for 循环完全暂停直到被调用子的倒计时结束,有什么建议吗?
感谢任何建议
问题在于使用 Application.OnTime
,对于倒计时计时器,请使用 Do
循环和 DoEvents
进行倒计时。
类似的东西:
Option Explicit
Public Sub CountDownTimer()
With ThisWorkbook.Worksheets("Countdown")
Dim Duration As Long
Duration = 10 ' needs to be in seconds!
'if your cell has a real datetime then use
Duration = .Range("A13").Value * 24 * 60 * 60
Dim TimerStart As Double
TimerStart = Timer()
Do While Timer <= TimerStart + Duration
.Range("A13").Value = TimeSerial(0, 0, TimerStart + Duration - Timer)
DoEvents
Loop
ThisWorkbook.Worksheets("Countdown").Range("A13:H17").ClearContents
End With
End Sub