Fare un Grafico col vba - parte terza (ed ultima) - dal 04/09/04 pagina vista: volte

Quando si crea un grafico abbiamo detto che Excel gli assegna un numero indice e un nome formato dalla parola "Grafico" seguito comunque dal numero progressivo, che noi non vediamo. Ma per poter agire sul grafico appena creato, abbiamo bisogno di Attivarlo (Activate) o selezionarlo per modificare o impostare proprietà a noi necessarie. In questi casi, per riferirsi al grafico dovremo identificarlo indicando il suo numero indice oppure il suo nome (es. .ChartObjects(X).Activate oppure .ChartObjects("Grafico X").Activate, dove X sarà il numero indice).

Ora, se stiamo creando un grafico e sappiamo che quel grafico è il primo che inseriamo, nelle istruzioni potremo tranquillamente usare il numero indice 1, ma se ne avremo già creati, magari eliminando un grafico per ricrearlo (facendo ad esempio delle prove), risulterà poi difficile ricordarsi quanti grafici abbiamo testato e quale sarà il numero indice da assegnare al nuovo che stiamo per ricreare. Sbagliare il numero indice provocherà il lamento del debugger, e se anche il grafico verrà creato, sarà incompleto. Avremo solo un grafico prodotto dalla parte iniziale di istruzioni, ma tutte quelle successive alla riga .ChartObjects("Grafico pincopallino").Activate non saranno eseguite perchè il grafico non è stato identificato, con l'aggravante che comunque un grafico (incompleto) è stato creato ed Excel continua a incrementare il numero indice.

Per sapere in nome del grafico sfrutteremo la proprietà Name dell'oggetto Chart, sia per prenderlo in automatico (vedremo più avanti)( il nome di un'oggetto Chart appena creato), sia per poterlo identificare quando ci occorra.

Se selezionate un grafico della vostra cartella, e poi lanciate questa macro, saprete il nome ed il tipo di grafico:

  • Sub DimmiNomeGrafico()
    On Error Resume Next 
    'per evitare errore di debug se non si è selezionato il grafico
    With ActiveChart
    MsgBox "Sono il Grafico " & .Name & " e di tipo " & .ChartType
    End With
    Resume
    End Sub

ed otterremo un messaggio simile a questo :  

e a questo punto per comporre istruzioni che agiscano su quel grafico potremo usare una sintassi precisa:

  • Sheets(3).ChartObjects("Grafico 9").Activate   (ecc. ecc.)

Facciamo un grafico a Colonne 3D ed uno a Torta 3D

Nei due articoli precedenti abbiamo visto due diversi metodi per creare un grafico, entrambi usati per ottenere un grafico a Linee, ma non sempre però il grafico a Linee è l'optimum per ciò che vogliamo rappresentare, specialmente quando i dati da graficizzare sono in tabelle impostate diversamente da quelle viste, oppure quando vogliamo evidenziare altre caratteristiche delle nostre tabelle dati. Prendiamo ad esempio una tabella come questa, dove registreremo le vendite di alcuni tipi di prodotti, nello specifico articoli di arredamento (ma potranno essere dati di vendite Agenti, oppure titoli di libri, o ancora prodotti farmaceutici, meccanici, ecc. ecc). 

La tabella è composta da un campo date, con cadenza mensile, e dalle quantità di vendita relative agli articoli richiamati nelle intestazioni di colonna (celle verdi chiaro). Normalmente predisponiamo delle celle nelle quali usiamo la funzione =SOMMA() per ottenere il totale dei prodotti venduti, in questo caso le celle giallo chiaro. Vogliamo ottenere un grafico che mostri i totali delle vendite per ogni prodotto, quindi non ci importano le date, ma solo i valori (i totali) e come categorie, i tipi di articoli.

Come vedremo, useremo quasi le stesse istruzioni per ottenere i due diversi grafici, ma quello a Colonne 3D necessita di alcune istruzioni in più.

Grafico a Colonne 3D : non usiamo la Legenda (l'etichetta con i nomi delle serie) ed useremo invece le etichette dati (DataLabels) che ci mostreranno in cima ad ogni colonna, il valore (totale) relativo ad ogni categoria (i prodotti). Ho scelto il colore bianco dei font, ed Excel provvede in automatico a creare il fondo etichetta in colore di contrasto (potremo volendo scegliere sia i colori dei font di queste DataLabels sia il colore di fondo. Tanto per capirci, otterremo questo risultato:

ed ora vediamo la routine per creare un grafico così:

  • Sub GraficoColonne3D()
    Dim ch As ChartObject
    Set ch = ActiveSheet.ChartObjects.Add(400, 20, 400, 250)
    nome = ch.Name 
    'con la variabile "nome" prendiamo, appena creato il nome del grafico. Nelle istruzioni (sopra) per 'dimensionare e posizionare il grafico, ho usato posizionarlo a partire dalla colonna I, corrispondente (alla mia 'risoluzione video 800x600) mettendo 400 come valore, cos' lascia scoperta tutta la tabella dati.

    'sotto: come sorgente dati ho usato una cella vuota del foglio attivo; questo perchè, anche se l'argomento Source del 'metodo ChartWizard è facoltativo, in realtà se non si assegna il grafico non si compone. E' l'argomento Gallery che 'con la costante xl3DColumn  provvedere a darci il grafico in colonne 3D.
    ch.Chart.ChartWizard Source:=ActiveSheet.Range("b2"), _
    gallery:=xl3DColumn, Title:="Totali Vendite"

    'ora si attiva il grafico usando la variabile "nome" per identificarlo; in questo modo, se vogliamo eliminarlo e ricrearlo, 'non dovremo diventare matti a trovare il nuovo nome del grafico
    ActiveSheet.ChartObjects("" & nome & "").Activate
    ActiveChart.HasLegend = False 
    'si imposta HasLegend a False (senza Legenda)
    ActiveChart.ChartArea.Select
    'indi selezioniamo l'area grafico, necessario per assegnare i range a XValues (viene 'assegnato il range che contiene le intestazioni di colonna) e a Values che restituiscono i valori di scala (l'altezza delle 'colonne)
    ActiveChart.SeriesCollection(1).XValues = ActiveSheet.Range("B4:G4")
    ActiveChart.SeriesCollection(1).Values = ActiveSheet.Range("B1:G1")
    'sotto: quindi si provvede sull'Asse dei Valori (colonne) ad impostare i parametri che ci interessano
    ActiveChart.Axes(xlValue).Select
    With ActiveChart.Axes(xlValue)
    .MinimumScaleIsAuto = True
    .MaximumScaleIsAuto = True
    .MinorUnitIsAuto = True
    .MajorUnit = 200
    .Crosses = xlAutomatic
    .ReversePlotOrder = False
    .ScaleType = xlLinear
    .DisplayUnit = xlNone
    End With
    'ora invece le istruzioni per aggiungere a fine colonna le etichette che mostrano i valori totali presi dall'origine dati '(B1:G1)
    ActiveChart.SeriesCollection(1).ApplyDataLabels
    With ActiveChart.SeriesCollection(1).DataLabels.Font 
    'e della proprietà Font impostiamo i parametri
    .Name = "Arial"
    .Size = 10
    .Strikethrough = False
    .Superscript = False
    .Subscript = False
    .OutlineFont = False
    .Shadow = False
    .Underline = xlUnderlineStyleNone
    .ColorIndex = 2
    .Background = xlAutomatic
    End With
    ActiveChart.Deselect
    'e deselezioniamo il grafico
    End Sub


Grafico a Torta 3D : forse il tipo di grafico che rende meglio dell'altro un andamento totali di vendita, inoltre, se non modifichiamo la categoria dell'opzione "Numero" relativo al  "valore" delle DataLabels, di default otteniamo valori in percentuale, che forse rendono meglio l'idea di comparazione tra i totali. Vediamo prima l'effetto:

Che ne dite? non è più gradevole? Inoltre sono richieste meno istruzioni, vediamole:

  • Sub GraficoTorta3D
    Dim ch As ChartObject
    Set ch = ActiveSheet.ChartObjects.Add(400, 20, 400, 250)
    nome = ch.Name
    ch.Chart.ChartWizard Source:=ActiveSheet.Range("B2"), _
    gallery:=xl3DPie, Title:="Totali Vendite" 
    'la costante xl3DPie determina il formato a torta 3D

    ActiveSheet.ChartObjects("" & nome & "").Activate
    ActiveChart.ChartArea.Select
    ActiveChart.SeriesCollection(1).XValues = ActiveSheet.Range("B4:G4")
    ActiveChart.SeriesCollection(1).Values = ActiveSheet.Range("B1:G1")
    ActiveChart.Deselect

    End Sub

Sono simili a quelle per il grafico a colonne (tranne xl3DPie) ma ancora meno complesse, e l'effetto è assicurato. Ho concluso gli articoli sui grafici, ognuno si sbizzarrisca facendo prove, non è difficile ottenere risultati, ed il codice non è difficile da capire, specie se si attiva il registratore di macro e poi si consulta per capire come vengono "compilate" le istruzioni sulla base delle azioni compiute nella creazione del grafico.

Un'ultima cosa : questi due tipi di grafici non richiedono aggiornamenti per eventuali aggiunte dati, si aggiornano automaticamente visto che pescano le variazioni dei totali sempre dal solito intervallo (B1:G1).

Buon lavoro.

prelevato sul sito www.ennius.altervista.org