定制样式堆积柱形图

实例需求:数据位于D2:G9,使用默认方式创建的堆积柱形图如右下图表所示。现在需要对图表格式进行样式定制。

  • 工作表中A列为相应的数据类别,其可能的取值与数据表中第2行标题内容相同,也就是只有4中不同的值。
  • 现在需要将数据类别与标题相匹配的数据点标记为蓝色,其他数据点标记为紫色。
    例如:对于D列Light系列,A3和A7为Light,即D3和D7为相应的匹配数据,对于的数据点标记为蓝色(参见第一个堆积矩形)。

定制样式堆积柱形图_第1张图片

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行代码更新相应的数据点格式,填充蓝色。

你可能感兴趣的:(图表,Excel,VBA,图表,定制样式,自定义样式,柱图,堆积柱图)