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)