Как отформатировать диаграмму Sunburst в VBA?

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

введите здесь описание изображения

Данные, на которых строятся диаграммы, указываются на другом листе, поэтому я форматирую диаграмму после активации листа диаграммы.

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    'Only when correct sheet is opened
    If Not Sh.Name = "Radar Chart" Then Exit Sub

    'Do things to find out which data point number is at the core of each column -> coloring this point colors the whole column
    ...

    'Color the sunburst
    Dim chtObj As ChartObject, pts As Points
    Set chtObj = Sh.ChartObjects(1)
    With chtObj.Chart

    '    .ClearToMatchColorStyle -> Runtime error
    '    .ClearToMatchStyle -> Runtime error
    '    .ChartArea.ClearFormats -> Runtime error

        Set pts = .SeriesCollection(1).Points
    End With

    'pts(1).ApplyDataLabels (xlDataLabelsShowNone) -> Runtime error
    'pts(2).ClearFormats -> Runtime error

    For i = LBound(arrData, 1) To UBound(arrData, 1)

        'arrPairings contains the number of points in column i
        'arrZuordnungErsterPoint contains information on which point column i starts
        Select Case arrpairings(i, 2)
            Case "5":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(68, 154, 54) 'dunkelgrün
            Case "4":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(111, 200, 96) 'hellgrün
            Case "3":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(255, 255, 0) 'gelb
            Case "2":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(255, 127, 80) 'orange
            Case "1":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(255, 0, 0) 'rot
        End Select

        pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.Solid
        chtObj.Chart.Refresh 'useless
    Next i

    End Sub

Теперь моя проблема: Все работает как часы, но только когда я вручную сбрасываю настройки диаграммы до ее шаблонных настроек. В противном случае он обновит высоту столбца (как это делает сама диаграмма), но не изменит цвет. Выглядит так:

введите здесь описание изображения

Как я могу сбросить диаграмму до ее шаблона (например, когда вы щелкаете правой кнопкой мыши и делаете это вручную)? Все, что я пробовал, приводит к ошибке времени выполнения «не поддерживает это».

Есть ли какое-либо другое более многообещающее событие, которое я мог бы использовать? Может быть, диаграмма обновляется только после запуска события SheetActive? Я попробовал это, нажав кнопку на самом листе, но никаких улучшений.

Меня действительно смущает поведение такого рода диаграмм. Запись макросов практически бесполезна. Я также нашел очень мало документации по солнечным лучам, так что вы моя последняя надежда. Любая помощь приветствуется!


person cr44sh    schedule 12.03.2020    source источник


Ответы (1)


Довольно случайно нашел решение.

По причинам, которые ускользают от меня, команда pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.Solid блокирует корректное изменение цвета VBA. Использование шаблона вместо .Solidделает работу.

    For i = LBound(arrData, 1) To UBound(arrData, 1)
        pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.Patterned msoPattern5Percent

        Select Case arrpairings(i, 2)
            Case "5":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(68, 154, 54) 'dunkelgrün
            Case "4":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(111, 200, 96) 'hellgrün
            Case "3":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(255, 255, 0) 'gelb
            Case "2":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(255, 127, 80) 'orange
            Case "1":
                pts(arrZuordnungNameErsterPoint(i, 2)).Format.Fill.BackColor.RGB = RGB(255, 0, 0) 'rot
        End Select

    Next i
person cr44sh    schedule 12.03.2020