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

时间:2017-10-04 23:26:32

标签: vba charts colors series

新手VBA用户在这里。希望有人能帮忙吗?我认为这可能很简单,但我是一个noobie。

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

第一张图表显示按年度划分的支出(年份是系列),并且从几个月到24个月有不同程度的历史记录。这意味着我现在的24个月的数据分布在 2015年,2016年,2017年.......明年这将变为2016年,2017年,2018年,因为我我只保持24个月的滚动。

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

我可能不会总是有24个月(即全新的客户),所以如果只有6个月,则应用相同的着色逻辑,并且最近一年需要以蓝色显示。

Expenditure Chart

我认为第二张图更简单。我的图表显示了基于性能的系列值 - 这些系列被称为“准时”,“容忍”和“迟到”。

他们的颜色需要:'准时'=中绿......'宽容'=浅绿色.......'晚'=红色。

这里的内容是1 2 这些系列中的所有3个可能都存在于给定的图表中而没有可预测性,所以我需要VBA来确定哪个系列可用,然后相应地着色。

Performance Chart

我一直在玩代码,但它只是我从其他提要拼凑而成的东西,并且不以任何方式构建。我想我需要使用ForEach类型语法,因为我知道我需要有一个循环来处理每个SeriesCollection对象。

如果有人可以提供帮助,我会非常感激。

1 个答案:

答案 0 :(得分:2)

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

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

这是您的第二个问题的另一个问题,根据系列名称着色绿色,浅绿色和红色(根据需要调整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