2008-10-17 29 views

回答

11

您可以使用Application.OnTime調度需要定期執行的宏。例如用下面的代碼創建一個模塊。調用「啓用」啓動定時器運行。第一個這樣做處理Workbook_BeforeClose,並呼籲「禁用」

Option Explicit 

Private m_dtNextTime As Date 
Private m_dtInterval As Date 

Public Sub Enable(Interval As Date) 
    Disable 
    m_dtInterval = Interval 
    StartTimer 
End Sub 

Private Sub StartTimer() 
    m_dtNextTime = Now + m_dtInterval 
    Application.OnTime m_dtNextTime, "MacroName" 
End Sub 

Public Sub MacroName() 
    On Error GoTo ErrHandler: 
    ' ... do your stuff here 

    ' Start timer again 
    StartTimer 
    Exit Sub 
ErrHandler: 
    ' Handle errors, restart timer if desired 
End Sub 

Public Sub Disable() 
    On Error Resume Next ' Ignore errors 
    Dim dtZero As Date 
    If m_dtNextTime <> dtZero Then 
     ' Stop timer if it is running 
     Application.OnTime m_dtNextTime, "MacroName", , False 
     m_dtNextTime = dtZero 
    End If 
    m_dtInterval = dtZero 
End Sub 

或者您可以使用Win32 API的SetTimer/KillTimer函數功能以類似的方式:

它當您關閉工作簿時停止定時器運行是非常重要的。

+2

...要完全自動化這個正確答案,請將 調用MacroName() 到Workbook_Open()事件。 這樣,無論何時您打開xls/xlsm,MacroName都會在沒有任何用戶干預的情況下啓動其特徵。 – jpinto3912 2008-11-12 18:27:02

+1

嗯,我不知道什麼時候分配了m_dtInterval(除了dtZero以外)? – gregseth 2012-02-04 20:52:03

1

有一種應用方法可用於計時事件。如果你想這個定期發生,你必須在每次執行後重新加載計時器,但這應該是非常簡單的。

Sub MyTimer() 
    Application.Wait Now + TimeValue("00:00:05") 
    MsgBox ("5 seconds") 
End Sub 

- 亞當

0

您可以考慮Windows任務計劃程序和VBScript。

0

我一直這樣做,我曾經使用上面顯示的「OnTime」方法,但它使得您正在運行代碼的機器無法用於其他事情,因爲Excel在100%的時間內運行。相反,我使用修改後的隱藏工作簿,並使用Windows任務計劃程序執行,並在本工作簿中使用workbook_open函數從您的個人工作簿中調用宏,或者打開並運行其中包含代碼的其他工作簿。代碼運行後,您可以從隱藏的工作簿中調用application.quit函數,並關閉下一次運行的ecxel。我在15分鐘和每日無人值守報告功能中使用它。