Fare un Grafico col vba - parte seconda - dal 04/09/04 pagina vista: volte Come anticipato nella prima parte, ora ci occupiamo dell'oggetto ChartObjects e del metodo ChartWizard. Ne vedremo le caratteristiche e di come usarli. Non vi spaventate se leggerete descrizioni ampie perchè l'esempio che poi faremo rispecchierà il tema di questi due articoli : semplificare al massimo le istruzioni, riducendole al minimo. Nota: l'intervallo dati in questo esempio l'ho iniziato dalla riga 3, ma senza intestazioni di colonna come invece apparivano nella tabella dell'esercizio precedente. ChartObjects (con la "s" del plurale) rappresenta "l'insieme" di tutti i ChartObject (oggetto "grafico") presenti su una cartella di lavoro (siano essi su fogli grafici oppure su fogli di lavoro specificati). Per identificare ed agire su un grafico (ChartObject) dobbiamo usare la sintassi ChartObjects(indice) che ne individua uno ben preciso; indice può essere il suo numero indice (o d'ordine, assegnato da Excel), oppure il suo nome, posto tra doppie virgolette. Il suo numero indice sarà influenzato dal progressivo di tutti i grafici presenti nella stessa cartella di lavoro. ChartObject in realtà non è il grafico vero e proprio, ma il contenitore del grafico: è la cornice esterna a linea continua che contiene il grafico il quale si identifica con Chart (Chart è appunto una proprietà dell'oggetto ChartObject, ma può essere anche "l'oggetto" Chart dell'insieme Charts). Purtroppo in Excel questa storia di un "qualcosa" che può essere, a seconda del contesto di costruzione istruzioni, sia oggetto, sia proprietà, sia metodo, sicuramente crea molta confusione, quindi limitando le descrizioni di cosa sono, e semplificando, possiamo dire:
Useremo quindi il metodo ChartWizard, ma usando solo in parte i suoi argomenti, e adattando altre istruzioni secondo nostre esigenze; in pratica "mescoliamo" (semplificando e migliorando) un pò di istruzioni per creare un grafico a Linee simile a quello dell'articolo precedente. Uno dei vantaggi che otterremo usando ChartWizard è quello di ottenere in fase di creazione, già un ChartObject con le dimensioni da noi volute, senza ricorrere ai metodi legati agli Shapes. Useremo comunque il metodo Add applicato all'insieme ChartObjects, dandogli subito le impostazioni per le dimensioni. Vediamo il primo lotto di istruzioni (poi vedremo la macro completa) che provvedono alla creazione del grafico :
Come si nota, istruzioni decisamente molto contenute (per ora) per la creazione del grafico, ma ne mancano ancora necessarie alla fase "creazione", che vediamo ora usando il metodo ChartWizard : di questo metodo useremo solo gli argomenti Source, Gallery e Title. Per tutte le altre informazioni necessarie alla realizzazione del grafico, useremo istruzioni ad hoc. Vediamo intanto il secondo blocco istruzioni :
Usiamo ancora la variabile "ch" (non scordiamoci che ora è un oggetto ChartObject) e di questo oggetto usiamo la sua proprietà Chart e di questa richiamiamo il metodo ChartWizard di cui usiamo l'argomento Source assegnandoli l'area di provenienza dati: attenzione : come intervallo dati dobbiamo ora fornire solo l'area che contiene i valori e senza comprendervi le intestazioni di colonna (che metteremo noi via codice), quindi l'intervallo delle colonne B e C relative al numero di visite settimanali, non anche la colonna A dove sono le date che formeranno l'asse delle categorie; queste le assegneremo seguendo un'altra strada che vedremo sotto. Usiamo poi l'argomento Gallery assegnandoli la costante xlLine per avere un grafico a linee, e infine l'argomento Title con il quale impostiamo il testo che vedremo come titolo del grafico. Riuniamo ora il blocco delle istruzioni di creazione, come riepilogo:
Con queste poche istruzioni otterremo un risultato quasi perfetto, a cui mancano però alcune cose, e comunque questo: come si nota, avendo dato noi un'altezza adeguata (250 punti), Excel ha provveduto a impostare una adeguata "unità" di scala valori, infatti va di 200 in 200; solo che manca sull'asse categorie l'impostazione a Days (7, una settimana) e relativa data, ed al loro posto troviamo comunque dei numeri che rappresentano il numero di "punti di intersezione" corrispondenti comunque a 51 settimane, cioè l'arco di tempo su cui si valutano i valori. Inoltre sono presenti lungo le linee gli "indicatori di punto" (MarkerStyle) che invece non vorremo vedere. Poichè con le istruzioni viste sopra, creiamo il grafico ma ne perdiamo il focus, abbiamo bisogno di "riattivare" (Activate) il grafico per potergli assegnare le istruzioni per le nostre modifiche. A questo punto, approfittiamo per creare una variante : useremo delle lettere come variabili alle quali assegnare gli indirizzi delle celle (Address) adattabile alla reale lunghezza delle varie colonne che interessano l'area dati. Prenderemo sia le celle iniziali, e sfruttando End(xlDown), anche gli indirizzi delle celle finali. Rendiamo quindi la sorgente dati adattabile al reale numero di righe usate, senza dovere impostare nel codice un'intervallo predeterminato. Dobbiamo fare questo perchè useremo il metodo SeriesColletion(indice) applicato all'oggetto Chart, che ci restituisce un oggetto che rappresenta una singola serie di valori identificata da un numero indice. Alla SeriesColletion(indice) va specificato l'intervallo dell'area dati contenente i valori, per cui avremo la SeriesCollection(1) a cui affideremo l'intervallo dati colonna B (interfree) che vanno dalla cella B3 fino alla cella contenente l'ultimo dato, altrettanto avremo per la SeriesCollection(2) che riceverà l'intervallo dell'area altervista dalla C3 e fino all'ultima cella occupata. Da notare che non comprenderemo negli intervalli le intestazioni di colonna, che con le istruzioni finora usate, non sarebbero lette e assegnate come nome della serie, ma le forniremo via codice. Vediamo ora queste istruzioni: le lettere dalla "a" alla "f" sono i nomi delle variabili
ora iniziano le istruzioni anticipate sopra; dobbiamo Attivare il grafico usando ChartObjects seguito dal nome del grafico, che essendo il primo grafico sul foglio, si chiamerà "Grafico 1"; attenzione al numero indice: se eliminiamo il grafico e lo ricreaiamo, questo sarà il numero indice 2, o il 3 o il 4, dipende da quanti grafici avremo prima eliminato. Una volta Attivato il grafico, ne dobbiamo selezionare l'area grafico (ChartArea) vera e propria, perchè è su essa che agiremo. Useremo infatti il metodo SeriesCollection. Per prima cosa assegneremo un'intervallo alla proprietà XValues; questa proprietà importante restituisce o imposta una matrice dei valori x di una serie (o più serie) del grafico; in pratica serve a definire l'inizio e la fine dell'intervallo corrispondente a quante righe sono occupate dai valori che formeranno le linee del grafico; noi forniamo l'intervallo rappresentato dalle date, e non è un controsenso riferirci alle date in quanto ogni data corrisponde a dei valori: tante sono le righe delle date, tante saranno le righe dei valori (cioè i numeri che rappresentano la quantità di visite). Questa è la proprietà che serve ad impostare la scala dell'asse valori. Useremo infine la proprietà Values alla quale assegneremo gli intervalli dei dati numerici, quindi per la serie 1 sarà la colonna B (interfree) e per la serie 2 la colonna C (altervista): per definire gli intervalli sul foglio attivo useremo le variabili viste sopra :
Ed ora vediamo la macro completa, alla quale aggiungiamo l'istruzione di non mostrarci gli aggiornamenti a schermo durante la creazione del grafico, ma solo alla fine, con Application.ScreenUpdating = False ad inizio macro e Application.ScreenUpdating = True a fine macro:
e questo sarà il risultato: Non abbiamo toccato il valore di "unità" dell'asse valori lasciandolo di 200 in 200 perchè il grafico risulta comunque ben leggibile, altrimenti per modificare il valore di unità basta leggere e applicare le modifiche spiegate nell'articolo parte prima. Anche per gli aggiornamenti vale la macro AggiornaGrafico() presente nel precedente articolo. In conclusione so di non aver esaurito l'argomento "Grafici", peraltro troppo ampio, ma spero di avere fornito indicazioni utili ad orientarsi e comunque ricordo di consultare la guida in linea, ed usare il registratore di macro.
Buon lavoro. prelevato sul sito www.ennius.altervista.org |