E’ importante che i nostri programmi siano amichevoli e orientati all’utente. I nostri utilizzatori (anche noi stessi! perché no?) non devono sentirsi frustrati davanti a schermate confuse, testi incomprensibili, pulsanti che non spiegano a cosa servono. Anche le attese davanti al monitor, in attesa del completamento di una qualche lunga operazione, sono snervanti e fonte di frustrazione per gli utenti.
A volte basta così poco per informare i nostri clienti che bisogna attendere ancora qualche secondo. Excel mette per fortuna a nostra disposizione alcuni strumenti poco sofisticati ma utili ed efficienti per implementare in modo semplice dei meccanismi per interagire con i nostri utenti. Ecco alcuni approcci rapidi e personalizzabili.

Negli esempi che seguono mi riferisco a un file di Excel (che potete scaricare in calce all’articolo) in cui si imposta un certo numero di secondi (ossia il tempo in cui Excel è impegnato a fare qualcosa) e si osserva il comportamento di tre tipi di progress bar informativi del tempo che sta passando.

1. L’approccio testuale
In basso a sinistra della schermata principale, Excel visualizza informazioni sullo stato corrente; di solito una piccola parola, “Pronto”, per indicare che è in attesa dell’inserimento di una formula o del compimento di qualche azione da menu (ribbon).
Questa piccola sezione informativa è chiamata “status bar”, barra di stato, ed è in grado di visualizzare un breve testo.

Il codice per farla funzionare è il seguente (posto che in F2 abbiamo inserito un certo numero di secondi da far trascorrere):

Sub showStatusBar()
'imposta la status bar di Excel che visualizza un testo
'divide il tempo impostato in tre parti e mostra tre avanzamenti di ugual durata

Dim n As Integer

    'n = tempo impostato diviso tre per ottenere tre terzi quasi uguali
    n = Range("F2") \ 3
    
    With Application
        'prepara la status bar a ricevere del testo
        .DisplayStatusBar = True
        
        'imposta il cursore di attesa
        .Cursor = xlWait
        
        'il primo terzo
        .StatusBar = "Attendi... 33%"
        
        'attende n/3 secondi
        .Wait Now + TimeValue("00:" & Format(n \ 60, "00:") & Format(n Mod 60, "00"))
        
        'il secondo terzo
        .StatusBar = "Sto lavorando... 66%"
        .Wait Now + TimeValue("00:" & Format(n \ 60, "00:") & Format(n Mod 60, "00"))
        
        'l'ultimo terzo
        .StatusBar = "Quasi finito... 99%"
        .Wait Now + TimeValue("00:" & Format(n \ 60, "00:") & Format(n Mod 60, "00"))
        
        'ripristina la status bar
        .StatusBar = False
        .Cursor = xlDefault
    End With
    
    Range("F2").Select
End Sub

 

2. L’approccio grafico
Un’idea carina è quella di visualizzare una specie di barra di progresso direttamente in una cella, mostrando l’avanzamento con una serie di caratteri tipografici (segni di maggiore o quadrati pieni) e l’indicatore percentuale di avanzamento.
Il codice è il seguente (in F2 il numero di secondi tra far trascorrere, mentre H5 è la cella di destinazione della progressbar):

Sub showProgressBarInCell()
'mostra una progress bar direttamente in una cella del foglio
'imposta una dimensione fissa della cella e la prepara a ricevere
'una sequenza di 23 caratteri a spaziatura fissa
Dim n As Integer, i As Integer

    'prepara la status bar a ricevere del testo e imposta il cursore di attesa
    Application.DisplayStatusBar = True
    Application.Cursor = xlWait
    
    'n = tempo impostato
    n = Range("F2")
    
    With Range("H5")
        .Value = ""
        'imposta le caratteristiche della cella che ospiterà la progress bar
        .ColumnWidth = 26.71
        .Font.Name = "courier new"
        .Font.Size = 10
        
        'conta fino a raggiunger eil numero di secondi impostato
        'ad ogni ciclo attende un secondo
        'quindi inserisce in cella il testo che comprende l'avanzamento percentuale
        'e un simboletto (>) che simula una avanzamento grafico
        For i = 1 To n
            Application.Wait Now + TimeValue("00:00:01")
            .Value = Format(i / n, "00% ") & Mid(.Value, 5) & String(19 / n, ">")
            If Len(.Value) > 23 Then .Value = Format(i / n, "00% ") & String(15 / n, ">")
        Next
        'limita il tetso in cella a 23 caratteri commplessivi
        .Value = .Value & String(23 - Len(.Value), ">")
    End With
        
    Application.StatusBar = False
    Application.Cursor = xlDefault
        
    Range("F2").Select
End Sub

 

3. L’approccio con progress bar incorporata in un form
Il terzo approccio si basa su una progress bar, controllo incorporato di Excel da posizionare in un semplice userform.

Il codice che gestisce il form e la progress bar è il seguente:

Private Sub UserForm_Activate()
'visualizza un semplice userform con una progress bar
Dim i As Single, n As Single

    'imposta alcune proprietà dell'userform
    With UserForm1
        .Label1.Caption = "Loading ..."
        .ProgressBar1.Value = 0     'valore minimo della barra progresso
        .ProgressBar1.Max = 100     'valore masismo
        .Repaint    'ridisegna il form
    End With

    'n = il tempo impostato
    n = Range("F2")
    
    'loop per n secondi
    For i = 1 To n
        'aggiorna il valore della progress bar simulandone il movimento
        UserForm1.ProgressBar1.Value = (i / n) * 100
        
        'descrizione per l'utente
        Label1 = "Individual Progress = " & Int((i / n) * 100) & "%"
        
        'permette l'esecuzione asincrona con altri eventi Windows
        DoEvents
        
        'attende un secondo e continua
        Application.Wait Now + TimeValue("00:00:01")
    Next

    Unload UserForm1
End Sub

 

Potete scaricare il file da questo link: ProgressBar

Come creare una barra di avanzamento (progress bar)

Come creare una barra di avanzamento (progress bar)

Login Registrati
Stai vedendo 15 articoli - dal 1 a 15 (di 15 totali)
  • Autore
    Articoli
  • #7119 Score: 0 | Risposta

    vecchio frac
    Senior Moderator
      238 pts

      E' importante che i nostri programmi siano amichevoli e orientati all'utente. I nostri utilizzatori (anche noi stessi! perché no?) non devono sentirsi frustrati davanti a schermate confuse, testi incomprensibili, pulsanti che non spiegano a cosa servono. Anche le attese davanti al monitor, in attesa del completamento di una qualche lunga operazione, sono snervanti e fonte di frustrazione per gli utenti.....

      [Leggi tutto al seguente link: https://www.excelvba.it/forumexcel/progress-bar-vba/]

      #7159 Score: 0 | Risposta

      Marius44
      Moderatore
        51 pts

        Ciao

        Innanzi tutto grazie per la condivisione dell'ottimo lavoro.

        Una cosa, però, non mi è chiara (o, meglio, non ne ho conoscenza).

        Non vedo alcun codice nel Modulo di classe del Foglio e non riesco a capire come fa VBA ad applicare la relativa macro al click sulla combinazione dei tasti indicati.

        Grazie ancora e ciao,

        Mario

        #7160 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          238 pts

          Ciao Supermario,

          VBA non c'entra niente, è una funzionalità di Excel che associa dei tasti di scelta rapida alle macro 🙂

          Dopo aver costruito il codice, vai in Sviluppo >> Macro, scegli la macro che desideri e quindi il pulsante Opzioni, dove potrai associare un tasto alla macro insieme a Ctrl-Shift.

          Non voglio offendere la tua competenza ma un'immagine mi spiega meglio:

          seehere

          #7161 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            238 pts

            Tra parentesi forse si può fare anche via codice, dovrei documentarmi 🙂

            #7162 Score: 0 | Risposta

            Marius44
            Moderatore
              51 pts

              Ciao VF

              Ammetto che non conoscevo questa funzionalità.

              Forse ci sarei dovuto arrivare ricordando la finestra di dialogo che si apre quando "registri" una macro.

              Credo anch'io che ci si possa arrivare anche tramite codice ma così è più ... figo  😆 

               

              Grazie e ciao,

              Mario

              #7166 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                238 pts

                vecchio frac wrote:forse si può fare anche via codice, dovrei documentarmi

                Che stupidello che sono, è una cosa che avevo già fatto, senza saperlo, in altri contesti 🙂

                In pratica basta utilizzare adeguatamente il metodo OnKey.

                Supponiamo che nel modulo1 ci sia una sub di test.

                In Thisworkbook, all'apertura, quindi nel suo evento Workbook_Open, possiamo mettere l'istruzione

                Application.OnKey “^w”, “test”

                e il gioco è fatto: alla pressione di Ctrl-W si avvia la sub di test.

                Per ripristinare il comportamento normale basta assegnare, all'uscita da Excel, la stringa nulla al metodo OnKey:

                Application.OnKey “^w”, “”

                La guida di Excel è esaustiva sia sui nomi dei caratteri speciali (ESC, TAB, F1, ecc) sia sugli esempi che si possono creare.

                #9452 Score: 0 | Risposta

                Mario

                  Complimenti per il sito, articolo simpatico... 

                  stavo provando un pò il funzionamento del codice, ma ho qualche problema con la userform in quanto il programma mi da un errore di compilazione: impossibile trovare il metodo o il membro dei dati, su ProgressBar1.

                  Quale potrebbe essere il problema?

                  Grazie 

                  #9457 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    238 pts

                    Esattamente, su quale linea di codice?

                    Hai verificato di aver reso disponibile la libreria Common Controls 6.0? (Editor di codice, Strumenti, Riferimenti). Se non è attiva la puoi caricare con sfoglia e cercando nella cartella di sistema il file MSCOMCTL.OCX.

                    #19115 Score: 0 | Risposta

                    ildavepablo
                    Partecipante

                      Ciao VF,

                      ottimo post, molto interessante! Ho cercato subito di implementarlo per "farmi un po' le ossa" in una macro sulla quale mi ha già dato un super-aiuto Mario che vedo qui tra i partecipanti.

                      Quello che fa la macro, come potrai vedere è di salvare separatamente i fogli di un determinato file excel. 

                      Il tread è questo: https://www.excelvba.it/forumexcel/forums/discussione/salvare-fogli-rename-su-un-altro-file/

                      Vorrei chiederti una mano perché ho implementato alcune modifiche (la barra è quella con il form) :

                      1) vorrei che il "contatore" non fosse legato al valore di una cella (nell'esempio è 7 ), ma ad un parametro variabile del file (ex il numero di fogli da salvare) >> quindi ho aggiunto un paio di comandi nel form (è corretto? Manca qualcosa?):

                      Dim n As Integer
                      ....
                      
                          'n = il tempo impostato
                          n = Application.Sheets.Count + 10
                      ....

                      2) ho problemi ad inserire nella giusta posizione della  macro il comando, perché se la metto prima del ciclo parte la barra di aggiornamento e alla fine parte il salvataggio dei foglio, se la metto nel ciclo, ovviamente si ripete ad ogni salvataggio. ho provato a togliere il comando "DoEvents" dal form, ma anche in quel caso non funziona....

                      perc = ActiveWorkbook.Path & "\"
                      percorso = perc & "DIL.xlsx"
                      Workbooks.Open percorso
                      
                      UserForm1.Show
                      
                      For i = 1 To ActiveWorkbook.Sheets.Count
                          With Sheets(i)
                          
                              If .Range("B8") <> "" Then
                                  .Cells.Copy 'copia il foglio
                                  Workbooks.Add 'crea un nuovo file
                                  ActiveSheet.Paste 'incolla i dati
                      
                                  'rinomina il file e lo salva
                                  NuovoFile = "DIL " & Range("A3").Value & " " & Range("A6").Value & ".xlsx"
                                  ActiveWorkbook.SaveAs Filename:=perc & NuovoFile
                                  ActiveWorkbook.Close 'chiude il file appena salvato
                              End If
                          End With
                      
                      Next i
                      
                      
                      perc1 = ActiveWorkbook.Path & "\"
                      percorso1 = perc1 & "DIL.xlsx"
                      Workbooks.Open percorso
                      
                      
                      NuovoFile1 = "_DIL " & Range("A6") & ".xlsx"
                      ActiveWorkbook.SaveAs Filename:=perc1 & NuovoFile1
                      
                      ActiveWorkbook.Close 'chiude il file appena salvato
                      
                      End sub
                      

                      Grazie mille!!!

                      #19145 Score: 0 | Risposta

                      Guidoc
                      Partecipante

                        Bellissimo, io avrei optato per il 3 approccio ma non so come gestire lo userform e collegarlo alla macro

                        #19153 Score: 0 | Risposta

                        Guidoc
                        Partecipante

                          Guidoc ha scritto:

                          Bellissimo, io avrei optato per il 3 approccio ma non so come gestire lo userform e collegarlo alla macro

                          Ciao vecchio frac, mi puoi aiutare?

                          #19157 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            238 pts

                            ildavepablo ha scritto:

                            Vorrei chiederti una mano perché ho implementato alcune modifiche (la barra è quella con il form) :

                            Guidoc ha scritto:

                            mi puoi aiutare?

                            @ildavepablo, @guidoc:

                            sono rientrato da poco e mi sto pareggiando con le discussioni non lette. Qui siamo in un (vecchio) articolo e preferirei che apriste una discussione apposita per ciascuno dei vostri problemi, in una sezione del forum, perchè le osservazioni all'articolo dovrebbero essere pertinenti ad esso e non su casi dell'utente. 

                            Poi, più che volentieri, se ne sono capace 🙂

                            Grazie

                            #19211 Score: 0 | Risposta

                            Guidoc
                            Partecipante

                              io l'avevo creato: #19131

                              #37106 Score: 0 | Risposta

                              Lorenzo

                                Salve a tutti

                                Mi riallaccio a questo discorso perchè vorrei inserire la stessa form in un progetto vb per access.

                                E' possibile secondo voi ?

                                 

                                Grazie in anticipo

                                #37109 Score: 0 | Risposta

                                vecchio frac
                                Senior Moderator
                                  238 pts

                                  Per favore, apri una nuova discussione in cui citi, magari, l'articolo cui ti riferisci.
                                  Nel nuovo post puoi anche essere meno sintetico, e illustrare meglio l'esigenza.

                                  By the way comunque posso aggiungere che io utilizzo con una certa soddisfazione SysCmd acSysCmdInitMeter e tutta la compagnia di istruzioni collegate.

                                Login Registrati
                                Stai vedendo 15 articoli - dal 1 a 15 (di 15 totali)
                                Rispondi a: Come creare una barra di avanzamento (progress bar)
                                Gli allegati sono permessi solo ad utenti REGISTRATI
                                Le tue informazioni: