Macro, durante l’esecuzione, impedisce a Excel di rispondere

Quando Davide scrive una macro che deve elaborare molte informazioni in un ciclo For … Next, utilizza sempre la barra di stato per indicare l’avanzamento. In genere, verrà visualizzato un messaggio come “Elaborazione riga X di Y”. Quando “Y” è un valore grande (l’estremità superiore del ciclo For … Next), Excel spesso interrompe l’aggiornamento della barra di stato e visualizza qualcosa come “Non risponde” nella barra del titolo di Excel. La macro è ancora in esecuzione, tuttavia, e al termine, Excel inizia a rispondere e tutto funziona come dovrebbe. Davide si chiede come può fare in modo che Excel smetta di comportarsi in questo modo e, invece, visualizzi gli aggiornamenti della barra di stato come lui vorrebbe.

Questo comportamento sembra verificarsi quando per Windows sembra che Excel abbia smesso di rispondere (dopotutto è Windows che è responsabile di ciò che appare nella barra del titolo di un programma). Sono stato in grado di riprodurre il comportamento abbastanza facilmente avendo più programmi aperti in Windows e facendo clic sulla finestra di un altro programma mentre Excel sta lavorando su una lunga macro. In sostanza, se Excel è impegnato a eseguire la macro o non riesce a tenere il passo nel chiedere a Windows di aggiornare la barra di stato, allora questo comportamento accade, e sembra che Excel abbia smesso di rispondere.

Ci sono due possibili approcci che possono essere usati. Innanzitutto, puoi utilizzare il comando DoEvents all’interno del ciclo. Normalmente viene utilizzato per istruire la macro a prestare attenzione a tutto ciò che è nella coda degli eventi, come quando qualcuno preme la tastiera. Equivale a forzare Excel ad “estraniarsi” dalla macro su cui sta lavorando e a comunicare con Windows. Ciò, necessariamente, consentirebbe a Windows di sapere che Excel è davvero reattivo e consentirebbe gli aggiornamenti alla barra di stato. Puoi anche inserire il comando subito dopo aver aggiornato la barra di stato:

Application.StatusBar = "Elaborazione riga " & X & " di " & Y
DoEvents

 

L’altra cosa da provare è semplicemente non aggiornare così tanto spesso la barra di stato. Se l’estremità superiore del ciclo è molto grande, potrebbe essere meglio calcolare una percentuale e aggiornare la barra di stato quando una parte del totale è stata completata, forse ogni 5% o 10% del totale. Ciò significherebbe che la barra di stato deve essere aggiornata solo 10 o 20 volte durante il ciclo, anziché centinaia o migliaia di volte. Ciò potrebbe significare che Windows può tenere il passo con le richieste di aggiornamento della barra di stato e, come bonus, la tua macro potrebbe essere eseguita più velocemente perché non deve aggiornare la barra di stato così spesso.

Ti è stato utile?