Condividi:        

[Excel] Application.OnTime questo fantastico comando

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[Excel] Application.OnTime questo fantastico comando

Postdi mpsinf » 01/11/12 18:29

Faccio riferimento a Application.OnTime tempo, "Nome Macro" scoperto tempo fa un altro forum dove dicevano pure che è di solito poco utilizzato.
Io l'ho provato e trovato fantastico perchè permette, contrariamente al classico concetto che quando una macro è in funzione esegue delle istruzioni in sequenza, di eseguire altre operazioni. Tant'è che addirittura si può rilanciare la stessa macro che se prima andava in esecuzione ogni ora poi partirà in modo alternativo/multiplo. (Puoi cambiare anche account in Windows e questa continua a girare..)

E il problema sta proprio qui. L'unico modo o penso sia l'unico per fermare l'esecuzione è quella (oltre di premere ESC ma solo quando è in esecuzione in codice con qualche operazione) è quello di fare eseguire il comando

Application.OnTime tempo, "Nome Macro", , False

Se ad esempio si lancia 2 volte una macro con all'interno il codice Application.OnTime tempo, "Nome Macro" dovremmo lanciare 2 volte la macro contenente il comando Application.OnTime tempo, "Nome Macro", , False per fermarle entrambe.

A questo punto, secondo voi e come, è possibile creare una finestra/pulsante (penso tipo USEFORM .. dovrò studiarmela un po') o più finestre che visualizzino tutte le Macro in esecuzione con Application.OnTime ? e così interromperle.!

Chiedo questo perchè dovente creare delle Macro con controllo a tempo dove il "tempo" continua a cambiare non vorrei entrare in un ciclo dal quale uscire diventi un ginepraio.. :D
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Sponsor
 

Re: [Excel] Application.OnTime questo fantastico comando

Postdi PcBase » 01/11/12 23:31

Ciao

Un collegamento microsoft suggerisce:
http://support.microsoft.com/kb/121212/it
Codice: Seleziona tutto
Dim TimeNow As Double
   Dim TimeStop As Double
   Dim TimeSet As Double

   Sub RunMeFirst()
      TimeNow = Now
      TimeStop = TimeNow + TimeValue("00:00:59") 'this sets the time at
                                                 'which all macros will
                                                 'stop
      TimeSet = TimeNow + TimeValue("00:00:15")
      Set_OnTime
   End Sub

   Sub Set_OnTime()
      Application.OnTime TimeSet, "TestMacro"

      If TimeSet > TimeStop Then  'compare the time to stop with the time
                                  'at which the TestMacro is scheduled to
                                  'run
         Application.OnTime TimeSet, "TestMacro", , False
      End If
   End Sub

   Sub TestMacro()
      ActiveCell.Value = 1
      ActiveCell.Offset(1, 0).Select
      TimeSet = TimeSet + TimeValue("00:00:15")
      Set_OnTime
   End Sub
Windows xp + Office 2003 Ita
Windows8 Office 2013
PcBase
Utente Senior
 
Post: 143
Iscritto il: 24/02/11 23:26

Re: [Excel] Application.OnTime questo fantastico comando

Postdi Anthony47 » 02/11/12 20:02

Propongo una semplificazione rispetto a quanto suggerito da Microsoft, secondo il seguente ragionamento:
1) vanno evitate schedulazioni multiple; cioe' se una macro e' gia' stata richiesta per essere eseguita alle xx:yy (orario futuro) la stessa macro non va schedulata per un altro diverso orario.
2) per tenere traccia di una schedulazione, usa una cella di un tuo foglio di lavoro, che compilerai con data /ora della schedulazione richiesta (il codice Microsoft usa una variabile Pubblica, che pero' va in crisi alla chiusura del file)
3) una eventuale rischedulazione sara' programmata solo se data /ora corrente [istruzione Now()] e'
>= del contenuto di quella cella.
4) in chiusura del file va' fermata l' eventuale schedulazione pendente; per questo userai una macro di Workbook_BeforeClose (da mettersi in ThisWorkbook) che controlla se in quella cella c' e' una data /ora futura [cioe > Now()], se SI usa quell' orario per deschedularla; qualcosa come:
Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If ThisWorkbook.Sheets("Foglio3").Range("Z1") > Now() Then
    Application.OnTime ThisWorkbook.Sheets("Foglio3").Range("Z1"), "TestMacro", , False
Else
    ThisWorkbook.Sheets("Foglio3").Range("Z1").Clear
End If
End Sub

Sheets("Foglio3").Range("Z1") e' ipoteticamente la cella usata per tenere traccia della schedulazione, TestMacro e' il nome della macro da deschedulare.
Ricorda che nella macro che viene eseguita periodicamente devi utilizzare sempre riferimenti espliciti al file e al foglio di lavoro, evitando di modificare qualsiasi selezione (tipo Selezionare un Foglio, oppure un Range); questo perche' ragionevolmente quando essa viene eseguita non dovrai interferire con quanto in quel momento stara' facendo l' utente.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Application.OnTime questo fantastico comando

Postdi mpsinf » 03/11/12 15:37

Grazie per la precisazione di alcuni aspetti, ma dubbioso/ignorante da parte mia sotto alcuni altri...

Anthony47 ha scritto:Propongo una semplificazione rispetto a quanto suggerito da Microsoft, secondo il seguente ragionamento:
1) vanno evitate schedulazioni multiple; cioe' se una macro e' gia' stata richiesta per essere eseguita alle xx:yy (orario futuro) la stessa macro non va schedulata per un altro diverso orario.

pienamente d'accordo che lanciarne molteplici dello stesso può crerare gran confusione e non è da farsi

2) per tenere traccia di una schedulazione, usa una cella di un tuo foglio di lavoro, che compilerai con data /ora della schedulazione richiesta (il codice Microsoft usa una variabile Pubblica, che pero' va in crisi alla chiusura del file)

sarebbe possibile invece avere una specie di "post it" volante sullo schermo con i nomi degli "OnTime" attivi (es. di colore rosso quelli attivi e di colore verde quelli spenti)

3) una eventuale rischedulazione sara' programmata solo se data /ora corrente [istruzione Now()] e'
>= del contenuto di quella cella.

si Ok, adattata però alla versione con pulsanti !?

4) in chiusura del file va' fermata l' eventuale schedulazione pendente; per questo userai una macro di Workbook_BeforeClose (da mettersi in ThisWorkbook) che controlla se in quella cella c' e' una data /ora futura [cioe > Now()], se SI usa quell' orario per deschedularla; qualcosa come:

perchè non si ferma se chiudo il file ?, una macro indemoniata ehh ostregheta.!!!!. :o
inoltre comunque mi delucidi perchè "da mettersi in ThisWorkbook" ?
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Re: [Excel] Application.OnTime questo fantastico comando

Postdi Anthony47 » 03/11/12 17:37

sarebbe possibile invece avere una specie di "post it" volante sullo schermo con i nomi degli "OnTime" attivi (es. di colore rosso quelli attivi e di colore verde quelli spenti)
Certamente...
Se hai piu' macro da schedulare ontime allora avrai piu' celle in cui memorizzi data /ora del prossimo schedule; sara' sufficiente che la macro quando comincia ad eseguirsi pone a verde il colore interno della relativa cella e quando la rischeduli lo metti rosso. Es:
Codice: Seleziona tutto
Sub SchduledMacro1()
ThisWorkbook.Sheets("Foglio3").Range("Z1").Interior.Color=rgb(0,255,0)
'istruzioni macro
'
'check se da rischedulare
'
'Rischedulare:
ThisWorkbook.Sheets("Foglio3").Range("Z1").value=NextSched
ThisWorkbook.Sheets("Foglio3").Range("Z1").Interior.Color=rgb(255,0,0)
Application.OnTime NextSched, " SchduledMacro1"
End Sub

si Ok, adattata però alla versione con pulsanti !?
Quello che avevo descritto era una verifica da fare prima di eventualmente rischedulare con OnTime la macro, comunque essa sia stata avviata.
Insomma il processo prevede che una macro venga avviata, e se corrispondono certi tuoi presupposti la macro venga schedulata per essere rieseguita a una certa data/ora; ecco, ai "tuoi presupposti" devi aggiungere anche quelli che ti ho suggerito io.

perchè non si ferma se chiudo il file ?, una macro indemoniata ehh ostregheta.!!!!.
Se pianifichi un evento e non lo disdici questo viene eseguito come da pianificazione; piu' che una macro indemoniata direi che dobbiamo parlare di un sistema operativo serio...

inoltre comunque mi delucidi perchè "da mettersi in ThisWorkbook" ?
Perche' le macro di eventi, e Workbook_BeforeClose e' un "evento", vanno messe all' interno dei moduli di codice propri dell' oggetto a cui l' evento si riferisce.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Application.OnTime questo fantastico comando":


Chi c’è in linea

Visitano il forum: Nessuno e 127 ospiti