循环遍历 Excel VBA 中的特定图表以更改系列颜色

Looping through a specific chart in Excel VBA to Change the Series colour

一段时间以来一直在尝试更改 Excel 到 VBA 中特定图表的系列颜色。我有更改所有图表的代码——这很方便,但并非所有图表都具有相同数量的系列。这是我到目前为止所拥有的。例如,如果我只想更改图表 4 的系列颜色。

Sub Serieschange()

    Dim myChart As ChartObject
    For Each myChart In Sheets("Sheet1").ChartObjects
         myChart.Chart.ChartType = xlXYScatterSmoothNoMarkers
         myChart.Chart.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(255, 0, 0)
         myChart.Chart.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(50, 656, 989)
         myChart.Chart.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(60, 2, 5)
         myChart.Chart.SeriesCollection(4).Format.Line.ForeColor.RGB = RGB(20, 900, 3)

         'TRY TO GET CODE TO LOOP FOR SPECIFIC CHARTS
         'If ChartObjects = ChartObjects("Chart 4") Then
         'myChart.Chart.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(3, 0, 0)
         'myChart.Chart.SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(2, 656, 989)
         'myChart.Chart.SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(1, 2, 5)
         'End If
    Next myChart

End Sub

这个就可以了,按需搭配:

Option Explicit
Sub Serieschange()

    Dim SeriesCounter As Long
    Dim myChart As ChartObject

    For Each myChart In Sheets("Sheet1").ChartObjects
        With myChart.Chart
            SeriesCounter = .SeriesCollection.Count
            .ChartType = xlXYScatterSmoothNoMarkers
            Select Case SeriesCounter
                Case 4
                    .SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(255, 0, 0)
                    .SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(50, 656, 989)
                    .SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(60, 2, 5)
                    .SeriesCollection(4).Format.Line.ForeColor.RGB = RGB(20, 900, 3)

                Case 3
                    .SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(3, 0, 0)
                    .SeriesCollection(2).Format.Line.ForeColor.RGB = RGB(2, 656, 989)
                    .SeriesCollection(3).Format.Line.ForeColor.RGB = RGB(1, 2, 5)
            End Select
        End With
    Next myChart

End Sub

这是一个简单的例子。

Option Explicit

Sub Serieschange()
    Dim series5RGB As Variant
    Dim series3RGB As Variant
    series5RGB = Array(RGB(255, 0, 0), _
                      RGB(50, 656, 989), _
                      RGB(60, 2, 5), _
                      RGB(20, 900, 3), _
                      RGB(100, 100, 100))
    series3RGB = Array(RGB(255, 255, 255), _
                      RGB(355, 355, 355), _
                      RGB(555, 555, 555))

    Dim i As Long
    Dim rgbSeries As Variant
    Dim myChart As ChartObject
    For Each myChart In Sheets("Sheet1").ChartObjects
        With myChart.Chart
            rgbSeries = IIf(.SeriesCollection.Count = 3, series3RGB, series5RGB)
            .ChartType = xlXYScatterSmoothNoMarkers
            For i = 1 To .SeriesCollection.Count
                .SeriesCollection(i).Format.Line.ForeColor.RGB = rgbSeries(i - 1)
            Next i
        End With
    Next myChart
End Sub

运行 第一个循环中的第二个循环,遍历 SeriesCollection 集合中的每个 Series

为了使事情变得更简单,还可以定义一个 Array 以包含您认为可能需要的尽可能多的颜色。 (谨慎行事 - 太多总比太少好 - 如果需要可以考虑使用 Mod 到 "overflow")

在这个例子中,我没有使用 For Each Series In Chart.SeriesCollection,而是使用整数循环来更容易地从数组中获取颜色

Sub Serieschange()
    Dim myChart As ChartObject, MaxColours As Long, CurrentSeries As Long, myColours As Variant
    'Create an Array of the possible colours
    myColours = Array(RGB(255, 0, 0), _
        RGB(50, 656, 989), _
        RGB(60, 2, 5), _
        RGB(20, 900, 3) _
        ) 'Add more colours as desired

    MaxColours = 1 + UBound(myColours) 'If we have more Series than Colours, we can start from the beginning again

    For Each myChart In ThisWorkbook.Worksheets("Sheet1").ChartObjects 'Loop through every Chart in the Sheet
        With myChart.Chart
            .ChartType = xlXYScatterSmoothNoMarkers

            If .SeriesCollection.Count > 0 Then 'Check we have any Series to colour first!
                For CurrentSeries = 1 To .SeriesCollection.Count 'Loop through every Series in the Chart
                    .SeriesCollection(CurrentSeries).Format.Line.ForeColor.RGB = myColours((CurrentSeries - 1) Mod MaxColours)
                Next CurrentSeries
            End If
        End With
    Next myChart

End Sub