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.