我已經制作了一個工作簿,它在閒置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命令觸發的程序問題,同時手動啓動程序正在運行? 你知道解決這個問題的方法嗎?
即使另一個例程當前正在運行,您希望'PlanNextTime()'運行嗎? – CLR