Creare un grafico usando i Font, direttamente in celle del foglio. - pagina vista: volte

Un interessante esercizio che, oltre allo scopo a cui lo destiniamo in questo articolo, può suggerirci come usare alcuni tipi di Fonts, per ottenere effetti particolari, sappiamo infatti che esistono Fonts che al posto di ogni lettera, restituiscono simboli o caratteri speciali.

Cosa vogliamo ottenere? Desideriamo visualizzare una "specie" di barra orizzontale che rappresenti graficamente un determinato valore: otterremo cioè un effetto visivo simile ad un "grafico a barre".

Il tutto ovviamente senza utilizzare nessun tipo di grafico standard, ma solo il carattere restituito dalla lettera "n" utilizzando il Font "Wingdings", di default installato insieme al sistema operativo, ripetuto tante volte quanto è grande il valore da rappresentare.

Il Font "n" in "Wingdings" è questo:  n  un quadrato pieno, ed essendo un Font, possiamo agire sulla dimensione del carattere (Size) e sul colore carattere (Font.Color). Una serie di quadrati in successione è simile ad una "barra", esempio:

nnnnnnnn ; con altro colore: nnnnnnnn; o dimensione: nnnnnnnn

Un esempio lo possiamo impostare basandoci su una tabella dove vogliamo evidenziare un ipotetico target da raggiungere per ogni mese (Da Fare), ed i valori reali raggiunti (Fatto) per ottenere una percentuale di differenza tra  i valori mensili, in modo da valutare l'incremento o il decremento rispetto al target. Un grafico aiuterebbe un impatto visivo immediato nel riconoscere i risultati nel corso dei mesi. Sfruttando le procedure (semplici) che vediamo più avanti, otterremo una situazione come questa:

In questo foglio abbiamo destinato due colonne, la E e la G alla visualizzazione delle barre che indicheranno le percentuali di differenza: la colonna E con i font colorati in rosso per le percentuali negative, e la colonna G con i font in blu, per le percentuali positive. La colonna D ha le celle impostate come Formato cella a "percentuale" e, a partire dalla D3 (fino alla D14, aggiornando i riferimenti) una semplice formula =(C3-B3)/C3.

Le istruzioni sono veramente semplici: useremo in particolare due Funzioni: la Funzione Round che ci consente di ottenere l'arrotondamento di una valore con decimali, e la Funzione String che ci consente di ripetere un determinato carattere (o testo), un determinato numero di volte.

In pratica useremo un ciclo For Each Next che legga i valori delle celle dalla D3 alla D14 (le percentuali) e di ogni valore letto si fa l'arrotondamento e lo usiamo come valore per ripetere la lettera "n" , scrivendola nella cella immediatamente a destra se negativo (Offset(0, 1)) o tre celle immediatamente a destra se positivo (Offset(0, 3)) rispetto alla cella in quel momemto letta.

Poichè Round non si applica a valori percentuali, lo moltiplichiamo per 100, (non ci scordiamo che abbiamo impostato il formato celle a percentuale, e come tale viene letto; diverso sarebbe se avessimo lasciato il formato celle a "Generale",ma avremmo dovuto usare una formula come questa =((C3-B3)/C3)*100). Poi dovremo, sempre perchè Round non lavora con valori negativi, useremo "invertire" il valore (se negativo) posizionando il segno meno davanti al valore negativo (due negazioni affermano)

Ovviamente creiamo una condizione If che leggerà le istruzioni negativo/positivo.

Vediamo la routine:

  • Sub Wingdi()
    Dim CL As Object
    Range("E3:E14, G3:G14").ClearContents 
    'puliamo l'area delle due colonne adibite a grafico
    For Each CL In Range("D3:D14") 
    'iniziamo il ciclo che scorra tutte le celle nel range indicato (le percentuali, in D)
    If CL.Value < 0 Then   
     'se il valore nella cella ora letta è inferiore a zero (quindi negativo), eseguiamo queste 'istruzioni
    y = CL.Value * 100  
    'si assegna alla variabile "y" il valore della cella moltiplicato per 100
    x = -Round(y)      
     'quindi si arrotonda e si inverte il valore "y", assegnando il nuovo valore alla variabile "x"
    w = String(x, "n")  
    'ora si assegna alla variabile "w" tanti "n" quanto è il valore restituito da "x"
    CL.Offset(0, 1) = w 
    'quindi si rende la cella a destra di quella letta uguale agli "n" contenuti in "w"
    CL.Offset(0, 1).Font.Name = "Wingdings" 
    'si imposta il font Wingdings alla cella (e vedremo i quadratini)
    CL.Offset(0, 1).Font.Size = 8                    
    'si imposta la dimensione del carattere (dei quadratini)
    CL.Offset(0, 1).Font.Color = vbRed         
    'e si colorano di rosso
    Else              
     'altrimenti se il valore è maggiore di zero, quindi positivo, seguiamo queste istruzioni, simili alle 'precedenti, ma senza inversione del valore, e colorando di blu i font, nella terza cella a destra di quella letta.
    y = CL.Value * 100
    x = Round(y)
    w = String(x, "n")
    CL.Offset(0, 3) = w
    CL.Offset(0, 3).Font.Name = "Wingdings"
    CL.Offset(0, 3).Font.Size = 8
    CL.Offset(0, 3).Font.Color = vbBlue
    End If
    Next
    End Sub

Considerando la larghezza che avremo destinato alle colonne E e G destinate a visualizzare i quadratini, dovremo tener presente i valori percentuali che avremo nella colonna D : se avremo valori elevati nella percentuale (positiva o negativa che sia) dovremo adattare la "scala" con la quale otteniamo i quadratini, e visto che la dimensione minima che possiamo forzare nei font è 4 punti, se non basterà ridurre la dimensione, dovremo agire sul valore del moltiplicatore (100) usato nelle istruzioni, riducendolo opportunamente, portandolo a 10 o a 1; l'effetto visivo rimane efficace.

Quindi tutto il risultato dipenderà dai valori restituiti come differenza  percentuale in funzione delle cifre da valutare; se avessimo ad esempio due valori (Da fare) 1300 - (Fatto) 4300, otterremo una percentuale positiva uguale a 69,77 (che restituirebbe per arrotondamento 70 quadratini : troppi per lo spazio che avremo lasciato alla colonna G.

Conviene quindi impostare delle istruzioni che agiscano in automatico, leggendo il valore massimo presente tra i valori percentuali, e assegni il fattore di moltiplicazione più opportuno. Useremo poi questo valore al posto del moltiplicatore 100 visto sopra. Istruiamo quindi un Select Case che restituisca il "coefficiente di moltiplicazione". In questo esempio ho considerato tre soglie: inferiore a 20%, inferiore a 50%, superiore a 51%. Ognuno si imposterà le proprie "soglie" secondo le proprie necessità; vediamo la routine sopra modificata in questo senso: (i commenti solo alle aggiunte):

  • Sub windi()
    Dim CL As Object
    mass = WorksheetFunction.Max(Range("D3:D14")) * 100
     'con la variabile "mass" reperiamo il valore massimo 'presente nel range delle percentuali
    Select Case mass    
    ' istruiamo il Select Case che valuti il valore di "mass"
    Case Is < 20 
     'se "mass" è inferiore a 20
    coe = 100       
    'assegniamo alla variabile "coe" il valore 100
    Case Is < 50   
    'se "mass" è inferiore a 50
    coe = 10         
    'assegniamo alla variabile "coe" il valore 10
    Case Is > 51   
    'se "mass" è superiore a 51
    coe = 1          
     'assegniamo alla variabile "coe" il valore 1
    End Select

    Range("E3:E14, G3:G14").ClearContents
    For Each CL In Range("D3:D14")
    If CL.Value < 0 Then
    y = CL.Value * coe      
     'e si usa il moltiplicatore rappresentato dalla variabile "coe"
    x = -Round(y)
    w = String(x, "n")
    CL.Offset(0, 1) = w
    CL.Offset(0, 1).Font.Name = "Wingdings"
    CL.Offset(0, 1).Font.Size = 6  
    'usiamo una dimensione carattere ancora più piccola
    CL.Offset(0, 1).Font.Color = vbRed
    Else
    y = CL.Value * coe      
     'e si usa il moltiplicatore rappresentato dalla variabile "coe"
    x = Round(y)
    w = String(x, "n")
    CL.Offset(0, 3) = w
    CL.Offset(0, 3).Font.Name = "Wingdings"
    CL.Offset(0, 3).Font.Size = 6  
     'usiamo una dimensione carattere ancora più piccola
    CL.Offset(0, 3).Font.Color = vbBlue
    End If
    Next
    End Sub

Anche per la dimensione carattere è possibile usare una variabile da valutare nei Select Case, e poi usare la variabile al posto del valore assegnato a Font.Size, in modo da adeguare in automatico la dimensione dei quadratini.

Buon lavoro

prelevato sul sito www.ennius.altervista.org