VBA DoEvents

Sommario

Il VBA FaiEventi La funzione sospende temporaneamente una macro in esecuzione, dando a Excel la possibilità di elaborare le pressioni dei tasti, i clic del mouse e altri messaggi del sistema operativo.

Nelle macro a esecuzione prolungata, Excel può sembrare bloccato e non rispondere e potrebbe essere impossibile interrompere la macro. Se DoEvents è incluso nel codice, gli utenti possono essere certi che la macro è ancora in esecuzione e possono comunque interrompere l'esecuzione se necessario.

Esempio di VBA DoEvents

Considera il seguente codice:

1234567891011 Sottotest pubblico()Dim I As LongPer i = 1 a 20000Intervallo ("A1"). Valore = iAvanti ioFine sottotitolo

Quando provi questo codice, noterai che non è possibile interagire con la finestra di Excel. Tuttavia, poiché non è molto impegnativo per il processore, la macro può comunque essere interrotta premendo ESC o CTRL+INTERR.

Tuttavia, se all'interno di questo ciclo venivano eseguite molte funzioni complesse e impegnative, Excel impiegherebbe più tempo per registrare un evento di pressione dei tasti, fino a diversi minuti o forse per niente, soprattutto se il computer esegue altri programmi contemporaneamente.

Ora aggiungi una singola riga con DoEvents sotto l'assegnazione Range:

123 Intervallo ("A1"). Valore = iFaiEventi

Se esegui di nuovo questo codice, vedrai che Excel è ora reattivo: può essere messo a fuoco e portato in primo piano. DoEvents viene chiamato ogni volta attraverso il ciclo, il che garantisce che la macro dia sempre l'esecuzione in modo che Excel possa elaborare tutti i messaggi inviati. Poiché questa macro viene eseguita rapidamente, sembra quasi che sia in esecuzione in background (anche se non lo è): più operazioni all'interno del ciclo esporrebbero rapidamente quell'illusione.

DoEvents Dangers

Dai una seconda occhiata, però. Più che semplicemente consentire a Excel di essere focalizzato, puoi effettivamente fare clic all'interno delle celle e persino cambiare scheda mentre la macro è in esecuzione (prova: vedrai alcuni comportamenti divertenti). Questo mostra uno dei pericoli di DoEvents: può essere la causa di conseguenze indesiderate se la tua macro non è codificata con attenzione.

Un altro pericolo è che DoEvents può fungere da finestra per l'esecuzione di altre macro all'interno. Prova questo: posiziona un ActiveX CommandButton sul foglio di lavoro, fai doppio clic su di esso e aggiungi il seguente codice all'interno dell'evento CommandButton1_Click():

1234567 Dim c come intervalloPer ogni c nell'intervallo ("B3: E8")c.Valore = c.Valore + 1Avanti c

Disattiva la modalità di progettazione in Excel, quindi esegui la macro Test() aggiunta in precedenza. Durante l'esecuzione della macro Test, è possibile fare clic sul pulsante CommandButton nel foglio di lavoro e la macro associata verrà eseguita non appena DoEvents assegna un'interruzione alla macro Test().

Il pericolo qui è se la macro CommandButton ha alterato i dati su cui stava lavorando la macro Test() o ha attivato nuovamente la macro Test(). Puoi finire con risultati estremamente disordinati se non stai attento.

Infine, dovresti essere consapevole che DoEvents farà sì che la tua macro subisca un impatto sulle prestazioni quando viene chiamata. All'interno di un ciclo, questo impatto si somma rapidamente a meno che non limiti la frequenza con cui viene chiamato DoEvents. Facendo riferimento al nostro esempio Test(), prova questo:

1 Se i Mod 1000 = 0 allora DoEvents

Ciò riduce visibilmente la reattività di Excel, ma l'impatto sulle prestazioni sarà ridotto.

Quando usare DoEvents

Nonostante questi pericoli, DoEvents è una comoda funzione che aiuta nei test e nel debug. Prendi in considerazione l'aggiunta di DoEvents ai cicli di lunga durata.

Un altro motivo per includere DoEvents è consentire il feedback degli utenti. Ad esempio, una macro potrebbe aggiornare le etichette di un form utente con indicatori di avanzamento. Senza DoEvents, Excel potrebbe non ricevere i messaggi per ridisegnare il Form utente, dando all'utente l'impressione che la macro abbia smesso di funzionare, soprattutto se si passa a un altro programma e quindi si tenta di tornare a Excel. Con DoEvents, tuttavia, il Form utente continuerà a essere ridipinto e continueranno a essere visualizzati gli aggiornamenti allo stato di avanzamento della macro.

Per la maggior parte, DoEvents non è qualcosa che vorresti includere molto nel tuo codice e spesso può essere omesso. Se la reattività è qualcosa di cui la tua macro ha bisogno, non contarla!

Aiuterete lo sviluppo del sito, condividere la pagina con i tuoi amici

wave wave wave wave wave