更改图表上系列的填充颜色

Gil*_*ker 2 excel charts vba colors

我有两种类型的图表,它们将通过 BI 工具填充到 Excel 中。我需要根据一些规则为它们中的可用系列着色。

第一个图表逐年节目支出(今年是系列),并有不同程度的历史,从数个月,最长24个月。这意味着我的数据为24个月延展到2015年,2016年,2017年。明年我保持滚动24个月这种变化,到2016年,2017年,2018。

无论数据集是什么,我都需要条形图数据中的最近一年(例如 2017 年)以蓝色显示,前一年(例如 2016 年)以橙色显示,然后前一年(例如 2015 年)以灰色显示。

我可能没有 24 个月(例如新客户)。如果只有六个月,则应用相同的着色逻辑,并且最近的一年需要显示为蓝色。

支出图表

所述第二图表显示系列的值基于性能。这些系列被称为“准时”、“容忍”和“迟到”。

它们的颜色必须是:“准时”= 中绿色,“在容限内”= 浅绿色,“迟到”= 红色。

这些系列的1 个2 个全部 3 个可能出现在给定的图表中,而没有可预测性。我需要 VBA 来确定可用的系列和相应的颜色。

业绩图表

我从其他提要中拼凑了代码,并不是构建的基础。我想我需要使用 ForEach 类型语法,因为我知道我需要遍历每个 SeriesCollection 对象。

Jon*_*ier 5

对于您的第一个问题,这是一个简单的小程序,将图表中的系列重新着色为蓝色、橙色和灰色,但反转默认顺序:

Sub ReverseDefaultColors()
  Dim iSrs As Long, nsrs As Long

  If ActiveChart Is Nothing Then
    MsgBox "Select a chart and try again.", vbExclamation, "No Active Chart"
  Else
    With ActiveChart
      nsrs = .SeriesCollection.Count
      ' work backwards from last series
      For iSrs = nsrs To 1 Step -1
        Select Case nsrs - iSrs
          Case 0 ' last series
            .SeriesCollection(iSrs).Format.Fill.ForeColor.ObjectThemeColor = _
                msoThemeColorAccent1
          Case 1 ' next to last series
            .SeriesCollection(iSrs).Format.Fill.ForeColor.ObjectThemeColor = _
                msoThemeColorAccent2
          Case 2 ' etc.
            .SeriesCollection(iSrs).Format.Fill.ForeColor.ObjectThemeColor = _
                msoThemeColorAccent3
        End Select
      Next
    End With
  End If
End Sub
Run Code Online (Sandbox Code Playgroud)

这是您的第二个问题的另一个问题,根据系列名称为绿色、浅绿色和红色着色(根据需要调整 RGB)。您应该注意到有些人(大约 8% 的男性,不到 1% 的女性)可能难以区分绿色和红色。出于这个原因,蓝色和橙色通常被用作首选配色方案。

Sub ColorGreenToRed()
  Dim iSrs As Long, nSrs As Long
  If ActiveChart Is Nothing Then
    MsgBox "Select a chart and try again.", vbExclamation, "No Active Chart"
  Else
    With ActiveChart
      nSrs = .SeriesCollection.Count
      For iSrs = 1 To nSrs
        ' only format series whose names are found
        Select Case LCase$(.SeriesCollection(iSrs).Name)
          Case "on time"
            .SeriesCollection(iSrs).Format.Fill.ForeColor.RGB = _
                RGB(0, 176, 80) ' Green
          Case "in tolerance"
            .SeriesCollection(iSrs).Format.Fill.ForeColor.RGB = _
                RGB(146, 208, 80) ' Light Green
          Case "late"
            .SeriesCollection(iSrs).Format.Fill.ForeColor.RGB = _
                RGB(255, 0, 0) ' Red
        End Select
      Next
    End With
  End If
End Sub
Run Code Online (Sandbox Code Playgroud)