Condividi tramite

VBA in Excel: interrompere l'esecuzione di una macro se non e' terminata in 20 secondi

Anonimo
2013-08-07T09:40:32+00:00

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!

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2013-08-07T11:15:24+00:00

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


La risposta è stata utile?

0 commenti Nessun commento

2 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2013-08-09T16:49:02+00:00

    Grazie Andrea, come sempre funziona ed e' esattamente quello che cercavo! 

    Bene, grazie a te.

    Andrea.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-08-09T15:54:01+00:00

    Grazie Andrea, come sempre funziona ed e' esattamente quello che cercavo!

    La risposta è stata utile?

    0 commenti Nessun commento