从图表系列中获取主题颜色信息

时间:2013-10-16 05:19:03

标签: excel vba excel-vba charts format

我有一个图表系列,使用一种颜色(可以是msoThemeColorAccent<#>或任何其他颜色)作为标记线,另一种颜色作为标记填充(可以是msoThemeColorAccent<#>,更轻x%或任何其他),没有线。我想确定图表系列是否使用msoThemeColorAccent<#>作为标记线,msoThemeColorAccent<#>,更轻的x%,用于标记填充,如果是,则在每种情况下使用哪种特定的强调颜色。

我尝试返回系列的一些属性,没有运气。在执行对图表系列具有引用sr的Sub期间的断点处(为了测试目的,设置为具有线,其颜色与标记线和标记填充相同,设置为Accent1 ),在With sr结构中,我在即时窗口中进行了测试:

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

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

我发现的所有示例都使用msoThemeColorIndex来设置颜色,没有将其作为读取的值。

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

2 个答案:

答案 0 :(得分:2)

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

enter image description here

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

现在这里有趣的地方:

如果在创建图表后我改变了系列颜色(或者通过分配给相同的ThemeColors而保持不变),那么该函数会显示有效的RGB:

Line Colors   
Series1 : 5066944
Series2 : 12419407
Series3 : 5880731

就像Excel(和PowerPoint /等)在线图上完全无法识别自动指定的颜色一样。一旦指定了颜色,它就可以读取颜色。

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

这仅限于折线图吗?也许吧。我过去的经历说&#34;可能&#34;虽然我不能说这是一个错误,但它肯定是一个错误。

如果我在柱形图上运行类似的程序 - 再次仅使用自动分配的默认颜色

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+等......它不太可能随时解决,所以我们需要一个黑客解决方案:)

更新的解决方案

结合上述两种方法!将每个系列从行转换为xlColumnClustered,然后从.Fill查询color属性,然后将系列图表类型更改回其原始状态。这可能比尝试利用顺序索引更可靠(如果用户重新订购了系列,则根本不可靠,例如,&#34; Series1&#34;在索引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

信用:David Zemens

答案 1 :(得分:1)

这是DeerSpotter的解决方案之一。 但是,在将图表类型更改为某个临时ChartType,然后将其更改回原始ChartType之后。你正在失去一些格式。举个例子,你得到第二个轴,但并不总是需要它。

因此,当您的图表线颜色自动设置时,您不能简单地获得它的颜色索引。你会一直收到0或16777215 - 白色。 最好的解决方案就是在您尝试更改或获取图表线颜色之前,使用Line.Visible关闭然后继续执行此操作。在它之后,您可以简单地读取和选择您的线条颜色。

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