Grafico utilizzando il "controllo ActiveX" MSCHRT20.OCX. - pagina vista: volte

Sul sito abbiamo già visto come creare grafici utilizzando le risorse di Excel per creare grafici usando istruzioni vba. Esiste  in Excel una varietà veramente notevole di tipi di grafico, ed ognuno può sbizzarrirsi nel realizzare il grafico che più gli aggrada o che si adatta meglio a rappresentare una sua serie di dati o valori.

E' pur vero che per realizzare un grafico in vba, viste le molteplici opzioni disponibili di settaggi e impostazioni delle caratteristiche di un grafico, in genere è necessario compilare un gran numero di righe di istruzioni di codice.

Esiste la possibilità di creare grafici anche utilizzando il controllo aggiuntivo ActiveX  MsChrt20.ocx, se disponibile è nella cartella System32 di Windows. Per aggiungere questo controllo potete seguire le spiegazioni contenute nell'art. "Date e gli errori di scrittura" presente in questa sezione; la procedura è la stessa, dovremo solo mettere un segno di spunta alla voce : "Miscosoft Chart Control 6.0" corrispondente alla libreria MsChrt20.ocx, oppure altra versione disponibile sul proprio computer come "Microsoft Chart Control, versione 5" corrispondente alla libreria Mschart.ocx (il risultato sarà il medesimo).

Uno dei vantaggi nell'uso di questo controllo è che avremo bisogno di un numero inferiore di istruzioni per ottenere la risultanza grafica desiderata, anche se non tutte le possibilità di settaggi saranno disponibili, ma per i tradizionali grafici, andrà più che bene. Sono infatti disponibili, per decidere il tipo di grafico, solo queste impostazioni, impostando la proprietà CharType del controllo:

Costante Tipo di Grafico
VtChChartType3dBar Barre 3D
VtChChartType2dBar Barre 2D
VtChChartType3dLine Linee 3D
VtChChartType2dLine Linee 2D
VtChChartType3dArea Area 3D
VtChChartType2dArea Area 2D
VtChChartType3dStep Istogramma 3D
VtChChartType2dStep Istogramma 2D
VtChChartType3dCombination Combinazione 3D
VtChChartType2dCombination Combinazione 2D
VtChChartType2dPie Torta 2D
VtChChartType2dXY XY 2D

Il controllo possiede numerose proprietà, le cui impostazioni di default ci mostrano, una volta posizionato il controllo su una UserForm, in modalità progettazione (dal VBE), questo controllo evidenziato in rosso:

Come si nota, il controllo porta, nell'area grafico alle due estremità in verticale, la scala valori ripetuta anche a destra, mentre l'area centrale è divisa in righe (Row : R1, R2, ecc.) ognuna delle quali ospita un certo numero di colonne (Column): è un grafico a barre 2D (che è l'impostazione di default : VtChChartType2dBar).

Per impostare le proprietà necessarie alla formazione del grafico, possiamo scegliere l'evento Activate della UserForm sulla quale abbiamo posto il controllo; vediamo le proprietà su cui agire per fornire le impostazioni necessarie:

  • RowCount - determina il numero di righe che il grafico mostrerà

  • CoumnCount - determina il numero di colonne visibili per ogni riga

  • DataGrid.ColumnLabelCount - se vorremo visualizzare la "Legenda", serve per determinare il numero di etichette (Label) che vedremo a lato del grafico.

  • ShowLegend - va impostata a True (di default è False) per visualizzare le etichette

  • Data - questa è la proprietà che conterrà i dati in base ai quali verrà tracciato il grafico. Dati che inseriremo importandoli da un foglio di calcolo o da una matrice.

Vediamo ora come impostare le procedure, facendo due esempi pratici e semplici, su due situazioni tipiche:

Abbiamo una tabella con dei valori che vengono registrati in funzione di date (colonna A), ed assegnati a tre nominativi diversi (colonne B,C,D, delle quali nella seconda riga, i nomi formano le intestazioni di colonna).

Nella prima riga, in corrispondenza delle colonne dei nomi, abbiamo inserito la funzione SOMMA per avere a vista i totali dei valori per ogni nominativo.

il primo grafico lo imposteremo per visualizzare e comparare i totali in funzione dei nominativi.

il secondo grafico lo imposteremo per visualizzare in un determinato arco di tempo, l'andamento dei valori di tutti e tre i nominativi .

Come vedrete le routine sono veramente brevi.

Primo grafico: poichè avremo bisogno di vedere in un'unica area il totale dei valori dei tre nominativi, imposteremo la proprietà RowCount a 1, mentre essendo tre i valori da visualizzare impostiamo la proprietà ColumnCount a 3; lo stesso per impostare il numero di etichette che vorremo vedere (una per ogni nome)

  • Private Sub UserForm_Activate()
    Chart1.ShowLegend = True 
     'impostiamo a True per poter visualizzare le etichette
    Chart1.RowCount = 1         
    'definiamo quante righe dovrà mostrare i grafico
    Chart1.ColumnCount = 3 
     'definiamo quante colonne per ogni riga dovranno essere presenti
    'ora iniziamo un ciclo For Next che ha lo scopo di scorrere le 3 colonne previste e in contemporanea l'intervallo dei 'valori (i totali di ogni nominativo) per memorizzarli tramite la variabile "b" , nella proprietà Data (che funziona come 'se fosse una matrice) che li userà come valori traccianti il grafico.
    For c = 1 To 3  
     'iniziamo il ciclo che scorre tre volte (tre sono i valori contenuti nelle celle gialle)
    Chart1.Column = c
     'con il contatore "c" indichiamo il numero di quale colonna rappresentare con il valore "b"
    b = Sheets(2).Cells(1, c + 1).Value
     'con "b" prendiamo il valore della cella (riga1, colonna c +1(ad inizio sarà la 2))
    e = Sheets(2).Cells(2, c + 1).Value 
     'con "e" prendiamo il nome nella cella (riga2, colonna c +1) (nominativi)
    Chart1.Data = b
    'memorizziamo il primo valore "b" nella matrice Data, e a seguire gli altri valori fino a fine ciclo
    Chart1.DataGrid.ColumnLabel(c, 1) = e 
    'e si assegna all'etichetta il nome rappresentato dalla variabile "e"
    Next
    Chart1.DataGrid.RowLabel(1, 1) = "Totali Nominativi" 
    'infine si imposta il testo per l'etichetta di riga (la R1)
    End Sub

e questo è in nostro grafico ottenuto con le istruzioni appena viste:

Da notare che le due scale valori vengono impostate in automatico nel grafico in funzione del massimo valore memorizzato nella proprietà Data, e variando il valore max tutta l'area del grafico sarà ridimensionata rispettando la nuova scala. Proprio comodo, veramente.

Secondo Grafico: in questo caso, volendo rappresentare l'andamento dei (valori dei) tre nominativi, per ogni giorno, in un intervallo di giorni, abbiamo bisogno di stabilire quanto è ampio l'intervallo, cioè il numero di quanti giorni (righe) vogliamo rappresentare; questo numero sarà il numero che definirà quante righe (RowCount) impostare. E per ogni riga vorremo vedere 3 colonne (ColumnCount), cioè i tre nominativi "visti" giorno per giorno. 3 anche per impostare il numero di etichette che vorremo vedere. Tanto per intenderci, vogliamo ottenere un grafico così:

In fase di progettazione sarà possibile stabilire dinamicamente l'intervallo da visualizzare, e quindi rilevare il numero di righe che servono a impostare il valore da assegnare a  RowCount, (lo stesso sarà per le colonne) sia reperendo gli indici di riga delle date di inizio e fine (cioè dei numeri di riga, sul foglio) usando indici mobili (es. due celle dove scrivere il primo numero riga foglio e il finale intervallo) o anche InputBox per richiedere inizio riga e fine riga intervallo, e facendo la differenza. Per semplificare, in questo esempio ho preso 10 righe: l'intervallo tra la data 01/01/05 e 19/01/05. Teniamo presente che maggiore sarà l'intervallo e quindi il numero di righe (RowCount) da visualizzare, minore sarà lo spazio a disposizione nell'area grafico, a parità di dimensione del Form e del controllo MSGraf.

Altra considerazione da fare è che avremo bisogno di un doppio ciclo For Next : un ciclo esterno che scorra tutte le righe del grafico e in contemporanea dell'intervallo delle date previste, ed un ciclo interno che, per ogni riga del grafico, scorra i tre valori dei nominativi, (le tre colonne sul foglio), e carichi (la matrice) Data con i valori letti nelle celle. Altra cosa da chiarire è l'utilizzo della proprietà ColumnLabel dell'oggetto DataGrid; questa proprietà che determina il testo delle etichette, ha bisogno di due argomenti da definire per sapere a quale colonna assegnare il testo: il numero di colonna (che inizia sempre da 1 e non da zero), e l'indice di etichetta che identifica un'etichetta specifica. (Se in una colonna esistono più livelli di etichette, è necessario identificarne uno solo. Le etichette delle colonne sono numerate dal basso in alto a partire da 1). Vediamo le istruzioni per generare il grafico visto sopra:

  • Private Sub UserForm_Activate()
    Chart1.ShowLegend = True    'impostiamo la proprietà ShowLegend a True per poter visualizzare le etichette
    Chart1.RowCount = 10  
    'definiamo quante righe dovrà mostrare i grafico
    Chart1.ColumnCount = 3 
     'definiamo quante colonne per ogni riga dovranno essere presenti
    Chart1.DataGrid.ColumnLabelCount = 3 
    'definiamo quante etichette dovranno essere presenti
    For c = 1 To 10 
     'iniziamo il primo ciclo che "girerà" 10 volte; la variabile "c" è il contatore del ciclo.
    Chart1.Row = c   
    'definiamo con "c" il numero di quale riga del grafico ora ci riferiamo
    r = Sheets(2).Cells(c + 2, 1).Value 
    'e con la variabile "r" prendiamo il valore (la data) che sarà nella riga "c" + 2 '(quindi la riga 3 del foglio ad inizio ciclo), nella colonna 1 (la A)
    Chart1.RowLabel = r 
    ' e si assegna questo valore all'etichetta di riga (è la data che poi vediamo nel grafico, ad ogni 'ciclo, per ogni riga)
    Next

  • 'ho separato queste due istruzioni  (quelle appena sopra da queste sotto) solo per illustrare meglio le spiegazioni ed 'evitare troppe istruzioni unite in un unico doppio ciclo, ma i più esperti sapranno gestire anche la parte di 'assegnazione testo alle etichette di riga insieme alle altre seguenti istruzioni
    For g = 1 To 10
     'la variabile "g" diventa il contatore per scorrere le righe del grafico
    For b = 1 To 3   
     'la variabile "b" diventa il contatore per scorrer le colonne per ogni riga del grafico
    Chart1.Row = g  
     'ora identifichiamo il numero di riga grafico  tramite la variabile  "g"
    Chart1.Column = b  
    'ora identifichiamo il numero di colonna tramite la variabile "b" all'interno della riga "g"
    e = Sheets(2).Cells(g + 2, b + 1).Value 
    'col la variabile "e" prendiamo il valore letto nella cella del foglio, cella riga g +2, colonna b + 1, quindi ad inizio ciclo sarà la cella riga 3, colonna 2 (la b)
    Chart1.Data = e
    'ed assegniamo il valore alla (matrice) Data (proprietà dell'oggetto Chart1)
    'sotto la variabile "f" la usiamo per memorizzare il "nominativo", letto nel ciclo interno nelle celle che vanno dalla B2 'alla D2, da assegnare all'etichetta di colonna
    f = Sheets(2).Cells(2, b + 1).Value  
    labindex = 1
     'impostiamo il valore per identificare l'indice di etichetta, mentre la variabile "b", sotto, indicherà il 'numero di colonna (grafico)
    Chart1.DataGrid.ColumnLabel(b, labindex) = f 
    'e gli assegniamo il nominativo letto con 2f"
    Next: Next
    End Sub

L'efficacia visiva è garantita, e se poi vorremo munire il grafico di pulsanti di opzione, in modo da cambiare il tipo di grafico dopo che è stato creato, potremo usare degli OptionButton ai quali assegnare semplici istruzioni che modificano il tipo di grafico a piacere (tra i tipi visti all'inizio), per esempio per vedere un grafico in  Area3d, potremo usare :

  • Private Sub OptionButton1_Click()
    Chart1.ChartType = VtChChartType3dArea
    End Sub

e vedremo il grafico sopra così:

oppure vederlo con Barre 3D, così:

Un ultimo vantaggio: se spostiamo il mouse sull'area grafico, quando è un grafico 3D, se premiamo il tasto CTRL (Control), il puntatore del mouse assume la forma di una freccia semisferica a quattro punte; premendo il pulsante sinistro del mouse sopra il grafico, potremo spostare, ruotandolo in tutte le posizioni, il grafico.

Unico difetto riscontrato in 3D, la non perfetta leggibilità dei valori sul grafico.

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org