Perdona, se le competenze vba sono al momento poche sarebbe meglio che tu seguissi esattamente quello che ti viene suggerito senza provare a fare migliorie premature...
Nel tuo codice, se la macro "ferma" non si aspetta parametri, come pensi di poterla richiamare passandogli un "mTempo"?
N° 2: invece di passarci del codice che non fa quello che hai in mente sarebbe meglio spiegarci quello che hai in mente, cosi' almeno possiamo usare il nostro tempo per suggerimenti utili e non per cercare di capire la richiesta.
N°3, per favore segnala come "Code" il codice che inserisci nei messaggi, altrimenti la lettura peggiora (seleziona il testo, premi il tasto Code sopra il box di inserimento del messaggio).
Cio' detto...
Se il tuo bisogno e' di far eseguire la macro per un tot di volte, comunque fintanto che A1 di Prono viene compilato anche a mano con un valore di 99 o superiore, ti bastera' sondare questa condizione PRIMA di rischedulare la macro, cosi' non avrai bisogno della Sub ferma.
INOLTRE devi tener presente che quando la macro si attivera' automaticamente e' possibile che tu stia lavorando su altri fogli, o altri file; quindi il codice della Sub aggioauto deve fare riferimento esplicito a quale Workbook e Worksheet essa deve operare; scrivere ActiveWorkbook vuol dire sfidare la sorte.
INFINE devi considerare che l' istruzione WAIT e' una trappola, perche' e' vero che essa aspetta i secondi che gli dici di aspettare, ma essa assorbe la quasi totalita' della cpu disponibile cosi' che e' possibile che dopo quella wait altri processi di cui aspettavi la fine in realta' non hanno nemmeno avuto l' occasione di essere cominciati. Meglio sostituire con un loop che include DoEvents.
Cio' detto credo che questo codice possa servire
- Codice: Seleziona tutto
Sub avvia()
' avvia Macro
Sheets("prono").Cells(1, 1) = 0
aggioauto
End Sub
Sub aggioauto()
' aggiornamento Macro
'
ThisWorkbook.RefreshAll '<< Modificata
'Application.Wait (Now + TimeValue("0:00:20")) '<< Cancellata
'wait 20 seconds '<< Aggiunte Do /Loop
myTim = Timer
Do
DoEvents: If Timer > myTim + 10 Or Timer < myTim Then Exit Do
Loop
'
Dim UR As Integer
UR = ThisWorkbook.Sheets("Prono").Range("C" & Rows.Count).End(xlUp).Row + 1
If UR < 3 Then
UR = 3
End If
With ThisWorkbook
' .Sheets("Prono (2)").Range("c4:m4").Copy
.Sheets("Prono").Range("c4:m4").Copy
.Sheets("Prono").Range("C" & UR).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
.Sheets("prono").Cells(1, 1) = .Sheets("prono").Cells(1, 1) + 1
End With
'onTime reschedule
If Sheets("prono").Cells(1, 1) < 99 Then
mTempo = Now + TimeSerial(0, 0, 10)
Application.OnTime mTempo, "aggioauto"
End If
'
End Sub
Se invece vuoi avere la possibilita' di interrompere una macro gia' pianificata allora devi seguire cio' che ti disse Ricky:
-avere una variabile "Public" usata per contenere l' orario della prossima rischedulazione. Una variabile Public deve essere definita in testa al modulo, prima di ogni macro.
-compilare questa variabile e usarla sia per la rischedulazione (es Application.OnTime mTempo, "aggioauto") che per l' annullamento (es Application.OnTime mTempo, "aggioauto", , False)
Fai sapere.