Stile VBA Macro On Timer per eseguire il codice ogni numero impostato di secondi, ad esempio 120 secondi

Ho bisogno di eseguire un pezzo di codice ogni 120 secondi. Sto cercando un modo semplice per farlo in VBA. So che sarebbe ansible ottenere il valore del timer dall’evento Auto_Open per evitare di dover usare un numero magico, ma non riesco a capire come triggersre un timer per ottenere qualcosa da eseguire ogni 120 secondi.

Non voglio davvero usare un ciclo infinito con un sonno se posso evitarlo.


MODIFICA :

Il cross-post basato su una risposta fornita è a: Excel VBA Application.OnTime. Penso che sia una ctriggers idea usare questo … pensieri in entrambi i modi?

All’apertura della cartella di lavoro, eseguire questo codice:

 alertTime = Now + TimeValue("00:02:00") Application.OnTime alertTime, "EventMacro" 

Quindi basta avere una macro nella cartella di lavoro denominata “EventMacro” che la ripeterà.

 Public Sub EventMacro() '... Execute your actions here' alertTime = Now + TimeValue("00:02:00") Application.OnTime alertTime, "EventMacro" End Sub 

Sì, puoi usare Application.OnTime per questo e poi metterlo in un ciclo. È un po ‘come una sveglia in cui tieni premuto il pulsante snooze per quando vuoi che suoni di nuovo. I seguenti aggiornamenti cella A1 ogni tre secondi con il tempo.

 Dim TimerActive As Boolean Sub StartTimer() Start_Timer End Sub Private Sub Start_Timer() TimerActive = True Application.OnTime Now() + TimeValue("00:00:03"), "Timer" End Sub Private Sub Stop_Timer() TimerActive = False End Sub Private Sub Timer() If TimerActive Then ActiveSheet.Cells(1, 1).Value = Time Application.OnTime Now() + TimeValue("00:00:03"), "Timer" End If End Sub 

È ansible inserire la procedura StartTimer nell’evento Auto_Open e modificare ciò che viene eseguito nella procedura del Timer (in questo momento è sufficiente aggiornare l’ora in A1 con ActiveSheet.Cells(1, 1).Value = Time ).

Nota : ti consigliamo il codice (oltre a StartTimer ) in un modulo, non un modulo del foglio di lavoro. Se lo hai in un modulo del foglio di lavoro, il codice richiede una leggera modifica.

Negli eventi di Workbook:

 Private Sub Workbook_Open() RunEveryTwoMinutes End Sub 

In un modulo:

 Sub RunEveryTwoMinutes() //Add code here for whatever you want to happen Application.OnTime Now + TimeValue("00:02:00"), "RunEveryTwoMinutes" End Sub 

Se si desidera che la prima parte di codice venga eseguita dopo l’apertura della cartella di lavoro, è sufficiente aggiungere un ritardo di 2 minuti all’evento Workbook_Open

(Questo è parafrasato dai file della guida di MS Access. Sono sicuro che XL ha qualcosa di simile.) Fondamentalmente, TimerInterval è una proprietà a livello di modulo. Una volta impostato, utilizza il sotto Form_Timer per eseguire l’azione desiderata.

 Sub Form_Load() Me.TimerInterval = 1000 '1000 = 1 second End Sub Sub Form_Timer() 'Do Stuff End Sub 

Ho scoperto che l’uso di OnTime può essere doloroso, in particolare quando:

  1. Stai provando a codificare e il focus sulla finestra viene interrotto ogni volta che si triggers l’evento.
  2. Hai più cartelle di lavoro aperte, chiudi quella che dovrebbe utilizzare il timer e continua a far scattare e riaprire la cartella di lavoro (se hai dimenticato di uccidere l’evento correttamente).

Questo articolo di Chip Pearson è stato molto illuminante. Ora preferisco usare il Timer di Windows, invece di OnTime .

La mia soluzione:

 Option Explicit Public datHora As Date Function Cronometro(action As Integer) As Integer 'This return the seconds between two >calls Cronometro = 0 If action = 1 Then 'Start datHora = Now End If If action = 2 Then 'Time until that moment Cronometro = DateDiff("s", datHora, Now) End If End Function 

Come usare? Facile…

 dummy= Cronometro(1) ' This starts the timer seconds= Cronometro(2) ' This returns the seconds between the first call and this one