如何在我的代码中创build一个停止的Application.OnTime事件?

我在这里有一些代码,除了当我尝试closuresExcel工作表时,完美的工作。 我试图编程计时器停止当我closures工作簿,但似乎并没有工作。 每当我closures工作簿,它都会自动重新打开。 任何帮助调整我的代码将不胜感激。 这里是:

代码模块1:

Dim RT1 As Date Dim Lunch As Date Dim ApT As Date Dim RT3 As Date Dim NextTick As Date Public Sub UpdateTime() ' Places a bug fix for stopping the clock when closing the workbook Debug.Print "UpdateTime" & Format(RunWhen, "00:00:00") ' Updates cell D8 with the Current time ThisWorkbook.Sheets(1).Range("D8") = Now() ' Set up next event 1 second from now NextTick = Now + TimeValue("00:00:01") Application.OnTime NextTick, "UpdateTime" End Sub Public Sub StopClock() ' Cancels the OnTime event On Error Resume Next Application.OnTime NextTick, "UpdateTime", , False End Sub 

第2单元中的代码:

  Sub PhoneHours() 'Time left at the beginning of the day If Range("B12") < Range("A3") Then Range("E12").FormulaR1C1 = "=(R[3]C[-3]-R[0]C[-3])- (2*R[0]C[1])" 'Time left after the first Research Time Has passed If Range("B12") >= Range("A3") Then Range("E12").FormulaR1C1 = "=(R[3]C[-3]-R[0]C[-3])- (1.75*R[0]C[1])" 'Time left after Lunch and Second Research Time If Range("B12") >= Range("B3") Then Range("E12").FormulaR1C1 = "=(R[3]C[-3]-R[0]C[-3])- (0.5*R[0]C[1])" 'Time left afetr Apple Time If Range("B12") >= Range("D3") Then Range("E12").FormulaR1C1 = "=(R[3]C[-3]-R[0]C[-3])- (0.25*R[0]C[1])" 'Time left after Final Research Time If Range("B12") >= Range("E3") Then Range("E12").FormulaR1C1 = "=(R[3]C[-3]-R[0]C[-3])" NextCheck = Now + TimeValue("00:00:10") Application.OnTime NextCheck, "PhoneHours" End Sub Sub StopCheck() ' Cancels the OnTime event On Error Resume Next Application.OnTime NextCheck, "PhoneHours", , False End Sub 

本工作簿中的代码:

  Sub Worksheet_Deactivate() Call StopClock Call StopCheck End Sub Sub Workbook_Activate() Call UpdateTime Call PhoneHours End Sub Sub Workbook_Open() Call UpdateTime Call PhoneHours End Sub Sub Workbook_Close() Call StopClock Call StopCheck End Sub 

提前致谢!

当我尝试做类似的事情时,我发现主要问题是OnTime调用比我预期的要频繁得多 – 如果你在你的PhoneHours子文件里放一个debug.print,那么你会发现这里是这种情况。 您的StopCheck例程只取消最近一次的通话,但所有先前的通话仍然有效(导致书本在closures后重新打开)。

您可能需要创build一些断点/debugging来准确找出每一个被调用的位置和原因,以便使您的工作表更有效地运行,但是无论如何,我发现取消所有未来的按时访问的最可靠的方法是一个散射枪的方法如下:

 Sub StopCheck() ' Cancels the OnTime event Debug.Print "Cancelled Phonehours" On Error Resume Next ' Cancels all OnTime events scheduled in the next 15 seconds For i = 0 To 15 Application.OnTime Now + TimeValue("00:00:" & i), "PhoneHours", , False Next i On Error GoTo 0 End Sub 

 Public Sub StopClock() ' Cancels the OnTime event On Error Resume Next Debug.Print "Cancelled UpdateTime" ' Cancels all OnTime events scheduled in the next 3 seconds For i = 0 To 3 Application.OnTime Now + TimeValue("00:00:" & i), "UpdateTime", , False Next i On Error GoTo 0 End Sub 

这应该不会保留将来的OnTimes,你应该能够成功地closures你的工作表。

(顺便说一下,如果你的Worksheet_Deactivate是一个Workbook_Deactivate?)