Come realizzare una macro che viene eseguita periodicamente in Excel?
Domanda
Come si esegue periodicamente un codice VBA, completamente automatizzato?
Soluzione
È possibile utilizzare Application.OnTime per pianificare l'esecuzione periodica di una macro. Ad esempio, creare un modulo con il codice seguente. Chiama " Abilita " per avviare il timer.
È importante interrompere l'esecuzione del timer quando chiudi la cartella di lavoro: per farlo gestisci Workbook_BeforeChiudi e chiama " Disabilita "
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
In alternativa puoi usare le funzioni SetTimer / KillTimer dell'API Win32 in modo simile.
Altri suggerimenti
Esiste un metodo di applicazione che può essere utilizzato per eventi di temporizzazione. Se vuoi che ciò accada periodicamente dovrai "ricaricare" il timer dopo ogni esecuzione, ma dovrebbe essere piuttosto semplice.
Sub MyTimer()
Application.Wait Now + TimeValue("00:00:05")
MsgBox ("5 seconds")
End Sub
-Adam
Potresti prendere in considerazione l'Utilità di pianificazione di Windows e VBScript.
Faccio tutto il tempo, usavo " OnTime " come mostrato sopra, ma rende la macchina su cui stai eseguendo il codice inutile per altre cose, perché Excel esegue il 100% delle volte. Invece, utilizzo una cartella di lavoro nascosta modificata ed eseguo con l'utilità di pianificazione di Windows e nella funzione workbook_open di questa cartella di lavoro chiama la macro dalla cartella di lavoro personale oppure apro ed eseguo un'altra cartella di lavoro con il codice in essa contenuto. Una volta eseguito il codice, è possibile chiamare la funzione application.quit dalla cartella di lavoro nascosta e chiudere ecxel per la successiva esecuzione. Lo uso per tutte le mie funzioni di segnalazione automatica incustodita di 15 minuti e giornaliere.