2009-10-13 68 views
2

我有一些舊的Excel VBA代碼,我想定期運行任務。如果我使用VB6,我會用一個定時器控件。Excel VBA中的用戶表單中的計時器

我找到Application.OnTime()方法,它適用於在Excel工作表中運行的代碼,但我無法使其在用戶窗體中工作。該方法永遠不會被調用。

我該如何讓Application.OnTime()以用戶形式調用方法,或者是否有其他方法來安排代碼在VBA中運行?

回答

6

我找到了解決方法。如果您在模塊中編寫方法,只調用用戶表單中的方法,則可以使用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 
+0

我認爲這是唯一的方式唐。 – 2009-10-15 15:03:51

+0

非常好的解決方法。 +1 – Tomalak 2012-11-19 19:47:57

0

如何將所有的代碼爲「定時器」模塊。

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