Application.OnTime似乎与手动启动的subs相冲突

我已经做了一个工作簿,在10分钟不活动之后必须closures。 我用Application.OnTime使用一个计时器。 每隔一分钟不活动之后,我使用Application.OnTime命令来刷新状态栏中的消息。 在最后一分钟,我在每秒不活动之后使用Application.OnTime命令来加速状态栏中的消息。 这效果很好,迄今为止非常好。

Public dtNextTime As Date Public lngWaitTime As Long Public lngRefreshTime As Long Sub StartCountDownTimer() Call StopCountDownTimer dtNextTime = 0 lngWaitTime = 1 * 60 ' In my real workbook, the user can change the 10 minutes in a cell and I use this value in this sub ' Set initial RefreshTime lngRefreshTime = 60 Call PlanNextTime End Sub Sub PlanNextTime() Dim strWaitTime As String Dim lngShowWaitTime As Long If lngWaitTime >= 60 Then lngShowWaitTime = lngWaitTime / 60 Else lngShowWaitTime = lngWaitTime End If Select Case lngWaitTime Case Is >= 120 strWaitTime = " minutes" Case Is >= 60 strWaitTime = " minute" Case Is > 1 strWaitTime = " seconds" Case Is = 1 strWaitTime = " second" End Select Application.StatusBar = "If you don't use this workbook it will be closed in " & lngShowWaitTime & strWaitTime If lngWaitTime <= 0 Then Application.StatusBar = "Workbook is being closed" Call CloseWorkbook Else If dtNextTime = 0 Then dtNextTime = Now() If lngWaitTime > 60 Then lngRefreshTime = 60 Else lngRefreshTime = 1 End If Application.OnTime EarliestTime:=dtNextTime, Procedure:="PlanNextTime", Schedule:=True dtNextTime = dtNextTime + TimeSerial(0, 0, lngRefreshTime) lngWaitTime = lngWaitTime - lngRefreshTime End If End Sub Sub StopCountDownTimer() On Error Resume Next Application.OnTime EarliestTime:=dtNextTime, Procedure:="PlanNextTime", Schedule:=False On Error GoTo 0 Application.StatusBar = False End Sub Sub CloseWorkbook() ' In my real workbook, at this place I call a sub to do some final things like saving the workbook Application.StatusBar = False ThisWorkbook.Close End Sub 

为了testing这个,我只用了最后一分钟。 然后,我发现我遇到了其他手动启动程序的奇怪问题。 我的初步结论是:您不能一起运行一个手动启动的程序,并使用Application.OnTime命令启动一个程序。 我想我可以find解决办法,但我想确定我的结论是正确的。 Excel VBA应该是单线程的,所以我不确定我的结论是否正确。

因此,我的问题是:有人熟悉使用Application.OnTime命令触发的程序问题,同时手动启动的程序正在运行吗? 你知道有什么办法来解决这个问题吗?

我认为你的问题是你创build的Event在现有例程运行时不会触发。 这是正确的,因为你猜测:Excel VBA是单线程的。

也许你的“手动启动”过程是修改一个大表中的logging或类似的? 如果是这样的话,可以在你的循环中插入一个DoEvents来允许任何计划被触发的未决事件。 这将导致运行跳转到您的计划子程序( PlanNextTime() )并完成之前,返回到您的循环。

我看不出你的发布代码有太多的错误,尽pipe我承认我没有完全检查你的聪明但令人困惑的分钟和秒处理。 但是我注意到,您在StopCountDownTimer()看起来没有调用CloseWorkbook() 。 这可能意味着在closures工作簿,甚至完全closuresExcel时,Excel将在closures后重新打开工作簿,以运行下一个计划的事件。