Cacchius c'hai ragione!
Non sapevo che si potesse dichiarare la variabile globale in questo modo.
l'importante perché la variabile funzioni è che stia in testa al modulo.
Buono a sapersi, grazie mille
Cacchius c'hai ragione!
Non sapevo che si potesse dichiarare la variabile globale in questo modo.
l'importante perché la variabile funzioni è che stia in testa al modulo.
Buono a sapersi, grazie mille
Il bello di questo forum è che si continuano a scoprire cose nuove anche dopo anni che si usa uno strumento , io per esempio pochi post fa ho scoperto Application.DisplayAlerts = False![]()
![]()
La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
www.beppegrillo.it
Si concordo pienamente con te!
Dato che ci sono anche se vado leggermente out topic aggiungo anche questo codice:
Con questo codice si bloccheranno gli aggiornamenti video, velocizza gli aggiornamenti automatici di excel di un bel po'..
(ricordatevi di metterlo in true quando terminate la routine)
codice:Application.screenupdating = False
Questa è bellissima, la provo subito.
Ciao
La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
www.beppegrillo.it
Scusate se ci ho messo tempo a rispondere, sono finalmente riuscito a provare la macro.
Funziona perfettamente sia la chiusura, che la visualizzazione del countdown che il salvataggio delle modifiche senza interrompere l'autochiusura.
E' esattamente quello che mi serviva![]()
Adesso devo solo provarla su office 2003 (la versione al lavoro) e sperare che funzioni in quanto la ho provata qui a casa con office 2007.
![]()
Solo due cose sono infinite: l'universo e la stupidità umana, ma non sono sicuro della prima - Albert Einstein
Salve ragazzi, sono ancora qui che rompo.
Allora finalmente abbiamo migrato a win7/office 2010 ed ho potuto provare la macro.
Funziona tutto tranne una cosa, per evitare di chiudere tutta l'applicazione excel ma semplicemente il file in uso, ho provato a modificare la macro suggerita sostituendo "Application.Quit" con "thisWorkbook.close".
Effettivamente il file si chiude (dopo il salvataggio) ma si riapre da solo in loop.
Cosa ho sbagliato ? Allego di seguito la macro come è adesso:
In ThisWorkbook:
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:00:30"), "Chiudi"
Application.OnTime Now, "Countdown"
End Sub
In Modulo:
Private Sub Countdown()
Sheets(1).[c2] = TimeValue("00:00:30")
Visualizza
End Sub
Private Sub Visualizza()
Dim TempoRimanente As Date
TempoRimanente = ActiveSheet.Range("C2")
Sheets(1).[c2] = TempoRimanente - TimeValue("00:00:01")
Application.OnTime Now + TimeValue("00:00:01"), "Visualizza"
End Sub
Private Sub Chiudi()
ThisWorkbook.Save
ThisWorkbook.Close
End Sub
Grazie ed auguri a tutti di un sereno e prospero 2014
Application.Quit
Solo due cose sono infinite: l'universo e la stupidità umana, ma non sono sicuro della prima - Albert Einstein
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![]()
La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
www.beppegrillo.it
Cattura1.PNGCattura2.JPG
Ciao e grazie dell'aiuto.
Allora provato sul pc di casa (oofice 2007) funziona tutto, ma in quello del lavoro (office 2010) mi da il seguente errore (ti allego gli screen shot). Se e quando avrai tempo e voglia ..... grazie 1000.
Solo due cose sono infinite: l'universo e la stupidità umana, ma non sono sicuro della prima - Albert Einstein
Purtroppo (o per fortuna) non ho Office 2010 quindi posso solo andare per ipotesi anche perché cercando in rete non ho trovato nessuno che lamenti differenze fra le due versioni quindi non ho nulla su cui lavorare.
Comunque un paio di prove possiamo farle.
La prima cosa che mi viene da pensare è che la OnTime di chiusura della Visualizza non riesca a trovare il timer da killare perché nel frattempo Now è cambiato e quindi Now + TimeValue("00:00:01") ha un valore diverso da quello che aveva quando il timer è partito.
In realtà mi sto arrampicando sugli specchi perché, visto che la Visualizza parte ogni secondo, qualunque sia il Now qualcosa di attivo in quel momento ci sarà di sicuro, però, chissà, magari excel 2010 utilizza un Now con una precisione maggiore e questo porta problemi di arrotondamentiquindi tanto vale provare ad assegnare il valore Now + TimeValue("00:00:01") ad una variabile e poi usare quella sia nel loop che nel kill.
codice:Dim dTime Private Sub Countdown() ThisWorkbook.Sheets(1).[c2] = TimeValue("00:10: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") dTime = Now + TimeValue("00:00:01") Application.OnTime dTime, "Visualizza" End Sub Private Sub Chiudi() Application.DisplayAlerts = False ThisWorkbook.Save If Application.Workbooks.Count = 1 Then Application.Quit Else Application.OnTime dTime, "Visualizza", , False ThisWorkbook.Close End If End Sub
La nuova variabile come vedi è la dTime che viene calcolata in un solo punto e poi utilizzata sia per attivare che per killare il timer.
L'unica altra prova che mi viene in mente è di provare a passare i paramentri alla OnTime indicandone esplicitamente i nomi, chissà mai ...
codice:Dim dTime Private Sub Countdown() ThisWorkbook.Sheets(1).[c2] = TimeValue("00:10: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") dTime = Now + TimeValue("00:00:01") Application.OnTime EarliestTime:=dTime, Procedure:="Visualizza" End Sub Private Sub Chiudi() Application.DisplayAlerts = False ThisWorkbook.Save If Application.Workbooks.Count = 1 Then Application.Quit Else Application.OnTime EarliestTime:=dTime, Procedure:="Visualizza", Schedule:=False ThisWorkbook.Close End If End Sub
Per ora non mi viene in mente nient'altro, fammi sapere come va.
La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
www.beppegrillo.it
Grazie1000, domani provo e ti faccio sapere.
Solo due cose sono infinite: l'universo e la stupidità umana, ma non sono sicuro della prima - Albert Einstein