Domanda

Come si esegue periodicamente un codice VBA, completamente automatizzato?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top