Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA: macro a tempi prestabiliti

292 views
Skip to first unread message

draleo

unread,
Jun 27, 2020, 2:15:02 AM6/27/20
to
Avrei la necessità di eseguire una macro ripetutamente (diciamo 8-10 volte)ad intervalli di 15 minuti, senza stare sempre davanti al PC per farlo manualmente.
Si può fare ? se si, come ?
draleo

buonoc...@gmail.com

unread,
Jun 27, 2020, 7:30:22 PM6/27/20
to
Sfrutta Application.OnTime in una macro periodica che richiama se stessa
con un'altra macro che fa da interruttore e che blocca quella periodica con una variabile booleana globale. Ha il vantaggio che nell'intervallo tra un'esecuzione e quella successiva l'utente ha il controllo di Excel per fare altre task.
Comincia qui:
https://docs.microsoft.com/en-us/office/vba/api/excel.application.ontime

Elio

pic omnic

unread,
Jun 29, 2020, 9:26:45 AM6/29/20
to
1)dove posizionare le istruzioni suggerite ?
draleo
PS: da qualche gg non riesco più a rispondere ai messaggi di questo gruppo (accesso negato).Posso vederli , ma non rispondere. Anche questa non so se sarà accettata. Succede anche ad altri ?

casanmaner

unread,
Jun 29, 2020, 1:28:22 PM6/29/20
to
Prova a vedere se questo esempio può esserti utile:
https://www.dropbox.com/s/vai8qz4jouuch01/vba%20macro%20a%20tempi%20prestabiliti.xlsm?dl=0

In Modulo1 ho il seguente codice:

Option Explicit

Const NumeroRipetizioni As Long = 10
Const sIntervalloRipetizione As String = "00:00:02"

Public sTempoSuccessivaRipetizione As Date
Dim ContaRipetizioni As Long

Sub AvviaRipetizioneMacro()
ContaRipetizioni = ContaRipetizioni + 1
Call MiaMacroDaRipetere
sTempoSuccessivaRipetizione = Now + TimeValue(sIntervalloRipetizione)
If ContaRipetizioni < NumeroRipetizioni Then
Application.OnTime EarliestTime:=sTempoSuccessivaRipetizione, _
Procedure:="AvviaRipetizioneMacro", _
Schedule:=True
End If
End Sub

Sub TerminaRipetizioneMacro()
On Error Resume Next
ContaRipetizioni = 0
Application.OnTime EarliestTime:=sTempoSuccessivaRipetizione, _
Procedure:="AvviaRipetizioneMacro", _
Schedule:=False
End Sub

Sub MiaMacroDaRipetere()
MsgBox "Ripetizione Macro " & ContaRipetizioni
End Sub

Nel modulo di classe ThisWorkbook ho il seguente codice:
Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call TerminaRipetizioneMacro
End Sub

----
In pratica quando si lancia la routine "AvviaRipetizioneMacro" viene valorizzata una variabile che fa da contatore, viene lanciata ma macro che si desidera venga ripetuta più volte (da sostituire con il nome della tua macro), terminata tale macro viene valorizzato il tempo della successiva ripetizione.
Se il contatore è minore del numero massimo di ripetizioni che si desidera vengano effettuati viene impostato, tramite Application.OnTime, la successiva ripetizione della routine "AvviaRipetizioneMacro".

La routine "TerminaRipetizioneMacro" serve per interrompere prima di una successiva esecuzione la procedura.
Ho fatto in modo che si attivi quando viene chiuso il file con l'evento "before_close" della cartella di lavoro.
Ma con un pulsante può essere eseguita anche "manualmente" andando ad interrompere eventuali esecuzioni impostate nel futuro.

casanmaner

unread,
Jun 29, 2020, 1:31:34 PM6/29/20
to
Aggiungo che per impostare un intervallo di 15 minuti questa costante va così impostata:
Const sIntervalloRipetizione As String = "00:15:00"

pic omnic

unread,
Jun 30, 2020, 4:28:48 AM6/30/20
to
ottima. ora non ho potuto provarla con la macro reale (lo farò stasera), ma non ho alcun dubbio sul suo buon funzionamento. grazie mille.
draleo

pic omnic

unread,
Jul 5, 2020, 10:45:01 AM7/5/20
to

> ottima. ora non ho potuto provarla con la macro reale (lo farò stasera), ma non ho alcun dubbio sul suo buon funzionamento. grazie mille.
> draleo

mi da un problema. vorrei estrarre alcune cose da un sito web . Ho inserito nel codice del tuo file "VBA macro a tempi prestabiliti" la nuova macro che in un' altra procedura -sempre tua-funzionava bene
Tale macro contiene la riga
Dim htmlDoc As HTMLDocument
Adesso però quando clicco sul pulsante AVVIO, alla riga indicata, mi dà il seguente errore
Tipo definito dall'utente non definito
Dove intervenire ?
draleo


casanmaner

unread,
Jul 5, 2020, 11:54:10 AM7/5/20
to
Non avrai richiamato le librerie presenti nel file da cui hai copiato la macro.
Vai nel file oridinario e apri da VBA Editor la voce strumenti->riferimenti e verifica quali riferimenti sono selezionati e richiamali anche nel file che stai utilizzando.

Anche se io copierei le macro per i tempi prestabiliti nell'altro file :)

pic omnic

unread,
Jul 5, 2020, 4:20:42 PM7/5/20
to
Si. in effetti mancava il riferimento ad una libreria che invece serviva. l'errore descritto non c'è più. Ma devo aver commesso qualche altro errore nell'inserire la tua nuova procedura sulla vecchia macro -che è parecchio complessa e che richiama altre macro. Infatti mi viene eseguita solo la prima volta e non più ripetuta (invece dovrebbe ripeterla 10 volte). Ma trattasi di un errore mio che dovrò individuare, perchè il tuo nuovo file con altre macro più semplici funzionava senza problemi. dovrò studiarci sopra e riferirò sugli esiti
grazie
draleo

casanmaner

unread,
Jul 6, 2020, 1:23:47 AM7/6/20
to
Tu devi far partire la macro "AvviaRipetizione" dalla quale far a sua volta partire la tua macro.
In pratica dove ora è presente l'istruzione:
Call MiaMacroDaRipetere

devi inserire il nome della tua macro.
Questa macro e quelle dalla stessa richiamate verrà eseguita per intero e solo alla fine verranno eseguite le istruzioni successive che impostano la ripetizione.

pic omnic

unread,
Jul 6, 2020, 3:47:27 PM7/6/20
to
Si, funziona bene. Come un coglione non mi ero accorto che il pulsante di avvio , lanciava direttamente la vecchia macro e non "AvviaRipetizioneMacro".
Complimenti
draleo
0 new messages