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

问题描述:

新手VBA用户在这里。希望有人能帮忙?我认为这可能很简单,但我是一个noobie。更改VBA代码填充系列图的颜色

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

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

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

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

Expenditure Chart

第二个图表更简单,我认为。我所显示的图表显示了基于表现的系列值 - 这些系列被称为“准时”,“宽容”和“后期”。

他们的颜色需要:“准时”=中等绿色......“宽容”=浅绿色......“迟到”=红色。

的这里的是,1 或或所有3这些系列的可以存在没有预测给定的图表中,所以我需要的VBA,以确定哪些系列是可用的,然后颜色相应。

Performance Chart

我一直在玩的代码,但它只是我从其它饲料拼凑起来的,并且不以任何方式从建基地。我想我需要使用ForEach类型的语法,因为我知道我需要在每个SeriesCollection对象中都有一个循环。

如果有人能帮忙,我会很感激。

+0

如果您添加了一些示例数据和典型情节的截图,这会增加获得帮助的几率。 –

+0

感谢您的建议 - 我添加了一些图片,显示我需要的内容以及目前正在链接的枢纽。 –

+0

看着图表,它看起来不像你需要VBA。列总是保持相同的颜色。只需修改每个图表的样式以符合要求即可。 – jsotola

这里是你的第一个问题,一个简单的小程序,在您的图表蓝色,橙色重新着色的系列,和灰色,但反向的默认顺序:

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