
Originariamente inviata da
teo1964
Effettivamente il file si chiude (dopo il salvataggio) ma si riapre da solo in loop.
Grazie ed auguri a tutti di un sereno e prospero 2014
Dunque, il problema sembra che sia questo:
Appena il foglio excel viene aperto vengono fatte partire due routine, una che interviene dopo un certo tempo per chiudere il foglio (Chiudi) e un'altra, la Countdown, che innesca il ciclo della Visualizza su se stessa con periodo di un secondo.
Quando la Chiudi chiudeva tutta l'applicazione terminava anche la Visualizza che era lì a ciclare tranquillamente su stessa ma ora che la Chiudi si limita a chiudere solo il workbook, lasciando l'applicazione in vita, la Visualizza continua a richiamare se stessa e, per farlo, riapre il foglio (a me poi viene generato un errore dovuto al disallineamento delle variabili ma questo è un effetto collaterale).
La soluzione migliore mi sembra di killare esplicitamente la Visualizza aggiungendo questa riga prima di chiudere il foglio:
codice:
Application.OnTime Now + TimeValue("00:00:01"), "Visualizza", , False
Dalle prove che ho fatto sembra funzionare, nel senso che il ciclo non viene reinnescato e, contemporaneamente, si ottiene l'effetto di lasciare aperti eventuali altri workbook però non basta ancora perché se il foglio col conto alla rovescia è l'unico aperto resta excel aperto con la schermata grigia perché in quel caso bisogna fare la vecchia Application.Quit.
Per risolvere allora ho aggiunto un test sul numero di workbooks aperti: se è 1 faccio la Quit, altrimenti uccido la Visualizza e poi Close:
codice:
Private Sub Chiudi()
Application.DisplayAlerts = False
ThisWorkbook.Save
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
Application.OnTime Now + TimeValue("00:00:01"), "Visualizza", , False
ThisWorkbook.Close
End If
End Sub
Poi però, provando ad aprire e chiudere fogli mi sono accorto di un altro problema e cioè che la ActiveSheet.Range("C2") non punta sempre allo stesso foglio ma al foglio che è attivo in quel momento ed allora succede che se apro il foglio col countdown e poi, mentre il tempo scorre, apro un altro foglio, mi ritrovo il conto alla rovescia nella C2 di questo nuovo foglio.
Per risolvere ho utilizzato la
codice:
ThisWorkbook.Sheets(1).[c2]
in tutti i punti in cui viene referenziata la cella C2.
In definitiva quindi:
codice:
Private Sub Countdown()
ThisWorkbook.Sheets(1).[c2] = TimeValue("00:30:00")
Visualizza
End Sub
Private Sub Visualizza()
Dim TempoRimanente As Date
TempoRimanente = ThisWorkbook.Sheets(1).[c2]
ThisWorkbook.Sheets(1).[c2] = TempoRimanente - TimeValue("00:00:01")
Application.OnTime Now + TimeValue("00:00:01"), "Visualizza"
End Sub
Private Sub Chiudi()
Application.DisplayAlerts = False
ThisWorkbook.Save
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
Application.OnTime Now + TimeValue("00:00:01"), "Visualizza", , False
ThisWorkbook.Close
End If
End Sub
Così mi sembra che vada bene.
Auguri a tutti