实例需求:数据位于D2:G9,使用默认方式创建的堆积柱形图如右下图表所示。现在需要对图表格式进行样式定制。
Sub Demo()
Dim oSer As Series, rngHeader As Range, rngData As Range
Dim i As Long, j As Long, aFormula, aRef
Const COL_OFFSET = -3
ActiveSheet.ChartObjects(1).Select
For i = 1 To ActiveChart.FullSeriesCollection.Count
Set oSer = ActiveChart.FullSeriesCollection(i)
With oSer.Format.Fill
.Visible = msoTrue
.ForeColor.RGB = RGB(160, 43, 147)
.Transparency = 0
.Solid
End With
aFormula = Split(oSer.Formula, ",")
aRef = Split(aFormula(1), "!")
Set rngHeader = Sheets(aRef(0)).Range(aRef(1))
aRef = Split(aFormula(2), "!")
Set rngData = Sheets(aRef(0)).Range(aRef(1))
For j = 1 To rngHeader.Cells.Count
If rngData.Cells(1).Offset(0, COL_OFFSET) = rngHeader(j) Then
With oSer.Points(j).Format.Fill
.ForeColor.RGB = RGB(0, 0, 255)
End With
End If
Next
Next
End Sub
【代码解析】
第5行代码选中活动工作表中的第一个图表对象。
第6~26行代码循环处理图表中的每个系列(Series)。
第7行代码获取第i个系列的对象引用。
第8~13行代码设置指定系列的格式。
第9行代码设置系列可见。
第10~12行代码设置非透明紫色填充。
第14行代码将系统公式拆分,使用逗号作为分隔符。
例如:如果指定系列公式为=SERIES(,Sheet1!$D$2:$G$2,Sheet1!$D$9:$G$9,7)
,拆分所得数组包含4个字符串,该数组的下标下届为零,aFormula(1)
为数组中的第2个元素,即Sheet1!$D$2:$G$2
,是该系列数据标题所在单元格区域。
第15~16行代码使用类似方法解析公式,获取数据标题的Range对象。
第17~18行代码获取数据点的Range对象。
第19~26行代码循环处理该系列的每个数据点。
第20行代码判断A列数据与数据标题是否一致。
如果二者相同,第21~23行代码更新相应的数据点格式,填充蓝色。