根据标签(x值)设置Excel图表的填充颜色

时间:2019-02-25 14:36:46

标签: excel vba

我正在基于以下数据(在左列中的标签,在右列中的值)下的数据在Excel 2010中制作几个饼图,并且我想确保每个部分的填充颜色与标签相对应的饼形图被绘制为特定颜色。两个警告:

(1)有很多图,所以我希望通过VBA或类似方法自动化此过程。

(2)每个图形中仅出现所有标签的子集,因此仅使用设置的调色板将不起作用。

(例如,如果我有标签A,B,C和D并且它们都显示在每个图表中,则可以按照此顺序设置Excel调色板。但是,在我的数据中,我们可能得到一个只包含A,B和D的图形,另一个包含B和C的图形-在这种情况下,默认情况下,Excel将在第二个图形中为B着色,就像在第一个图形中将A着色一样,默认情况下,这不是我想要的。)

我想到的第一个解决方案是建立一个看起来像这样的子例程(下面仅是伪代码):

For each worksheet in workbook.sheets
    For each chart in worksheet.charts
        Get list of xvalues(labels)
        Map labels to fill colors(this mapping could be in an Excel matrix)
        Change fill colors based on list of fill colors generated above

关于如何最好地实现这一点的任何想法?

data example

1 个答案:

答案 0 :(得分:0)

这可能会有所帮助。

Sub FormatPieChart()
    Dim ws As Worksheet, cht As Chart, srs As Series, p As Integer

    For Each ws In Worksheets
        If ws.Name <> "ColorMap" Then

            For i = 1 To ws.ChartObjects.Count

                Set cht = ws.ChartObjects(i).Chart

                If cht.ChartType = xlPie Then

                    Set srs = cht.SeriesCollection(1)

                    For p = 1 To srs.Points.Count
                        srs.Points(p).Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent & MapColor(srs.XValues(p))
                    Next p

                End If

            Next i

        End If
    Next ws
End Sub

Function MapColor(xval As Variant) As Integer
    MapColor = WorksheetFunction.VLookup(xval, Worksheets("ColorMap").Range("A1:B5"), 2, False)
End Function

注释

  1. 在另一页ColorMap上,我有一个标签和颜色值列表(A1:B5)
  2. 据我所知,填充颜色是使用msoThemeColorAccent设置的。
  3. 只有这么多允许的值。您可以看到list 这里。在B列中设置的颜色值必须匹配以下颜色之一 有效的msoThemeColorAccent值。