2017-04-06 24 views
0

我已經制作了一個工作簿,它在閒置10分鐘後必須關閉。我使用Application.OnTime的計時器。每隔一分鐘不活動後,我都會使用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 

爲了測試這個,我只用了最後一分鐘。然後我發現我遇到了其他手動啓動程序的奇怪問題。我的初步結論是:您不能將一個手動啓動的過程與Application.OnTime命令啓動的過程一起運行。我想我可以找到解決辦法,但我想確定我的結論是正確的。 Excel VBA應該是單線程的,所以我不確定我的結論是否正確。

因此,我的問題給你:是否有人熟悉使用Application.OnTime命令觸發的程序問題,同時手動啓動程序正在運行? 你知道解決這個問題的方法嗎?

+0

即使另一個例程當前正在運行,您希望'PlanNextTime()'運行嗎? – CLR

回答

1

我認爲你的問題是你創建的Event在現有例程運行時不會觸發。這對於你推測的原因是正確的:Excel VBA是單線程的。

也許你的「手動啓動」過程是修改大型表中的記錄或類似的?如果是這種情況,請在您的循環中插入一個DoEvents,以允許計劃觸發任何未決事件。這會導致運行跳轉到您的預定子程序(PlanNextTime())並在返回到循環之前完成該操作。

我看不出你的發佈代碼有太多錯誤,儘管我承認我沒有完全檢查你的聰明但令人困惑的分鐘與秒處理。不過,我注意到您在CloseWorkbook()內似乎沒有撥打StopCountDownTimer()。這可能意味着,在關閉工作簿或Excel時,Excel將在關閉後重新打開工作簿以運行下一個計劃事件。