Excel 2013 - Entfernen von LegendEntry-Objekten aus einer PivotChart-Legende mithilfe von VBA

646
Steve Taylor

Ich habe ein PivotChart, das normalerweise 6-8 Serien von möglichen 15 zeigt, von denen viele tendenziell Null sind. Jedes Mal, wenn es aktualisiert wird, hat es 15 Serien, und die Legende muss nur die Serie mit Nicht-Null-Zahlen auflisten, um das Diagramm übersichtlich und leicht lesbar zu halten.

Ich versuche, VBA zu verwenden, um bestimmte Elemente zu löschen, wenn die Serie alle Null ist (Maximalwert = 0), und es sind mehr Probleme aufgetreten als erwartet:

  1. Ich schleife jedes Element aus der FullSeriesCollection des Diagramms durch und gehe die Liste der Serien nacheinander durch. Da es sich bei der Legende jedoch um ein von der Serie getrenntes Objekt handelt, können Sie nicht die aktuelle Serie aus meiner Schleife verwenden, um darauf zu verweisen, und benötigen daher einen Schleifenzähler .

  2. Es gibt keine Möglichkeit, den Namen / Wert eines LegendEntries-Elements herauszufinden. Daher müssen Sie Series mit der Legende abgleichen, ohne bestätigen zu können, welches LegendEntries-Element welches ist.

(Anscheinend ist die nachstehende Funktion in Excel 2007 oder älter vorhanden.)

  1. Es scheint, dass das FullSeriesCollection-Objekt die Elemente (sinnvoll) von 1 bis 13 anordnet, während Sie sie durchlaufen, während das LegendEntries-Objekt Elemente in umgekehrter Reihenfolge von 13 auf 1 anordnet .

  2. Das LegendEntries-Objekt beginnt seinen Index bei 0, sodass seine Elemente tatsächlich von 12 bis 0 angeordnet werden .

  3. Das LegendEntries-Objekt nummeriert seine Elemente beim Löschen neu . Wenn Sie also Element 1 löschen, nummerieren alle Elemente in der Liste von 11 auf 0.

  4. Ich muss das Diagramm jedes Mal aktualisieren, wenn PivotTable aktualisiert wird, um alle gelöschten LegendEntries-Elemente erneut zu erfassen, die jetzt nicht Null sein können.

Angesichts dieser Komplikationen habe ich wirklich Schwierigkeiten gehabt, die spezifischen Elemente zu löschen, die ich aus dem Diagramm entfernen muss.

Wie können Sie die Elemente eines PivotTable effektiv durchlaufen und die entsprechenden LegendEntries-Serien löschen, wo immer alle Elemente Null sind?

0

1 Antwort auf die Frage

0
Steve Taylor

Beginnen Sie mit dem Worksheet_PivotTableUpdate-Ereignis

Das Arbeitsblatt, in dem sich das PivotTable befindet, benötigt den folgenden Code. Daher ruft es in Modul 1 die neue Funktion 'RefreshAbsenceLabels' auf, wenn dieses speziell benannte PivotTable aktualisiert wird:

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)  If Target.Name = "This Specific Table" Then  Module1.RefreshAbsenceLabels MsgBox "The PivotTable has been updated."  End If  End Sub 

Sprich mit dem richtigen Diagramm und aktualisiere seine Legende

Public Function RefreshAbsenceLabels()  Set DaysAbsent = ActiveWorkbook.Worksheets("Dashboard").ChartObjects("Department Absences")  With DaysAbsent.Chart  If .HasLegend Then .HasLegend = False End If .HasLegend = True 

Richten Sie Ihren Zähler ein und stellen Sie ihn auf die Anzahl der Serien minus eins ein

Der Minuspunkt ist die Tatsache, dass die FullSeriesCollection von 1 bis X nummeriert wird, während die LegendEntries-Elemente von X-1 bis 0 nummeriert werden

 Dim x As Integer x = .FullSeriesCollection.Count - 1 

Durchlaufen Sie die Serie, und löschen Sie die entsprechenden LegendEntries-Elemente

Der Zähler läuft gegen Null. Der Vorteil der umgekehrten Nummerierung von LegendEntries besteht darin, dass Sie nicht jedes Mal, wenn Sie Objekte löschen, einen Ausgleich für fehlende Elemente vornehmen müssen: Alle neu nummerierten Elemente wurden bereits behandelt, und es ist nicht mehr wichtig, um welche Nummer es sich handelt.

Application.WorksheetFunction.Max ermittelt den höchsten Wert aus der Serie

 For Each ser In .FullSeriesCollection  If Application.WorksheetFunction.Max(ser.Values) = 0 Then 'MsgBox "Deleting" & ser.Name & " - " & x .Legend.LegendEntries(x).Delete End If  x = x - 1 Next End With End Function