很有趣。我使用所有默认值创建了一条折线图,然后运行了这个过程:
![enter image description here](https://istack.dev59.com/I59Ie.webp)
Sub getLineCOlors()
Dim cht As Chart
Dim srs As Series
Dim colors As String
Dim pt As Point
Set cht = ActiveSheet.ChartObjects(1).Chart
For Each srs In cht.SeriesCollection
With srs.Format.Line
colors = colors & vbCrLf & srs.Name & " : " & _
.ForeColor.RGB
End With
Next
Debug.Print "Line Colors", colors
End Sub
即时窗口随即显示:
Line Colors
Series1 : 16777215
Series2 : 16777215
Series3 : 16777215
但实际上情况并非如此。很明显它们都是不同的颜色。如果我使用.ObjectThemeColor
而不是.RGB
,那么我会得到全部为0
的结果,这显然是错误的,通过观察图表可以证明!
Line Colors
Series1 : 0
Series2 : 0
Series3 : 0
现在,有趣的事情来了:
如果我在创建图表后更改系列颜色(甚至通过分配相同的ThemeColors保持不变),那么该函数会显示有效的RGB值。
Line Colors
Series1 : 5066944
Series2 : 12419407
Series3 : 5880731
似乎Excel(和PowerPoint/等)完全无法识别线图上自动分配的颜色。只有当您分配了颜色,它才能读取该颜色。
注意:线图非常挑剔,因为您没有填充,而是一个.Format.Line.ForeColor(和.BackColor),并且我IRC还有其他一些怪癖,比如您可以选择单个点并更改其填充颜色,然后这会影响前面线段的视觉外观等等...
这是否仅限于线图?也许吧。我的过去经验说“可能”,尽管我不能说这是一个错误,但它确实看起来像一个错误。
如果我在柱状图上运行类似的过程-再次仅使用自动分配的默认颜色,...
Sub getCOlumnColors()
Dim cht As Chart
Dim srs As Series
Dim colors As String
Dim pt As Point
Set cht = ActiveSheet.ChartObjects(2).Chart
For Each srs In cht.SeriesCollection
With srs.Format.Fill
colors = colors & vbCrLf & srs.Name & " : " & _
.ForeColor.RGB
End With
Next
Debug.Print "Column Colors", colors
End Sub
然后我得到了似乎是有效的RGB值:
Column Colors
Series1 : 12419407
Series2 : 5066944
Series3 : 5880731
然而:它仍然不能识别一个有效的ObjectThemeColor
。如果我更改.RGB
,那么输出结果如下:
Column Colors
Series1 : 0
Series2 : 0
Series3 : 0
基于这些观察结果,无法访问自动分配的颜色格式的
ObjectThemeColor
和/或
.RGB
属性显然存在一些问题。
正如Tim Williams所证实的那样,至少从2005年开始,与RGB相关的问题就是一个bug,而且很可能在Excel 2007+中也存在ObjectThemeColor等问题。不太可能很快解决,因此我们需要一个hack方案 :)
更新的解决方案:
将上述两种方法结合起来!将每个系列从线性转换为
xlColumnClustered
,然后从
.Fill
查询颜色属性,最后将系列图表类型更改回其原始状态。这可能比尝试利用顺序索引更可靠(如果用户重新排序系列,例如"Series1"位于索引3等,则顺序索引将根本不可靠)。
Sub getLineColors()
Dim cht As Chart
Dim chtType As Long
Dim srs As Series
Dim colors As String
Set cht = ActiveSheet.ChartObjects(1).Chart
For Each srs In cht.SeriesCollection
chtType = srs.ChartType
'Temporarily turn this in to a column chart:
srs.ChartType = 51
colors = colors & vbCrLf & srs.Name & " : " & _
srs.Format.Fill.ForeColor.RGB
'reset the chart type to its original state:
srs.ChartType = chtType
Next
Debug.Print "Line Colors", colors
End Sub
srs.Format.Line.ForeColor.ObjectThemeColor = msoThemeColorAccent2
,然后尝试查询?srs.Format.Line.ForeColor.ObjectThemeColor
,结果为0
(应该是6)。无论使用什么颜色,我都得到零。 - David Zemens