所以这很有趣。我使用所有默认值创建折线图,然后运行以下过程:
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
但显然情况并非如此。很明显,它们都是不同的颜色。如果,而不是.RGB
我做.ObjectThemeColor
,那么我得到了 all 0
,通过观察图表,这同样明显是错误的!
Line Colors
Series1 : 0
Series2 : 0
Series3 : 0
现在这里是有趣的地方:
如果在创建图表后我更改了系列颜色(甚至通过分配相同的 ThemeColors 使它们保持不变),则该函数显示有效的 RGB:
Line Colors
Series1 : 5066944
Series2 : 12419407
Series3 : 5880731
就好像 Excel(和 PowerPoint/等)完全无法识别折线图上自动分配的颜色。一旦分配了颜色,它就可以读取颜色。
注意:折线图很挑剔,因为你没有 a .Fill
,而是 a .Format.Line.ForeColor
(and .BackColor
) 和 IIRC 还有一些其他的怪癖,比如你可以选择一个单独的点并改变它的填充颜色,然后这会影响视觉前线段的外观等...
这仅限于折线图吗?也许。我过去的经验说“可能”,虽然我不能说这是一个错误,但它确实似乎是一个错误。
如果我在柱形图上运行类似的程序——再次仅使用自动分配的默认颜色,
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
自动分配颜色格式的属性。
正如蒂姆威廉姆斯所证实的那样,这是一个早在 2005 年就存在的错误,至少与 RGB 相关,并且可能该错误通过 ObjectThemeColor 等延续到 Excel 2007+ 中......不太可能得到任何解决时间很快,所以我们需要一个黑客解决方案:)
更新的解决方案
结合以上两种方法!将每个系列从 line 转换为 xlColumnClustered,然后从 .Fill 中查询 color 属性,然后将系列图表类型更改回其原始状态。这可能比尝试利用顺序索引更可靠(如果用户重新排序了系列,则根本不可靠,例如,“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
信用:大卫泽门斯