【问题标题】:Looping through a specific chart in Excel VBA to Change the Series colour循环遍历 Excel VBA 中的特定图表以更改系列颜色
【发布时间】:2019-11-14 16:13:22
【问题描述】:

一直在尝试通过 VBA 更改 Excel 中特定图表的系列颜色。我有更改所有图表的代码 - 这很方便,但并非所有图表都具有相同数量的系列。这是我到目前为止所拥有的。例如,如果我只想更改图表 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

【问题讨论】:

  • 我会使用一个辅助函数,为每个带有选择案例的系列返回一个 RGB 颜色数组。然后我会使用数组 ubound + 1 遍历系列,这将匹配系列的数量。
  • 您想遍历每个图表的所有SeriesCollection 对象以使您的代码更具可读性吗?我不太明白你想在这里完成什么。有时循环不是最佳选择,尤其是当您需要以不同方式修改每个条目时。
  • 感谢您的回复。基本上我有一张有 6 个图表的表格。其中 4 个有 5 个系列,其中 2 个有 3 个系列。我正在尝试将前 4 个更改为完全相同,而将后 2 个更改为完全相同。我正在考虑编写这个 VBA 来循环遍历所有图表并更改颜色,然后放置一个 IF 语句来更改最后 2 个图表的系列。那有意义吗?不确定我是否在这里很好地解释了自己,或者我的方法是否很好——在 VBA 和编程方面相当菜鸟。
  • 您注释掉的If 语句试图将Objects 与= 进行比较,这将失败。它应该是 If myChart Is Sheets("Sheet1").ChartObjects("Chart 4") Then(比较对象)或只是 If myChart.Name = "Chart 4" Then(比较变量)

标签: excel vba series


【解决方案1】:

这是一个简单的例子。

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

【讨论】:

  • 我想到了这个,但是OP的代码根据系列的数量有不同的RGB集,你如何调整?
  • @Damian 我没有看到 OP 的评论来澄清他的情况(显然我应该在发布之前刷新浏览器:))。我做了一个更新,只是为了展示一个稍微不同的看法。
  • 谢谢大家。彼得,我刚刚尝试了代码,效果很好)。
【解决方案2】:

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

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

【讨论】:

  • 哇,它有效!做的时候感觉像魔术哈哈。感谢您的时间/努力!
  • @apang 记得接受 Peter 或我的回答以结束话题
【解决方案3】:

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

为了使事情更简单,还定义一个Array 以包含您认为可能需要的尽可能多的颜色。 (谨慎起见——太多总比太少好——如果需要,可以考虑使用Mod“溢出”)

在这个例子中,我没有使用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

【讨论】:

  • 感谢 cmets 的付出和努力!快速浏览一下,我猜这并不能解释颜色根据系列数量而变化的事实?我尝试了上面的 Peter(和 Damians)代码,它解释了这一点
  • @apang 啊,不,它没有。它仅使用一组颜色,但适用于任意数量的系列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 2022-11-03
  • 1970-01-01
  • 2014-02-05
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多