新手VBA用户在这里。希望有人能帮忙吗?我认为这可能很简单,但我是一个noobie。
我有两种类型的图表,将由BI工具填充到Excel中,我需要根据一些规则为其中的可用系列着色。
第一张图表显示按年度划分的支出(年份是系列),并且从几个月到24个月有不同程度的历史记录。这意味着我现在的24个月的数据分布在 年 2015年,2016年,2017年.......明年这将变为2016年,2017年,2018年,因为我我只保持24个月的滚动。
无论数据集是什么,我需要最近一年(例如2017年)的条形图数据以蓝色显示,前一年(例如2016年)以橙色显示,然后是前一年(例如2015年)灰色。
我可能不会总是有24个月(即全新的客户),所以如果只有6个月,则应用相同的着色逻辑,并且最近一年需要以蓝色显示。
我认为第二张图更简单。我的图表显示了基于性能的系列值 - 这些系列被称为“准时”,“容忍”和“迟到”。
他们的颜色需要:'准时'=中绿......'宽容'=浅绿色.......'晚'=红色。
这里的内容是1 或 2 或这些系列中的所有3个可能都存在于给定的图表中而没有可预测性,所以我需要VBA来确定哪个系列可用,然后相应地着色。
我一直在玩代码,但它只是我从其他提要拼凑而成的东西,并且不以任何方式构建。我想我需要使用ForEach类型语法,因为我知道我需要有一个循环来处理每个SeriesCollection对象。
如果有人可以提供帮助,我会非常感激。
答案 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