Esplorare uno alla volta i grafici di una serie multipla
Si abbia una serie di dati storici disposti su righe successive, che formano un intervallo denominato “ZonaDati”:
|
|
A |
B |
C |
D |
E |
. . . |
J |
K |
L |
M |
N |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
3 |
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
12 |
|
Previsione |
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
5 |
1500 |
8000 |
5000 |
2001 |
1000 |
. . . |
1000 |
6550 |
777 |
|
21791 |
|
6 |
3210 |
6500 |
1000 |
8880 |
1000 |
. . . |
1000 |
4111 |
699 |
|
20429 |
|
7 |
5661 |
4000 |
966 |
6661 |
1000 |
. . . |
1000 |
21145 |
5000 |
|
10004 |
|
8 |
25569 |
2553 |
7441 |
4440 |
1000 |
. . . |
1000 |
3369 |
4000 |
|
43500 |
|
9 |
7000 |
6998 |
2000 |
2589 |
5994 |
. . . |
1000 |
9974 |
4889 |
|
6243,3 |
|
10 |
5894 |
4588 |
8999 |
1147 |
2444 |
. . . |
1000 |
1440 |
6001 |
|
9682,8 |
|
11 |
2001 |
30014 |
3500 |
3005 |
30459 |
. . . |
1000 |
30014 |
10025 |
|
20384 |
|
12 |
69974 |
5555 |
1000 |
97774 |
10002 |
. . . |
1000 |
2000 |
40025 |
|
2031,2 |
Volendo graficizzarli, per esempio con un tipo XY (“a dispersione”) il procedimento normale conduce a grafici multipli sovrapposti, tra l’altro con qualche problema qualora i singoli valori massimi e minimi siano troppo differenti. Le macro che propongo servono ad evidenziare il singolo grafico di ciascuna serie.
Prima soluzione, con doppio clic
Prima di procedere occorre creare manualmente il grafico, incollato sul foglio di lavoro, relativo alla prima serie. Dopo di che la prima soluzione sfrutta l’evento doppio clic. La fornisco come ricetta (che i più esperti sapranno comunque ben meditare), ricordando solo che la si ottiene selezionando il modulo Foglio1 quindi scegliendo Worksheet e BeforeDoubleClick nelle due caselline a discesa in alto (etichettate coi tip “Oggetto” e “Routine”):
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
Dim ZonaDati As Range
Set ZonaDati = Range("ZonaDati")
If Intersect(Target, ZonaDati) Is Nothing Then
Exit Sub ' Esci se la cella è fuori zona dati
Else
Dim Nc As Integer ' Numero colonne
Nc = ZonaDati.Columns.Count
Dim RigaIniz As Integer
RigaIniz = ZonaDati.Row
Dim RigaDati As Range
Set RigaDati = ZonaDati.Rows(Target.Row - RigaIniz + 1)
RigaDati.Select
CambiaSerie RigaDati.Address
End If
End Sub
Ma cosa diavolo è CambiaSerie? Si tratta di una Sub, stavolta, inserita in un nomale Modulo1 in testa al quale si ha una variabile comunitaria (area Dichiarazioni) NumeroSerie:
Dim NumeroSerie As Integer
Sub CambiaSerie(RigaDati As String)
Dim QuestoGraf As ChartObject
Set QuestoGraf = ActiveSheet.ChartObjects("Grafico 1")
QuestoGraf.Chart.SeriesCollection.Add _
Source:=Worksheets("Foglio1").Range(RigaDati)
QuestoGraf.Chart.SeriesCollection(1).Delete
End Sub
Sub ProvaCambiaSerie()'Routine di prova
CambiaSerie "A7:L7"
End Sub
Premesso che “Grafico 1” è il nome default assegnato al grafico creato a mano (in caso contrario modificare a dovere “Grafico 1”) il procedimento inizialmente aggiunge un grafico assumendo come origine (Source) l’intervallo RigaDati passato come argomento, dopo di che viene eliminato (Delete) il grafico precedente, ovvero il membro numero 1 dell’insieme SeriesCollection.
Seconda soluzione, con pulsante incorporato
Si tratta, più semplicemente, di una comune routine presente anch’essa sul Modulo1 da abbinare a un pulsante “classico” di Excel (o magari a una shape, personalmente uso la forma “Telaio”). Eccola:
Sub EsploraGrafici()
swSfondo = Not swSfondo
Dim ZonaDati As Range, Previsioni As Range
Set ZonaDati = Range("ZonaDati")
Set Previsioni = Range("Previsioni")
NumeroSerie = _
IIf(NumeroSerie = ZonaDati.Rows.Count, 1, NumeroSerie + 1)
ZonaDati.Interior.ColorIndex = 17
Previsioni.Interior.ColorIndex = 17
Dim RigaDati As Range, CellaPrevis As Range
Set RigaDati = ZonaDati.Rows(NumeroSerie)
Set CellaPrevis = Previsioni(NumeroSerie)
RigaDati.Select
RigaDati.Interior.ColorIndex = 6
CellaPrevis.Interior.ColorIndex = 6
CambiaSerie RigaDati.Address
End Sub
In questo caso ho pensato di trattare anche l’intervallo N5:N12 posto sulla destra della zona dati (rivedere la figura iniziale) e battezzato “Previsioni”, le cui celle contengono formule statistiche di cui riporto solo la prima, posta in N5:
=PREVISIONE(13;A12:L12;$A$3:$L$3)
Nota. I dati forniti sono alquanto aleatori, idem pertanto i risultati di ciascuna previsione... Ma era solo un esercizio sulle macro.
Per evitare confusioni si considerino solo le istruzioni segnate in neretto, che sono quelle essenziali relative alle serie di dati. Ad ogni clic sul predetto pulsante la macro incrementa il NumeroSerie ciclicamente (ovvero riparte con 1 se si supera il numero di righe della zona dati (ZonaDati.Rows.Count) e successivamente viene fissata la nuova serie in RigaDati =ZonaDati.Rows(NumeroSerie) poi selezionata con RigaDati.Select e infine ne viene passato il riferimento (Address) alla già vista Sub CambiaSerie.
Le istruzioni intercalate (prive di grassetto) compiono un analogo mestiere sull’intervallo “Previsioni”, inoltre evidenziano in giallo la riga selezionata e la corrispondente cella di previsione.
?>