Preferisco evitare soluzioni chiavi in mano, anche se questo spesso e' piu' oneroso che fare direttamente.
Ora tu dici
"vorrei che la macro aggioauto partisse al mio comando (avvia) ed
automaticamente ogni tot tempo (che decido io impostando il valore nelle
celle g2, h2 e i2, rispettivamente ore, minuti e secondi) svolgesse il suo
compito fino a quando, con altra macro (ferma) blocchi tutto"
La macro precedente e' gia' idonea, anche se sono necessarie piccole variazioni:
-si mantiene l' approccio di fermare la rischedulazione della macro quando una cella che usi come flag viene compilata con un valore noto, es 9999
-la stessa cella flag viene incrementata per dare una indicazione visiva di macro in esecuzione.
-usi la macro Ferma per compilare la cella Flag a questo valore e contemporaneamente deschedulare l' esecuzione di aggioauto
Questo corrisponde al seguente codice:
- Codice: Seleziona tutto
Public mTempo As Date, CellaFlag As String 'Deve stare in testa al Modulo
Sub avvia()
' avvia Macro
CellaFlag = "A1" '<<< *1
Sheets("prono").Range(CellaFlag) = 0
aggioauto
End Sub
Sub aggioauto()
' aggiornamento Macro
'
'CellaFlag = "A1"
'
ThisWorkbook.RefreshAll '<< Mod
'Application.Wait (Now + TimeValue("0:00:20")) '<< Del
'wait 20 seconds '<< Aggiunte Do /Loop
myTim = Timer
Do
DoEvents: If Timer > myTim + 10 Or Timer < myTim Then Exit Do '<< *2
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
If CellaFlag <> "" Then 'Non rischedulare se gia' attivo
With ThisWorkbook.Sheets("Prono")
ThisWorkbook.Sheets("Prono (2)").Range("c4:m4").Copy
.Range("C" & UR).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
.Range(CellaFlag) = .Range(CellaFlag) + 1
If .Range(CellaFlag) < 9999 Then
If (.Range("G2") * 3600 + .Range("H2") * 60 + .Range("I2") < 10) Then .Range("I2") = 10 '<< *3
mTempo = Now + TimeSerial(.Range("G2"), .Range("H2"), .Range("I2"))
Application.OnTime mTempo, "aggioauto"
End If
End With
End If
End Sub
Sub ferma()
' ferma Macro
'
On Error Resume Next
If CellaFlag <> "" Then
ThisWorkbook.Sheets("Prono").Range(CellaFlag) = 9999
Application.OnTime mTempo, "aggioauto", , False
MsgBox "Fine Elaborazione"
CellaFlag = ""
On Error GoTo 0
End If
End Sub
Rispetto al precedente ho inserito la possibilita' di variare la "Cella Flag" (prima era fissa ad A1), la possibilita' di scrivere in G2, H2 e I2 il periodo di rischedulazione (con un minimo pero' di 10 secondi), la modifica del valore di conta a 9999 per interrompere la schedulazione, la macro Ferma.
Uso:
-da excel, Alt-F11 per aprire l' editor delle macro
-Menu /Inserisci /Modulo
-copia il codice, da Public in avanti, e incollalo sul frame vuoto di dx
Se hai inserito versioni precedenti delle stesse macro in un altro Modulo allora cancellale.
Modifica le istruzioni marcate *1 (l' indirizzo della "cella Flag"), *2 (l' attesa dopo RefreshAll) e *3 (il minimo ritardo di rischedulazione, in secondi).
Sarebbe anche opportuno inserire questo codice in ThisWorkbook:
- Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call ferma
End Sub
Questo ferma la schedulazione quando si chiude il file.
Prova ad applicare al tuo file e fai sapere dove arrivi.
In quanto all' ultimo tuo messaggio:
-di Wait ti ho gia' detto cosa ne penso
-prova a spiegare che tipo di dati devi rinfrescare e vedremo se esiste la possibilita' di evitare l' aggiornamento in background in modo da avere un facile sincronismo tra la disponibiita' dei dati e la copy
Ciao