Il blog di Gianni Giaccaglini

Blog su VBA e VSTO
Gianni Giaccaglini

My Links

News

NB - V. anche gli ARTICOLI (in fondo a questa barra)
Solo quesiti validi a: giannigiac@tin.it
Il mio Best seller su VBA
(v. www.hoepli.it)


Il mio ultimo libro su Open XML
(v. www.FAG.it):



La mia nipotina ELISA

Foto con dedica a ME di
Bill Gates giovanissimo
nei mitici anni 80!

Categorie Post

Categorie Articoli

Archivio

Immagini

Blog Stats

Esplorazione di singoli grafici di una serie multipla

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.

?>

posted on giovedì 21 aprile 2011 14.46