Excel 2013-удаление объектов LegendEntry из легенды сводной диаграммы с помощью VBA

У меня есть сводная диаграмма, которая обычно показывает 6-8 серий из возможных 15, многие из которых, как правило, равны нулю. Таким образом, каждый раз, когда он обновляется, у него есть 15 серий, и легенда должна только перечислить серию с ненулевыми цифрами, чтобы диаграмма была лаконичной и легкой для чтения.

Я пытаюсь использовать VBA для удаления конкретных элементов, где серия все ноль (максимальное значение = 0), и возникло больше проблем, чем ожидалось:

  1. Я перебираем каждый элемент из графика FullSeriesCollection, проходя вперед по списку серий один за другим. Однако, поскольку легенда является отдельным объектом из серии,вы не можете использовать текущую серию из моего цикла, чтобы обратиться к нему, и поэтому требуется счетчик цикла.

  2. нет способа узнать имя/значение элемента LegendEntries, так что вы должны соответствовать серии с легендой, не будучи в состоянии подтвердить что LegendEntries элемент, который.

(по-видимому, ниже функция присутствует в Excel 2007 и далее?)

  1. похоже, что объект FullSeriesCollection упорядочивает элементы (разумно) от 1 до 13 по мере прохождения, но объект LegendEntries упорядочивает элементы в обратном порядке, от 13 К 1.

  2. объект LegendEntries начинает свой индекс с 0, поэтому его предметы на самом деле от 12 до 0.

  3. В LegendEntries объект пере-числил его элементов по мере их удаления от нее.
    Поэтому при удалении элемента 1 все элементы в списке нумеруются от 11 до 0.

  4. мне нужно обновлять график каждый раз, когда сводная таблица обновляется, чтобы повторно захватить все удаленные элементы легенды, которые теперь могут быть ненулевыми.

в свете этих осложнений, Я действительно изо всех сил пытался удалить конкретные элементы, которые мне нужно удалить из диаграммы.

как вы эффективно цикл через элементы сводной таблицы и удалить соответствующие серии LegendEntries, где элементы все-ноль?

8
задан Steve Taylor
02.05.2023 12:16 Количество просмотров материала 3133
Распечатать страницу

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
0
отвечен Steve Taylor 2023-05-03 20:04

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх