Как программно изменить цвет линии для ряда на диаграмме в Excel 2007

У меня есть диаграмма с серией, которая обозначает большой набор (1000) дискретных измерений. Некоторые из них являются неправильными измерениями, и я хочу раскрасить линию для ряда на основе другого набора данных, который описывает, насколько точны измерения. Плохие измерения должны быть красными, а хорошие — зелеными, а между ними должен быть какой-то градиент от красного к желтому и зеленому.

Это должно быть запрограммировано с помощью VBA, но я понятия не имею, что делать. Может ли кто-нибудь дать мне несколько советов?


person geometrikal    schedule 14.11.2008    source источник


Ответы (2)


Раскрасить линию диаграммы в VBA достаточно просто. Вот несколько заметок.

Dim cht  As Chart
Dim sc As Series
Dim blnBad As Boolean
Dim j

j = 85 'RGB orange '
blnBad = False

'This is a chart called Chart 1, it would be possible '
'to use the charts collection '
Set cht = ActiveSheet.ChartObjects("Chart 1").Chart
'A chart is composed of series of data ... '
For Each sc In cht.SeriesCollection
    ' ... that you can iterate through to pick up '
    ' the individual data values, or a data range. '
    ' Values in this case. '
    For i = LBound(sc.Values) To UBound(sc.Values)
        ' That can be checked against another set of '
        ' values in the range Bad. '
        With ActiveSheet.Range("Bad")
            ' So, look for the value ... '
            Set c = .Find(sc.Values(i), lookat:=xlWhole, LookIn:=xlValues)
            ' and if it is found ... '
            If Not c Is Nothing Then
                ' ... then set the Bad flag '
                blnBad = True
            End If
        End With
    Next
    ' So, this range contains a Bad value '
    ' and we will colour it red ... '
    If blnBad Then
        sc.Border.Color = RGB(255, 0, 0)
        ' ... not forgetting the markers '
        sc.MarkerForegroundColor = RGB(255, 0, 0)
    Else
        ' Otherwise, use an increasingly yellow colour '
        sc.Border.Color = RGB(255, j, 0)
        sc.MarkerForegroundColor = RGB(255, j, 0)

        j = j + 30 ' getting more yellow
        ' Debug.Print j ' uncomment to see j in the immediate window '
    End If
    blnBad = False
Next
End Sub
person Fionnuala    schedule 14.11.2008
comment
Спасибо, не могли бы вы дать очень краткое описание того, что это делает? Что должно быть в диапазоне «Плохо»? - person geometrikal; 15.11.2008
comment
Диапазон Bad в образце содержал список значений, которые можно сопоставить с каждым значением в серии. Возможно, у вас другая настройка, но у меня нет достаточной информации. - person Fionnuala; 15.11.2008
comment
Спасибо за описание. Настройка, к которой я стремлюсь, немного отличается - я хочу построить один диапазон, назовем его «rangeValues», но я хочу, чтобы цвет линии менялся со значением в другом диапазоне «rangeError». По сути, это разноцветная серия. :) - person geometrikal; 16.11.2008

Вы заблокированы в VBA? Один из способов сделать это — открыть архив документов OOXML .xlsx (на самом деле это Zip-архив). Затем у вас есть свободный доступ к XML-данным, из которых состоит сам документ. Это можно запустить через таблицу стилей XSL или любой другой сценарий по вашему выбору, а затем повторно заархивировать.

person Elijah    schedule 14.11.2008
comment
Спасибо, я этого не осознавал. Я это проверю. - person geometrikal; 14.11.2008