Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Salve a tutti,
ho trovato questo articolo interessante, che condivido, e che parla della temporizzazione delle macro.
Tuttavia non riesco a trovare risposta ad un quesito: e' possibile interrompere una macro se, dopo un certo frangente di tempo, non ha ancora terminato le operazioni?
Mi spiego meglio: ho una macro che va' su un sito web, esegue l'accesso, prende un dato che gli serve e lo riporta su Excel. Tuttavia, questo sito web e' un po' strano, a volte funziona e a volte no. Essendovi Cicli Loop all'interno della macro stessa, a volte capita che la pagina web non si carica correttamente ed il ciclo Loop ruota all'infinito, con conseguenti problemi su Excel (bisogna chiuderlo con il Task Manager, non c'e' verso di interrompere l'esecuzione della macro).
Per questo motivo mi chiedevo se, combinando qualcuna di queste funzioni di temporizzazione (es. Wait, OnTime etc.) fosse possibile, all'inizio della macro, chiedere di non far durare l'esecuzione piu' di (ad esempio) 15 secondi. Ho provato alcuni codici ma non riesco a beccare la giusta intuizione, qualche consiglio?
Grazie in anticipo!
Ciao Matteo,
il problema del caricamento delle pagine web, se ti ricordi, era già stato sollevato e costituisce il vero tallone d'Achille di questo metodo.
Ti allego un esempio di come può essere strutturata una macro che attende il caricamento di una pagina, stabilendo però un tempo massimo di esecuzione, scaduto il quale restituisce comunque il controllo alla procedura chiamante.
Non ti sarà difficile adattarla alle tue esigenze o modificarla per altri utilizzi.
Se non ti piacciono le API GetTickCount e Sleep - che consentono di lavorare su intervalli di tempo inferiori al secondo -, puoi sempre utilizzare questa che attende 1 secondo:
Application.Wait (Now() + "00:00:01")
Andrea.
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long)
Public Sub waitIE(ie As SHDocVw.InternetExplorer, Optional ByVal lTimeOut As Long = 10)
Dim lTimeStart As Long, lTimeElapsed As Long
lTimeOut = Timer + lTimeOut
While ie.Busy And (Timer < lTimeOut)
DoEvents
Wend
While (ie.ReadyState <> 4) And (Timer < lTimeOut)
DoEvents
Wend
While ie.Document Is Nothing And (Timer < lTimeOut)
DoEvents
Wend
lTimeStart = GetTickCount()
Do While (ie.Busy) And (ie.ReadyState <> 4)
Sleep 100
If (lTimeOut > 0) Then
lTimeElapsed = (GetTickCount() - lTimeStart) / 1000
If (lTimeElapsed > lTimeOut) Then Exit Do
End If
DoEvents
Loop
End Sub