Excel problema con l'istruzione Application.ScreenUpdating = False

di il
6 risposte

Excel problema con l'istruzione Application.ScreenUpdating = False

Buongiorno.

Quando lancio una particolare sub, questa fa vari passaggi tra i fogli copiandone alcune parti. Addirittura copia porzioni di un foglio di un altro file.

 I vari fogli vengono visualizzati in velocità  creando dei casini e quindi adopero l'istruzione Application.ScreenUpdating = False per freezare il video.

Tutto ok. 

Il problema nasce quando ho voluto provare a mettere una progress bar per "rassicurare" l'utente che il programma sta girando senza problemi.

Normalmente la sub ci impiega una quarantina di secondi a completare le operazioni.

1) Non riesco più ad attivare la progress bar come activex. Excel 365 me la fa selezione tra la lista activex ma non me l' attiva.

2) Se uso altri accorgimenti tipo la formula =RIPETI("|"; A1*100) in una cella che funge da progress bar, avendo Application.ScreenUpdating = False, excel non mi fa vedere alcun avanzamento fino alla fine della sua sub.

Se provo ad attivare il video con Application.ScreenUpdating = true, solo quando cambio il valore della cella a1 per poi disattivarlo ancora, excel mi ignora il secondo passaggio (Application.ScreenUpdating = False) e fa casino.

Non so se mi sono spiegato bene. -:(

Suggerimenti ?

Grazie.

PS: La progress bar non è indispensabile ma, dopo alcune ore di prove, mi sono incagnato nel cercare una soluzione -:)

6 Risposte

  • Re: Excel problema con l'istruzione Application.ScreenUpdating = False

    Puoi provare ad usare la StatusBar, che non è affetta dallo ScreenUpdating.

    Io proverei un qualcosa del tipo:

    Dim i, h, m, s, t
    
    Application.ScreenUpdating = False
    For i = 1 To 10
        Application.StatusBar = "Progresso: " & String(i, "X")
        Cells(i, 1).Value = i
        h = Hour(Now())
        m = Minute(Now())
        s = Second(Now()) + 1
        t = TimeSerial(h, m, s)
        Application.Wait t
    Next i
    Application.ScreenUpdating = True
    Application.StatusBar = "Task completato!"

    Se lo provi in un file nuovo, vedrai che ci mette una decina di secondi a scrivere i numeri nelle celle. I valori sul foglio non compariranno fino alla fine del processo, ma in basso a sinistra vedrai comunque l'avanzamento.

  • Re: Excel problema con l'istruzione Application.ScreenUpdating = False

    Sgrubak grazie per la risposta.

    Proverò il tuo suggerimento appena possibile poi ti farò sapere.

  • Re: Excel problema con l'istruzione Application.ScreenUpdating = False

    Ho provato il codice fornito da Sgrubar e funziona. (grazie ancora).

    Unico problema è che solo se attivo manualmente la StatusBar si vede l'avanzamento come da programma.

    Vorrei però attivare la barra quando serve e se cerco di attivarla con VBA la barra non si vede.

    Ho messo anche un piccolo ritardo nell'eseguire il rimanente codice ma niente da fare....

    Se tolgo l'istruzione finale "Application.DisplayStatusBar = False",  la barra mi compare a fine esecuzione della sub, segno che il comando Excel lo recepisce ma non lo applica subito.

    Suggerimenti a riguardo ?

    Grazie.

    Sub prova()
    
    Dim i, h, m, s, t
    
    Application.DisplayStatusBar = True
    
    Application.Wait (Now + TimeValue("0:0:02"))
    
    Application.ScreenUpdating = False
    For i = 1 To 10
        Application.StatusBar = "Progresso: " & String(i, "X")
        Cells(i, 1).Value = i
        h = Hour(Now())
        m = Minute(Now())
        s = Second(Now()) + 1
        t = TimeSerial(h, m, s)
        Application.Wait t
    Next i
    Application.ScreenUpdating = True
    Application.StatusBar = "Task completato!"
    
    Application.DisplayStatusBar = False
    
    End Sub
    
  • Re: Excel problema con l'istruzione Application.ScreenUpdating = False

    Ho risolto chiedendo (aimè) all IA.

    Dopo vari tentativi mi ha dato questa piccola sub che obbliga windows ad aggiornare le dimensioni dello schermo includendo anche la barra di stato.

    Se ci sono suggerimenti migliori sono sempre ben accetti.

    Ringrazio tutti per l'attenzione.

    Sub ForzaBarraDiStato()
        ' 1. Memorizza lo stato attuale della finestra
        Dim vecchioStato As XlWindowState
        vecchioStato = Application.WindowState
        
        ' 2. Forza la visibilità della barra
        Application.DisplayStatusBar = True
        
        ' 3. "Scuoti" la finestra per forzare il ridisegno (evita l'errore 1004)
        If Application.WindowState = xlMaximized Then
            Application.WindowState = xlNormal
            Application.WindowState = xlMaximized
        Else
            Application.WindowState = xlMaximized
            Application.WindowState = xlNormal
        End If
            
        ' Ripristina lo stato originale se necessario
         Application.WindowState = vecchioStato
    End Sub
  • Re: Excel problema con l'istruzione Application.ScreenUpdating = False

    25/03/2026 - Premuroso ha scritto:

    solo se attivo manualmente la StatusBar si vede l'avanzamento come da programma.

    Non ho capito cosa intendi... In che senso la "attivi manualmente"?

    25/03/2026 - Premuroso ha scritto:

    questa piccola sub che obbliga windows ad aggiornare le dimensioni dello schermo

    No, questa Sub agisce sempre sull'applicazione Excel, non fa fare nulla al sistema operativo. Dubito fortemente che serva a qualcosa. Nell'esempio che ti ho postato, e che ho testato, tutto funziona regolarmente... Puoi dettagliare meglio che tipo di problema riscontri?

  • Re: Excel problema con l'istruzione Application.ScreenUpdating = False

    Buongiorno Sgrubak.

    Ma si niente di che.... alla fine lascio aperta la status bar e problema risolto.

    Il programmino suggeritomi dall IA funziona bene sul tuo codice ma se applicato ai fogli del mio programma funge al 50%.

    -

    Il tuo codice funziona se ho già visibile la status bar. Questo è stato possibile perchè nella finestra immediata di VBA ho dato

    il comando Application.DisplayStatusBar = True.

    Se invece la status bar non è visibile, il tuo codice non la attiva anche se il comando Application.DisplayStatusBar = True è presente.

    Per meglio dire la attiva, ma resta invisibile fino a fine sub. Dopo l'esecuzione di quest'ultima la barra appare con la scritta "Task completato!".

    Forse, secondo l' IA, questo è dovuto allo stato della finestra se è xlMaximized o xlNormal ecc..

    Spero di essermi spiegato bene. 

    Ciao e buona giornata.

Devi accedere o registrarti per scrivere nel forum
6 risposte