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

5
我有一个图表系列,使用一种颜色(可以是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,或者在目标情况下没有线条、不同标记填充与标记线条的重点颜色。


你能发更多的代码吗?具体来说,我想看看你是如何设置这些属性的,因为你说“[图表系列对象] sr...被设置为具有线条,其颜色与标记线和标记填充的颜色相同,设置为Accent1”。如果可以的话,你能否链接到任何使用msoThemeColorIndex设置颜色的示例? - CBRF23
2个回答

2

这很有趣。我使用默认设置创建了一条折线图,然后运行了这个过程:

在此输入图片描述

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 / etc.)完全无法识别线图上自动分配的颜色。如果您分配了颜色,则可能能够读取该颜色。

注意:线状图比较挑剔,因为您没有.Fill,但只有.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,并且可能将该错误延续到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

credit: David Zemens


1
这是DeerSpotter的一个解决方案。 但是,当您将图表类型更改为某个临时ChartType,然后将其改回原始类型时,会丢失一些格式。例如,您会在它之后得到第二个轴,这并不总是需要的。
因此,当您的图表线颜色自动设置时,您不能简单地获取其颜色索引。您将始终收到0或16777215-白色。 最好的解决方案是,在尝试更改或获取图表线颜色之前,使用Line.Visible关闭再打开进行小技巧。之后,您可以轻松读取和更改线条颜色。
ppSeries.Format.Line.Visible = msoFalse 
ppSeries.Format.Line.Visible = msoTrue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接