我有一些舊的Excel VBA代碼,我想定期運行任務。如果我使用VB6,我會用一個定時器控件。Excel VBA中的用戶表單中的計時器
我找到Application.OnTime()方法,它適用於在Excel工作表中運行的代碼,但我無法使其在用戶窗體中工作。該方法永遠不會被調用。
我該如何讓Application.OnTime()以用戶形式調用方法,或者是否有其他方法來安排代碼在VBA中運行?
我有一些舊的Excel VBA代碼,我想定期運行任務。如果我使用VB6,我會用一個定時器控件。Excel VBA中的用戶表單中的計時器
我找到Application.OnTime()方法,它適用於在Excel工作表中運行的代碼,但我無法使其在用戶窗體中工作。該方法永遠不會被調用。
我該如何讓Application.OnTime()以用戶形式調用方法,或者是否有其他方法來安排代碼在VBA中運行?
我找到了解決方法。如果您在模塊中編寫方法,只調用用戶表單中的方法,則可以使用Application.OnTime()來調度模塊方法。
一種kludge,但它會做,除非有人有更好的建議。
下面是一個例子:
''//Here's the code that goes in the user form
Dim nextTriggerTime As Date
Private Sub UserForm_Initialize()
ScheduleNextTrigger
End Sub
Private Sub UserForm_Terminate()
Application.OnTime nextTriggerTime, "modUserformTimer.OnTimer", Schedule:=False
End Sub
Private Sub ScheduleNextTrigger()
nextTriggerTime = Now + TimeValue("00:00:01")
Application.OnTime nextTriggerTime, "modUserformTimer.OnTimer"
End Sub
Public Sub OnTimer()
''//... Trigger whatever task you want here
''//Then schedule it to run again
ScheduleNextTrigger
End Sub
''// Now the code in the modUserformTimer module
Public Sub OnTimer()
MyUserForm.OnTimer
End Sub
如何將所有的代碼爲「定時器」模塊。
Dim nextTriggerTime As Date
Dim timerActive As Boolean
Public Sub StartTimer()
If timerActive = False Then
timerActive = True
Call ScheduleNextTrigger
End If
End Sub
Public Sub StopTimer()
If timerActive = True Then
timerActive = False
Application.OnTime nextTriggerTime, "Timer.OnTimer", Schedule:=False
End If
End Sub
Private Sub ScheduleNextTrigger()
If timerActive = True Then
nextTriggerTime = Now + TimeValue("00:00:01")
Application.OnTime nextTriggerTime, "Timer.OnTimer"
End If
End Sub
Public Sub OnTimer()
Call MainForm.OnTimer
Call ScheduleNextTrigger
End Sub
現在你可以從MainForm的呼籲:
call Timer.StartTimer
call Timer.StopTimer
爲了防止出錯,補充:
Private Sub UserForm_Terminate()
Call Timer.StopTimer
End Sub
至極觸發:
Public Sub OnTimer()
Debug.Print "Tick"
End Sub
我認爲這是唯一的方式唐。 – 2009-10-15 15:03:51
非常好的解決方法。 +1 – Tomalak 2012-11-19 19:47:57