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:

nome file dimensione n.download
GraficoCasereccio.zip 13  Kb

 

Buon lavoro

prelevato sul sito www.ennius.altervista.org