Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

grafico excel visualizza classi di dati

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

grafico excel visualizza classi di dati

Postdi wallace&gromit » 28/03/17 08:22

Ciao a tutti,
ho un grafico excel che mostra i dati complessivi di una banca dati (distribuita su vari fogli).
I dati appartengono a classi ( a e d sono tipo "pippo", b e "topolino", c f "paperino") ma questa dicitura non appare nella didascalia del grafico, dove vedo solo a,b,c,d,e,f.
Facendo Seleziona dati io posso spuntare quelli che voglio vedere e togliere la spunta a quelli che non voglio, però
1) devo sapere quali sono p.e. i "pippo" per poterli spuntare
2) visto che nel file reale i dati sono molti, (ma molti molti!) stare a spuntare tutti è piuttosto lungo.

Quindi la domanda è questa: c'è un modo per togliere o aggiungere dalla visualizzazione intere classi in un colpo solo?
Se necessario posso aggiungere sigle alle diciture, p.e. potrebbero chiamarsi PI-a e PI-d; PA-c e PA-f, ecc.

Qui il piccolo file d'esempio:
http://www.filedropper.com/graficoselezionaclassididati

P.S. ovviamente parlo di excel 2013 e non di 2003, che non mi dava nemmeno la possibilità di spunta
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Sponsor
 

Re: grafico excel visualizza classi di dati

Postdi Marius44 » 28/03/17 10:26

Ciao W&G
non so se fa al caso tuo ma vedi se può andare il file che ti allego. Devi selezionare il Foglio Grafico1 e quindi il grafico; poi basta passare il mouse sopra la legenda per vedere colorare la linea interessata.
Ovviamente non è farina del mio sacco ma lo trovai tempo fa in rete e, sbadatamente, non presi l'indirizzo.

Ciao,
Mario
https://www.dropbox.com/s/gc50ba9ojacqunh/grafico%20seleziona%20classi%20di%20dati.xlsm?dl=0
Marius44
Utente Senior
 
Post: 546
Iscritto il: 07/09/15 22:00

Re: grafico excel visualizza classi di dati

Postdi wallace&gromit » 28/03/17 10:53

wow, non è ancora proprio quello che mi serve ma l'effetto è molto bello.
Provo a lavorarci nel senso che invece di solo passare col mouse vorrei fare clic e fare in modo che dopo il clic la linea o appare o scompare del tutto e non solo in grigio fine.
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: grafico excel visualizza classi di dati

Postdi Marius44 » 28/03/17 14:00

Ciao W&G
quello ritengo sia facile. Nella costante cambia il valore del colore in 2, cioè Const iCOLOR_BLAND As Long = 2

Io, invece, ho provato, ma con scarso risultato, ad ottenere lo stesso effetto in un Grafico incorporato (non un Foglio Grafico). Secondo te sarebbe possibile oppure no?

Ciao,
Mario
Marius44
Utente Senior
 
Post: 546
Iscritto il: 07/09/15 22:00

Re: grafico excel visualizza classi di dati

Postdi wallace&gromit » 28/03/17 14:28

Ciao Mario,
il problema con la tua proposta di mettere colre = 2 è che al momento che riattivo quella linea il colore originale è andato perso e mi trovo tutte le linee in nero.
Per il momento ho adattato così (variando tra linea spessa continua e linea fine a puntini):
Codice: Seleziona tutto
Private Sub HighlightSeries(ByVal x As Long, ByVal y As Long)
  Dim ElementID As Long
  Dim Arg1 As Long
  Dim Arg2 As Long
  Dim Evidenz As Integer
 

  Me.GetChartElement x, y, ElementID, Arg1, Arg2
    If ElementID = xlLegendEntry Or ElementID = xlLegendKey Then
        If miSeries <> Arg1 Then
'            ResetSeries
            With Me.Legend.LegendEntries(Arg1)
                With .LegendKey.Border
                    If .Weight = xlMedium Then
                    Evidenz = 1
                    .Weight = xlHairline
                    .LineStyle = xlDot
                    Else:
                    .Weight = xlMedium
                    .LineStyle = xlContinuous
                    Evidenz = 0
                    End If
                End With
                With .Font
                    If Evidenz = 1 Then
                        .ColorIndex = xlAutomatic
                        .Background = xlTransparent
                        .FontStyle = "Regular"
                    Else:
                        .ColorIndex = iCOLOR_HIGHLIGHT
                        .Background = xlTransparent
                        .FontStyle = "Bold"
                    End If
                 End With
                   
            End With
            miSeries = Arg1
        End If
    End If
End Sub

sicuramente migliorabile.
Sul fatto dell'oggetto nel foglio di lavoro non mi sono ancora chinato, ma si potrà fare senz'altro. Ma non è il mio problema, nel file originale il grafico è effettivamente su foglio separato
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: grafico excel visualizza classi di dati

Postdi Anthony47 » 28/03/17 14:41

Mentre approfondisci l'interessante soluzione pubblicata da Mario ti propongo questo esperimento.
Ho creato accanto al grafico (o dove vuoi) una tabella dove nella prima colonna ho inserito la categoria e nella seconda si devono indicare con un valore diverso la "0" quelle che si vogliono visualizzare; ho assegnato a questa tabella il nome "master".
Poi in A9 di tutti i fogli ho inserito la formula
Codice: Seleziona tutto
=SE(CERCA.VERT($A2;master;2;0)>0;A2;NON.DISP())
Da copiare poi verso destra
Ho usato per queste operazioni l'indirizzamento "3D": ho selezionato Foglio1; ho premuto Maiusc e selezionato Foglio6; ho inserito la formula nella barra della formula e ho confermato con Enter; Contr-c, selezionato B9:E9, Enter.
Per uscire dall'indirizzamento 3D selezionare un foglio.

Sono quindi andato sul grafico e ho modificato Nome e Valori di tutte le serie prelevando i dati da riga 9 invece che da riga 2.
Il risultato e' come da immagine:
Immagine
hosting immagini

Puoi ovviamente usare tecniche varie per selezionare/deselezionare le categorie, es Doppioclick.

Spero sia di qualche utilita'.
Avatar utente
Anthony47
Moderatore
 
Post: 17656
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: grafico excel visualizza classi di dati

Postdi wallace&gromit » 28/03/17 15:18

ciao Anthony, mumble mumble, devo digerire quello che hai scritto.
Di primo acchito però non mi piace molto il #N/D che appare tra i scartati
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: grafico excel visualizza classi di dati

Postdi wallace&gromit » 28/03/17 17:15

surfando un po' ho trovato questa macro che mi nasconde le serie il cui nome inizia con "PI".
È esattamente quello che cercavo:
Codice: Seleziona tutto
Sub nascondi()

    Dim MySeries As Series
    For Each MySeries In ActiveChart.SeriesCollection
      If Left(MySeries.Name, 2) = "PI" Then
          ActiveChart.SeriesCollection(MySeries.Name).IsFiltered = True
        End If
    Next MySeries

End Sub


purtroppo mi manca "l'antidoto"
Questa non riesce a farle riapparire:
Codice: Seleziona tutto
Sub mostra()

    Dim MySeries As Series
    For Each MySeries In ActiveChart.SeriesCollection
          ActiveChart.SeriesCollection(MySeries.Name).IsFiltered = False
    Next MySeries

End Sub


P.S. ho modificato i nomi delle serie come avevo accennato nel mio primo messaggio
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: grafico excel visualizza classi di dati

Postdi Marius44 » 28/03/17 17:34

Ciao
anch'io sto "smanettando" ed ho trovato qualcosa che potrebbe interessarti. I colori delle linee del Grafico rimangono del colore originale ma quando la Legenda è selezionata quella Serie s'ingrossa. Riporto il codice con ciò che ho commentato e la modifica apportata.
Codice: Seleziona tutto
Option Explicit

'Const iCOLOR_HIGHLIGHT As Long = 5  ' BLUE                      <== riga eliminata
'Const iCOLOR_BLAND As Long = 15     ' 25% GRAY                 >== riga eliminata

Private miSeries As Long

Private Sub Chart_Activate()
  ResetSeries
End Sub

Private Sub Chart_MouseDown(ByVal Button As Long, ByVal Shift As Long, _
                            ByVal x As Long, ByVal y As Long)
  HighlightSeries x, y
End Sub

Private Sub Chart_MouseMove(ByVal Button As Long, ByVal Shift As Long, _
                            ByVal x As Long, ByVal y As Long)
  HighlightSeries x, y
End Sub

Private Sub HighlightSeries(ByVal x As Long, ByVal y As Long)
  Dim ElementID As Long
  Dim Arg1 As Long
  Dim Arg2 As Long

  Me.GetChartElement x, y, ElementID, Arg1, Arg2
    If ElementID = xlLegendEntry Or ElementID = xlLegendKey Then
        If miSeries <> Arg1 Then
            ResetSeries
            With Me.Legend.LegendEntries(Arg1)
                With .Font
'                    .ColorIndex = iCOLOR_HIGHLIGHT           <== riga eliminata
                    .Background = xlTransparent
                    .FontStyle = "Bold"
                End With
                With .LegendKey.Border
'                    .ColorIndex = iCOLOR_HIGHLIGHT          <== riga eliminata
                    .Weight = xlThick 'xlMedium                  <========= riga modificata
                    .LineStyle = xlContinuous
                End With
            End With
            miSeries = Arg1
        End If
    End If
End Sub

Private Sub ResetSeries()
  Dim lgnd As LegendEntry
  Application.ScreenUpdating = False
    For Each lgnd In Me.Legend.LegendEntries
        With lgnd.Font
            .ColorIndex = xlAutomatic
            .Background = xlTransparent
            .FontStyle = "Regular"
        End With
        With lgnd.LegendKey.Border
            '.ColorIndex = iCOLOR_BLAND                  <== riga eliminata
            .Weight = xlThin
            .LineStyle = xlContinuous
        End With
    Next
  Application.ScreenUpdating = True
End Sub


Prova e fai sapere. Io intanto mi studio quanto proposto da Anthony e cerco di far "riapparire" le tue serie.

Ciao,
Mario
Marius44
Utente Senior
 
Post: 546
Iscritto il: 07/09/15 22:00

Re: grafico excel visualizza classi di dati

Postdi Anthony47 » 28/03/17 19:23

Nell'esempio precedente il nome della serie diventata #N/D perche' avevo voluto usare una sola formula su tutte le celle di riga 9.
Nulla vieta di usare una formula che restituisce per la serie o un nome "vuoto" o il suo vero nome, e un'altra formula che restituisce i valori della serie oppure #N/D (per le serie da non visualizzare).

Comunque un'ulteriore alternativa e' questa macro, che lavora sempre sull'idea della tabella che chiarisce quali categorie visualizzare (1) e quali no (0):
Codice: Seleziona tutto
Sub OnOff()
'
ActiveSheet.ChartObjects(1).Activate      '<<< Il vero Indice del grafico
For i = 1 To ActiveChart.SeriesCollection.Count
    srcform = ActiveChart.SeriesCollection(i).Formula   '.Values     '= "=Foglio1!$C$2:$E$2"
    mysplit = Split(srcform, "(", , vbTextCompare)
    If UBound(mysplit) > 0 Then
        mysplit = Split(mysplit(1), "!", , vbTextCompare)
        If UBound(mysplit) > 0 Then
            myvl = Application.VLookup(Sheets(mysplit(0)).Range(Split(mysplit(1), ",", , vbTextCompare)(0)).Offset(0, -1).Value, Range("master"), 2, 0)
            If Not IsError(myvl) Then
                If myvl <> 1 Then   'Categoria della serie e' in tabella:
                    ActiveChart.SeriesCollection(i).Format.Line.Visible = msoFalse
                Else
                    ActiveChart.SeriesCollection(i).Format.Line.Visible = msoTrue
                End If
            Else                    'Categoria della serie non in Tabella:
                ActiveChart.SeriesCollection(i).Format.Line.Visible = msoTrue
            End If
        End If
    End If
Next i
Range("A1").Select
End Sub

NB: Presuppone che la categoria della serie sia scritta alla sinistra del nome serie, come nel file di esempio. Lavora sulle serie originali (es =Foglio1!$C$2:$E$2), quindi e' alternativa anche come logica alla proposta che avevo fatto prima.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17656
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: grafico excel visualizza classi di dati

Postdi wallace&gromit » 28/03/17 22:10

Fantastico, non mi resta che l'imbarazzo della scelta.

La prima soluzione di Anthony ha il pregio di usare solo formule.

Le soluzioni di Mario sono molto userfriendly con la possibilità di cliccare sulle serie direttamente.

La macro di Anthony è anch'essa molto efficace.

La soluzione che ho reperito e modificato io (ora completata con l'uso di FullSeriesCollection per fare riapparire le serie nascoste) ha il vantaggio di fare sparire dalla legenda le serie che non uso, devo solo vedere se è il caso di modificare il nome, ma magari riesco anche senza o con una tabella stile quelle di Anthony.

Non me ne vogliate se alla fine opto per quest'ultima, ma terrò ben in conto le altre proposte. Grazie e a presto!
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: grafico excel visualizza classi di dati

Postdi Anthony47 » 29/03/17 13:27

Bella discussione...

Senza invidia per la soluzione che hai adottato ti ricordo che ovviamente puoi fare il merge tra le varie soluzioni.
Ad esempio se lavorare con la tabella di abilita/disabilita fosse vantaggioso (non ho capito se il tuo obiettivo e' visualizzare solo una categoria alla volta o genericamente poterle filtrare; ne' ho capito come hai adattato la tua macro, che lavora sul Nome delle serie, non sulla categoria) puoi modificare la mia Sub OnOff in
Codice: Seleziona tutto
Sub OnOff2()
'
ActiveSheet.ChartObjects(1).Activate      '<<< Il vero Indice del grafico
For i = 1 To ActiveChart.FullSeriesCollection.Count
    srcform = ActiveChart.FullSeriesCollection(i).Formula   
    mysplit = Split(srcform, "(", , vbTextCompare)
    If UBound(mysplit) > 0 Then
        mysplit = Split(mysplit(1), "!", , vbTextCompare)
        If UBound(mysplit) > 0 Then
            myvl = Application.VLookup(Sheets(mysplit(0)).Range(Split(mysplit(1), ",", , vbTextCompare)(0)).Offset(0, -1).Value, Range("master"), 2, 0)
            If Not IsError(myvl) Then
                If myvl <> 1 Then   'Categoria della serie e' in tabella:
                    ActiveChart.FullSeriesCollection(i).IsFiltered = True
                Else
                    ActiveChart.FullSeriesCollection(i).IsFiltered = False
                End If
            Else                    'Categoria della serie non in Tabella:
                ActiveChart.FullSeriesCollection(i).IsFiltered = False
            End If
        End If
    End If
Next i
Range("A1").Select
End Sub

Non sto' a ripetere (ma l'ho sto' appena facendo) che puoi usare doppioclick (o altra tecnica) per commutare il contenuto della tabella master e lanciare la Sub OnOff per avere il grafico aggiornato in real time.

Alla prossima...
Avatar utente
Anthony47
Moderatore
 
Post: 17656
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: grafico excel visualizza classi di dati

Postdi Marius44 » 29/03/17 15:03

Buon pomeriggio
Son d'accordo con Anthony: bella discussione.
Oppure si potrebbe, dopo aver creato un elenco con convalida dati (io l'ho fatto nella cella J5 - dato origine in L1:L7) impostare il codice seguente (io l'ho inserito tutto nel Modulo di Foglio1 dove ci sta il Grafico incorporato).
Codice: Seleziona tutto
Sub prova_convalida() 'mostra solo quella selezionata
Dim cht As Chart
Dim ser As Series
Dim slz As String
Dim num As Integer
Dim i As Long
slz = Range("J5").Value: If slz = "" Then Exit Sub
'rimanda al select case
num = selcase(slz)
Set cht = Worksheets("Foglio1").ChartObjects("Grafico 2").Chart
    If num = 0 Then
        For i = 1 To cht.SeriesCollection.Count
            Set ser = cht.SeriesCollection(i)
            With ser.Format.Line
                .Visible = msoTrue
            End With
        Next i
    ElseIf num > 0 Then
        For i = 1 To cht.SeriesCollection.Count
            Set ser = cht.SeriesCollection(i)
            With ser.Format.Line
                .Visible = msoFalse
            End With
        Next i
        Set ser = cht.SeriesCollection(num)
        With ser.Format.Line
            .Visible = msoTrue
        End With
    End If
End Sub

Function selcase(ByVal slz As String) As Integer
Dim num As Integer
    Select Case slz
        Case "serie tutte"
            num = 0
        Case "serie a"
            num = 1
        Case "serie b"
            num = 2
        Case "serie c"
            num = 3
        Case "serie d"
            num = 4
        Case "serie e"
            num = 5
        Case "serie f"
            num = 6
    End Select
    selcase = num
End Function

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("J5")) Is Nothing Then
    Call prova_convalida
End If
End Sub


Lo so, è un po' lungo da leggere ma ha il vantaggio di lavorare sul Grafico incorporato e non sul Grafico su un Foglio ad hoc

Ciao,
Mario
Marius44
Utente Senior
 
Post: 546
Iscritto il: 07/09/15 22:00

Re: grafico excel visualizza classi di dati

Postdi wallace&gromit » 31/03/17 16:52

Bene bene bene!
Ho usato un po' di tutto dei consigli che mi avete dato ed ecco il risultato finale.
Nel primo foglio del file ho la tabella "master" con le categorie e accanto delle celle di convalida dati con valori 1 o 0.
Nel codice del foglio ho inserito la macro di Mario:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B2:B7")) Is Nothing Then
    Call OnOff3
End If
End Sub

Nei fogli da 2 a 11 ho i grafici, che (e questo non l'avevo detto finora, ma l'ho risolto in corso d'opera) possono contenere anche riferimenti esterni che vanno in ogni caso mantenuti e che, accidenti a loro, possono contenere il testo contenuto nella tabella master.
Ecco quindi l'adattamento della macro di Anthony, in cui cerco prima di tutto se sia contenuto il testo "xls" e in questo caso salto al prossimo:
Codice: Seleziona tutto
Sub OnOff3()
On Error Resume Next
For j = 2 To 11
Sheets(j).Activate      '<<< Il vero Indice del grafico
For i = 1 To ActiveChart.FullSeriesCollection.Count
    srcform = ActiveChart.FullSeriesCollection(i).Formula
    If InStr(1, srcform, "xls") Then
    GoTo continua
    End If
    mysplit = Split(srcform, ",", , vbTextCompare)
    If UBound(mysplit) > 0 Then
        mysplit = Split(mysplit(1), "!", , vbTextCompare)
        If UBound(mysplit) > 0 Then
            foglio = Replace(mysplit(0), "'", "")
            myvl = Application.VLookup(Sheets(foglio).Cells(1, 1).Value, Range("master"), 2, 0)
            If Not IsError(myvl) Then
                If myvl <> 1 Then   'Categoria della serie e' in tabella:
                    ActiveChart.FullSeriesCollection(i).IsFiltered = True
                Else
                    ActiveChart.FullSeriesCollection(i).IsFiltered = False
                End If
            Else                    'Categoria della serie non in Tabella:
                ActiveChart.FullSeriesCollection(i).IsFiltered = False
            End If
        End If
    End If
continua:
Next i
Next j
Worksheets(1).Activate
Range("A1").Select
End Sub


E tutto funziona alla perfezione.
Ultimo piccolo dubbio estetico per la macro. Ho vaghi ricordi di un metodo semplice per saltare al prossimo elemento in un ciclo for next con qualcosa come skip, ma non ho più trovato come si fa.
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21

Re: grafico excel visualizza classi di dati

Postdi Anthony47 » 02/04/17 11:53

Non conosco un "metodo skip" (ce n'e' uno in vba ma ha un significato particolare); probabilmente ricordi qualcosa come
If CondizioneDaIgnorare Then Goto Skippa, ma Skippa deve essere una label nel codice.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17656
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: grafico excel visualizza classi di dati

Postdi wallace&gromit » 02/04/17 21:06

ok, allora è quello che ho fatto chiamando "continua"
Office2016 + 2019 su win10
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2054
Iscritto il: 16/01/12 14:21


Torna a Applicazioni Office Windows


Topic correlati a "grafico excel visualizza classi di dati":


Chi c’è in linea

Visitano il forum: Making e 33 ospiti