Condividi tramite

Macro in running continuo

Anonimo
2013-09-03T07:02:06+00:00

Salve a tutti, 

sto lavorando ad un progetto per il quale mi occorre raccogliere continuamente dei dati da una pagina web per tenerli aggiornati in tempo reale (facciamo ogni 15-20 secondi). Quello che mi occorre, dunque, e' una macro che navighi il sito web online, scarichi i dati da HTML, li lavori su Excel e li inserisca in una tabella predefinita per mostrarli in tempo reale agli utenti. Ho gia' perfettamente in mente come fare tutto cio', ma il mio dubbio e' il seguente:

Lasciando eseguire la macro automaticamente ogni 15 secondi (esempio brutale: con un Application.Wait di 15 secondi ed un loop continuo) **Excel rimarra' continuamente inutilizzabile dal momento che la macro continuera' a girare ed impedira' la regolare funzionalita' di Excel.**Alla luce di questo, mi chiedevo:

  • E' possibile impostare un'istruzione che faccia eseguire la macro senza alterare tutte le funzioni di Excel?
  • Meglio ancora, e' possibile chiedere all'Application Excel di eseguire la propria macro ogni tot. di secondi, senza bisogno di farla entrare in un Do-Loop infinito(ed eseguirla quindi ogni volta di nuovo)?

Grazie a tutti 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-09-03T07:17:16+00:00

Salve a tutti, 

sto lavorando ad un progetto per il quale mi occorre raccogliere continuamente dei dati da una pagina web per tenerli aggiornati in tempo reale (facciamo ogni 15-20 secondi). Quello che mi occorre, dunque, e' una macro che navighi il sito web online, scarichi i dati da HTML, li lavori su Excel e li inserisca in una tabella predefinita per mostrarli in tempo reale agli utenti. Ho gia' perfettamente in mente come fare tutto cio', ma il mio dubbio e' il seguente:

Lasciando eseguire la macro automaticamente ogni 15 secondi (esempio brutale: con un Application.Wait di 15 secondi ed un loop continuo) **Excel rimarra' continuamente inutilizzabile dal momento che la macro continuera' a girare ed impedira' la regolare funzionalita' di Excel.**Alla luce di questo, mi chiedevo:

  • E' possibile impostare un'istruzione che faccia eseguire la macro senza alterare tutte le funzioni di Excel?
  • Meglio ancora, e' possibile chiedere all'Application Excel di eseguire la propria macro ogni tot. di secondi, senza bisogno di farla entrare in un Do-Loop infinito(ed eseguirla quindi ogni volta di nuovo)?

Grazie a tutti in anticipo!

Ciao Matteo,

in questo caso specifico, non devi utilizzare Wait, bensì OnTime. Ecco un esempio.

Andrea.


Option Explicit

Public refreshInterval         As Double

Public refreshOn               As Boolean

Public runWhen                 As Date

Sub toggleRefresh()

Const seconds As Double= 15 / 86400#

refreshOn = Not refreshOn

refreshInterval = seconds

If refreshOn Then

startRefresh

Else

stopRefresh

End If

End Sub

Sub startRefresh()

On Error Resume Next

runWhen = Now + refreshInterval

Application.OnTime runWhen, "refresh", , True

End Sub

Sub stopRefresh()

On Error Resume Next

Application.OnTime runWhen, "refresh", , False

On Error GoTo 0

End Sub

Sub refresh()

'---------- codice da eseguire scaduto il tempo

macro blahBlah

On Error Resume Next

runWhen = Now + refreshInterval

Application.OnTime runWhen, "refresh"

On Error GoTo 0

End Sub


La risposta è stata utile?

0 commenti Nessun commento

6 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2013-09-06T11:09:51+00:00

    Grazie ragazzi,

    pur non avendo mai studiato informatica, grazie a voi ho completato oggi il mio primo "grande" progetto. Che non avrebbe mai funzionato senza i vostri consigli... vi devo meta' stipendio!!!! Grazie davvero!!!

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-09-06T11:00:35+00:00

    Ciao Andrea,

    non mi stupisce che anche stavolta mi hai risolto il problema!!! La funzione e' esattamente quella che cercavo, anche se eseguendo il codice per come me lo hai dato tu non riuscivo a controllare il tempo (non girava ogni 15 secondi ma ogni millesimo di secondo, e non sono riuscito a calibrare il tempo). Ho scritto quest'altro frame di codice, molto semplicistico (quindi sicuramente con meno potenzialita' del tuo) ma che per il mio caso funziona bene. Grazie mille come sempre e alla prossima!!!

    _____________________________________________________

    Ciao Matteo,

    solo una precisazione.

    Il problema che lamenti è dovuto alla costante seconds, erroneamente dichiarata come Long, invece che Single o Double. Non esiste, quindi, l'esecuzione ogni millesimo di secondo, perché l'intervallo minimo che onTime può valutare è di 1 secondo, bensì un'esecuzione continua, dovuta proprio al fatto che l'incremento di tempo era 0 piuttosto che la frazione di tempo corretta.

    A scanso di equivoci, ho provveduto a correggere il codice postato

    Andrea.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-09-05T17:44:47+00:00

    Ho scritto quest'altro frame di codice, molto semplicistico (quindi sicuramente con meno potenzialita' del tuo) ma che per il mio caso funziona bene. Grazie mille come sempre e alla prossima!!!

    _____________________________________________________

    <cut>

    ____________________________________________________

    Vedi qui:

    http://www.maurogsc.eu/comefareperexcel/timermacro.aspx

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2013-09-05T13:52:23+00:00

    Ciao Andrea,

    non mi stupisce che anche stavolta mi hai risolto il problema!!! La funzione e' esattamente quella che cercavo, anche se eseguendo il codice per come me lo hai dato tu non riuscivo a controllare il tempo (non girava ogni 15 secondi ma ogni millesimo di secondo, e non sono riuscito a calibrare il tempo). Ho scritto quest'altro frame di codice, molto semplicistico (quindi sicuramente con meno potenzialita' del tuo) ma che per il mio caso funziona bene. Grazie mille come sempre e alla prossima!!!

    _____________________________________________________

    Sub refresh()

    Dim newHour As Integer

    Dim newMinute As Integer

    Dim newSecond As Integer

    'codice da eseguire

    On Error Resume Next

    newHour = Hour(Now())

    newMinute = Minute(Now())

    newSecond = Second(Now()) + 2

    runWhen = TimeSerial(newHour, newMinute, newSecond)

    Application.OnTime runWhen, "refresh"

    On Error GoTo 0

    End Sub

    ____________________________________________________

    La risposta è stata utile?

    0 commenti Nessun commento