Excel 2013-удаление объектов LegendEntry из легенды сводной диаграммы с помощью VBA
У меня есть сводная диаграмма, которая обычно показывает 6-8 серий из возможных 15, многие из которых, как правило, равны нулю. Таким образом, каждый раз, когда он обновляется, у него есть 15 серий, и легенда должна только перечислить серию с ненулевыми цифрами, чтобы диаграмма была лаконичной и легкой для чтения.
Я пытаюсь использовать VBA для удаления конкретных элементов, где серия все ноль (максимальное значение = 0), и возникло больше проблем, чем ожидалось:
-
Я перебираем каждый элемент из графика FullSeriesCollection, проходя вперед по списку серий один за другим. Однако, поскольку легенда является отдельным объектом из серии,вы не можете использовать текущую серию из моего цикла, чтобы обратиться к нему, и поэтому требуется счетчик цикла.
-
нет способа узнать имя/значение элемента LegendEntries, так что вы должны соответствовать серии с легендой, не будучи в состоянии подтвердить что LegendEntries элемент, который.
(по-видимому, ниже функция присутствует в Excel 2007 и далее?)
-
похоже, что объект FullSeriesCollection упорядочивает элементы (разумно) от 1 до 13 по мере прохождения, но объект LegendEntries упорядочивает элементы в обратном порядке, от
13 К 1. -
объект LegendEntries начинает свой индекс с 0, поэтому его предметы на самом деле от 12 до 0.
-
В LegendEntries объект пере-числил его элементов по мере их удаления от нее.
Поэтому при удалении элемента 1 все элементы в списке нумеруются от 11 до 0. -
мне нужно обновлять график каждый раз, когда сводная таблица обновляется, чтобы повторно захватить все удаленные элементы легенды, которые теперь могут быть ненулевыми.
в свете этих осложнений, Я действительно изо всех сил пытался удалить конкретные элементы, которые мне нужно удалить из диаграммы.
как вы эффективно цикл через элементы сводной таблицы и удалить соответствующие серии LegendEntries, где элементы все-ноль?
1 ответов
начните с события Worksheet_PivotTableUpdate
лист, на котором находится сводная таблица нуждается в следующем коде, поэтому он вызывает новую функцию "RefreshAbsenceLabels" в модуле 1 всякий раз, когда это специально имени сводная таблица обновляется:
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
поговорите с правой диаграммой и обновите ее легенду
Public Function RefreshAbsenceLabels()
Set DaysAbsent = ActiveWorkbook.Worksheets("Dashboard").ChartObjects("Department Absences")
With DaysAbsent.Chart
If .HasLegend Then
.HasLegend = False
End If
.HasLegend = True
настройте счетчик и установите его на количество серий минус one
минус один, чтобы объяснить тот факт, что FullSeriesCollection пронумерован от 1 до X, в то время как элементы LegendEntries пронумерованы X-1 до 0
Dim x As Integer
x = .FullSeriesCollection.Count - 1
цикл через серию, удаляя соответствующие элементы LegendEntries
счетчик петель вниз к нулю. Преимущество обратной нумерации LegendEntries заключается в том, что вам не нужно смещать отсутствующие элементы каждый раз, когда вы удаляете вещи: любой перенумерованные пункты уже рассмотрены, и уже не имеет значения, сколько их.
приложение.WorksheetFunction.Макс находит наибольшее значение из серии
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
Другие вопросы charts microsoft-excel microsoft-excel-2013 pivot-chart vba