从Chart系列获取主题颜色信息

我有一个图表系列使用一种颜色(可以是msoThemeColorAccent<#>或任何其他)的标记线,另一种颜色的标记填充(它可以是一个msoThemeColorAccent<#> ,更轻x%或任何其他) ,没有线。 我想确定图表系列是否使用标记行的msoThemeColorAccent<#> ,标记填充的msoThemeColorAccent<#> ,更轻的x%,以及每种情况下使用哪种特定的重音颜色。

我试着返回一系列的属性,没有运气。 在一个Sub的执行过程中有一个引用sr到一个图表系列(这是为了testing目的,设置有行,其颜色与标记行和标记填充相同,设置在Accent1),并在里面a With srbuild筑,我在直接窗口testing了:

 ? .Format.Line.BackColor.ObjectThemeColor, .Format.Line.ForeColor.ObjectThemeColor 0 0 ? .Format.Fill.BackColor.ObjectThemeColor, .Format.Fill.ForeColor.ObjectThemeColor 0 -2 

我期望以某种方式获得msoThemeColorAccent1 (= 5)的值,该值在我的系列中使用。 有没有办法做到这一点?

我find的所有例子都使用了msoThemeColorIndex来设置一个颜色,而不是一个被读取的值。

PS:在这第一部分我没有成功,一个系列的颜色统一。 我预见到,如果我克服了这个障碍,在检测正确的TintAndShade ,甚至在没有线条,不同的标记填充vs.标记线的目标情况下甚至可能会遇到问题。

所以这很有趣。 我使用所有默认值创build折线图,然后运行以下过程:

在这里输入图像说明

 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 ,那么我得到所有0 ,这是平等的,明显是虚假的观察图表!

 Line Colors Series1 : 0 Series2 : 0 Series3 : 0 

现在,这里是它变得有趣的地方:

如果在创build图表后,我更改了系列颜色(甚至通过分配相同的ThemeColors使其保持不变),那么该函数将显示有效的RGB:

 Line Colors Series1 : 5066944 Series2 : 12419407 Series3 : 5880731 

就好像Excel(和PowerPoint /等)完全无法识别折线图上的自动分配的颜色。 一旦你分配一个颜色,那么它可能会读取颜色。

注意:折线图是挑剔的,因为你没有.Fill ,而是.Format.Line.ForeColor (和.BackColor )和IIRC,还有一些其他的怪癖,就像你可以select一个单独的点并改变它是填充颜色,然后影响前面的线段的视觉外观等…

这是限于线图吗? 也许。 我过去的经验说“可能”,虽然我不能说这是一个错误,但它肯定是一个错误。

如果我在柱形图上运行一个类似的程序 – 再次只使用自动分配的默认颜色,

 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年就已经存在的bug了,至less与RGB有关,并且可能这个bug与ObjectThemeColor一起被传送到了Excel 2007+等等。它不可能被解决时间很快,所以我们需要一个解决scheme:)

更新的解决scheme

结合以上两种方法! 将每个系列从行转换为xlColumnClustered,然后从.Fill中查询颜色属性,然后将系列图表types更改回其原始状态。 这可能比试图利用顺序索引更可靠(如果用户已经重新排列了系列,那么这将是不可靠的,例如,使得“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 

信用: 大卫Zemens

这是解决scheme之一DeerSpotter。 但是,当您将图表types更改为某个临时ChartType,然后将其更改回原始。 你正在失去一些格式。 举个例子,你得到第二个轴之后,什么都不需要。

所以,当你的图表线颜色自动设置,你不能简单地得到它的颜色指数。 您将永远收到0或16777215 – 白色。 最好的解决scheme就是在你尝试改变或者获得你的图表线条颜色之前,先用Line.Visible tur off来做这个小动作,然后再打开。 之后,你可以简单地阅读和chnage你的线条颜色。

 ppSeries.Format.Line.Visible = msoFalse ppSeries.Format.Line.Visible = msoTrue