Grafico casareccio. Usare Label come indicatori
di asse.
-
pagina vista: volte
Di articoli sui
Grafici ne abbiamo già visti su questo sito, ma questa volta ne realizziamo
uno "su misura", senza usare le tradizionali opzioni per creare un Grafico.
E' un modo un pò
diverso per abbellire i nostri lavori, ed un esercizio che ci abitua
comunque a prendere confidenza con alcuni "oggetti
ActiveX" e alcune loro "proprietà". Useremo delle "Label"
(etichette) come "indicatori di valore", sfruttando una loro proprietà: la
larghezza (Width). Inoltre useremo degli
Array , il Select Case
e cicli For Next.
L'esercizio l'ho
impostato sulla visualizzazione (grafica) del fatturato più alto raggiunto
da venditori (ma potrà essere impostato su esigenze tra le più diverse).
Dovremo ovviamente disporre di una serie di dati, divisi per venditore, ed
useremo una tabella posta su un Foglio come provenienza dati; una situazione
del genere:
La tabella è
semplice e serve solo come esempio; in verde i nomi dei venditori.
Come lavoriamo?
Prenderemo per
ogni colonna, il valore più alto (funzione Max, in vba:
WorksheetFunction.Max), e questo valore ci
servirà come misura da assegnare alla larghezza (Width)
di ogni Label posta su una
UserForm (tante Label
quanti sono i campi (colonne) da visualizzare), in maniera di ottenere una
cosa come questa:
Non male, che ne
dite? Le Label potremo inserirle sfruttando l'altezza e non la lunghezza, e
in questo caso dovremmo usare la proprietà Height.
Useremo colori diversi per ogni Label sfruttando la proprietà
BackColor, e l'aspetto, che potremo
diversificare sfruttando la proprietà SpecialEffect
(in questo caso settata a: 3-
fmSpecialEffectEtched)
Ora dobbiamo
considerare alcuni presupposti: poichè i valori letti come Max potranno
essere superiori alla larghezza della UserForm e delle Label ivi ospitate,
dovremo creare una "scala di riduzioni" che ci consenta di contenere la
larghezza delle Label all'interno della UserForm. In pratica troveremo un
"fattore di riduzione" che ci servirà per dividerlo per il valore Max
trovato. Poichè il "fattore di riduzione" venga applicato a tutte le Label,
dovremo cercare il valore massimo tra i valori massimi presenti. Questo
valore sarà valutato tramite un Select Case che
sceglierà il caso più appropriato in funzione di un range di valori che noi
stabiliremo, e che verrà appunto applicato ad ogni valore max relativo ad
ogni Label.
Ma se leggiamo le
istruzioni usate, capiremo meglio. Intanto all'Activate
della UserForm, impostiamo la larghezza delle Label (dalla1 alla 4 comprese)
a zero. Sempre in questo evento facciamo caricare con un ciclo
For Next, le Label (dalla 5 alla 8 comprese)
che usiamo per "caricare" i nome dei venditori (riga 1, colonne dalla 1 alla
4):
-
Private Sub UserForm_Activate()
Label1.Width = 0 'si può
usare un ciclo anche sulle prime 4 Label
Label2.Width = 0
Label3.Width = 0
Label4.Width = 0
For T = 5 To 8 'ciclo
che carica i nomi presenti sul foglio, nelle Label, dalla Label5 alla Label8
Me.Controls("Label" & T).Caption = Cells(1, T - 4).Value
'T è l'indice di colonna, che deve partire dalla
1 (la A)
Next
End Sub
e questo sarà
l'effetto all'apertura della UserForm: le Label dalla 1 alla 4 non si vedono
(quelle colorate), fintanto che non premeremo il pulsante "Mostra Grafico" :
Ed ora passiamo ad
esaminare le istruzioni associate al pulsante "Mostra Grafico":
-
Private Sub CommandButton2_Click()
'usiamo 4 variabili (a,b,c,d) che rappresentano
il valore Max reperito nei rispettivi intervalli
a = WorksheetFunction.Max(ActiveSheet.Range("A1:A1000"))
b = WorksheetFunction.Max(ActiveSheet.Range("B1:B1000"))
c = WorksheetFunction.Max(ActiveSheet.Range("C1:C1000"))
d = WorksheetFunction.Max(ActiveSheet.Range("D1:D1000"))
-
'ora si crea una matrice ("ma") con lo scopo di
memorizzare tutti e 4 i valori rappresentati dalle variabili a,b,c,d, che
'essendo numeri, nell'Array vanno elencati senza doppi apici
ma = Array(a, b, c, d)
G = 0 'poi si usa una variabile ("G")
iniziandola a zero, che ci serve come contatore nel ciclo che scorrendo gli
indici 'della matrice, vi memorizza il valore più alto riscontrato; alla
fine del ciclo G sarà il valore più alto tra i valori letti
For L = LBound(ma) To UBound(ma)
'scorriamo la matrice
If ma(L) > G Then G = ma(L) 'se un valore
è maggiore del precedente, viene memorizzato in G
Next
'ora iniziamo la valutazione del valore
rappresentato da G
Select Case G
Case 1 To 1000 'se G sarà compreso tra 1
e 1000
W = 5
' assegniamo alla variabile W il valore
di 5; quindi dividiamo i valori di ogni Label per W, ed 'otteniamo un
rapporto di scala da 1:5 con il quale impostiamo la lunghezza delle
Label
Label1.Width = a / W
Label2.Width = b / W
Label3.Width = c / W
Label4.Width = d / W
TextBox1 = "Scala 1:5" 'e nella TextBox1
scriviamo il fattore di scala
Case 1001 To 3000 'quindi
si impostano altri Case di valutazione, variando il valore di rapporto
scala....
W = 10
Label1.Width = a / W
Label2.Width = b / W
Label3.Width = c / W
Label4.Width = d / W
TextBox1 = "Scala 1:10"
Case 3001 To 5000
W = 20
Label1.Width = a / W
Label2.Width = b / W
Label3.Width = c / W
Label4.Width = d / W
TextBox1 = "Scala 1:20"
Case 5001 To 9999
W = 50
Label1.Width = a / W
Label2.Width = b / W
Label3.Width = c / W
Label4.Width = d / W
TextBox1 = "Scala 1:50"
Case 10000 To 100000
W = 100
Label1.Width = a / W
Label2.Width = b / W
Label3.Width = c / W
Label4.Width = d / W
TextBox1 = "Scala 1:100"
Case Else
MsgBox "Parametri fuori"
End Select
Label1.Caption = a 'indi indichiamo nelle
Caption delle varie Label i valori ottenuti con Max (variabili a,b,c,d)
Label2.Caption = b
Label3.Caption = c
Label4.Caption = d
End Sub
Se poi vorremo
essere più concisi e scrivere meno righe di codice, potremo usare un ciclo
For Next anche per assegnare la larghezza e gli importi alle Label, così
(questa modifica non è presente nel file allegato.):
-
Private Sub CommandButton2_Click()
a = WorksheetFunction.Max(ActiveSheet.Range("A1:A1000"))
b = WorksheetFunction.Max(ActiveSheet.Range("B1:B1000"))
c = WorksheetFunction.Max(ActiveSheet.Range("C1:C1000"))
d = WorksheetFunction.Max(ActiveSheet.Range("D1:D1000"))
ma = Array(a, b, c, d)
G = 0
For L = LBound(ma) To UBound(ma)
If ma(L) > G Then G = ma(L)
Next
Select Case G 'usiamo i Case
solo per definire il fattore di riduzione
Case 1 To 1000
W = 5
Case 1001 To 3000
W = 10
Case 3001 To 5000
W = 20
Case 5001 To 9999
W = 50
Case 10000 To 100000
W = 100
Case Else
MsgBox "Parametri fuori"
End Select 'una volta stabilito il
valore di W, si esegue un ciclo che scorra la matrice "ma" ed assegni alla
Label di 'pertinenza, il corrispondente valore diviso il fattore di
riduzione, e poi nello stesso ciclo si assegnano i valori reali alle 'Caption
delle Label
For q = LBound(ma) To UBound(ma)
'l'indice nella matrice inizia da zero, e aggiungiamo +1 per le Label
Me.Controls("Label" & q + 1).Width = ma(q) / W
Me.Controls("Label" & q + 1).Caption = ma(q)
Next
TextBox1 = "Scala 1:" & W & "" 'anche la
scritta per la TextBox1 la componiamo una volta sola
End Sub
E' chiaro che sia
gli intervalli da valutare con i Case, sia il rapporto di scala (W), andrà
valutato per le proprie necessità, in funzione dei valori che normalmente
avremo nelle nostre tabelle e in rapporto alla dimensione della
Userform. Maggiore sarà il valore dei dati (in termini di cifra), maggiore
dovrà essere il valore del rapporto di riduzione a parità di dimensione
della UserForm e conseguentemente delle Label.
File Consultabile
e scaricabile:
Buon lavoro
prelevato sul sito
www.ennius.altervista.org
|