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 对象。
对于您的第一个问题,这是一个简单的小程序,将图表中的系列重新着色为蓝色、橙色和灰色,但反转默认顺序:
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)