从Chart系列获取主题颜色信息
我有一个图表系列使用一种颜色(可以是msoThemeColorAccent<#>
或任何其他)的标记线,另一种颜色的标记填充(它可以是一个msoThemeColorAccent<#>
,更轻x%或任何其他) ,没有线。 我想确定图表系列是否使用标记行的msoThemeColorAccent<#>
,标记填充的msoThemeColorAccent<#>
,更轻的x%,以及每种情况下使用哪种特定的重音颜色。
我试着返回一系列的属性,没有运气。 在一个Sub的执行过程中有一个引用sr
到一个图表系列(这是为了testing目的,设置有行,其颜色与标记行和标记填充相同,设置在Accent1),并在里面a With sr
build筑,我在直接窗口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