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

Vba 从图表系列中获取主题颜色信息,vba,excel,charts,format,Vba,Excel,Charts,Format,我有一个图表系列,使用一种颜色(可以是msoThemeColorAccent或任何其他颜色)作为标记线,使用另一种颜色作为标记填充(可以是msoThemeColorAccent、更亮的x%或任何其他颜色),并且没有线。我想确定图表系列是否对标记线使用了MSOthereColorAccent,对标记填充使用了MSOthereColorAccent、较浅的x%,如果是,在每种情况下使用哪种特定的强调色 我试图返回一系列的一些属性,但没有成功。在执行对图表系列(出于测试目的,设置为具有线条,其颜色与标

我有一个图表系列,使用一种颜色(可以是
msoThemeColorAccent
或任何其他颜色)作为标记线,使用另一种颜色作为标记填充(可以是
msoThemeColorAccent
、更亮的x%或任何其他颜色),并且没有线。我想确定图表系列是否对标记线使用了
MSOthereColorAccent
,对标记填充使用了
MSOthereColorAccent
、较浅的x%,如果是,在每种情况下使用哪种特定的强调色

我试图返回一系列的一些属性,但没有成功。在执行对图表系列(出于测试目的,设置为具有线条,其颜色与标记线和标记填充相同,设置为Accent1)具有参考<代码>sr结构的Sub期间的断点处,以及在具有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
,甚至在没有线条、不同的标记填充与标记线条的情况下检测重音颜色。

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

立即窗口随后显示:

Line Colors   
Series1 : 16777215
Series2 : 16777215
Series3 : 16777215
但情况显然并非如此。很明显,它们都是不同的颜色。如果我不选择
.RGB
而选择
.ObjectThemeColor
,那么我会得到所有
0
,通过观察图表,这同样是错误的

Line Colors   
Series1 : 0
Series2 : 0
Series3 : 0
现在这里是有趣的地方:

如果在创建图表后,我更改了系列颜色(甚至通过指定相同的颜色使其保持不变),则函数将显示有效的RGB:

Line Colors   
Series1 : 5066944
Series2 : 12419407
Series3 : 5880731
这就好像Excel(和PowerPoint/等)完全无法识别自动分配的颜色、在线图表。一旦指定了颜色,它就可以读取颜色

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

这仅限于折线图吗?也许。我过去的经验是“可能”,虽然我不能说这是一个bug,但它似乎确实是一个bug

如果我在柱状图上运行类似的过程——同样只使用自动指定的默认颜色

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
但是:它仍然无法识别有效的
对象ThemeColor
。如果我更改
.RGB
,则输出:

Column Colors 
Series1 : 0
Series2 : 0
Series3 : 0
因此,根据这些观察结果,肯定无法访问自动指定颜色格式的
对象ThemeColor
和/或
.RGB
属性

正如Tim Williams所证实的,这是一个早在2005年就存在的bug,至少与RGB有关,而且可能是该bug通过对象ThemeColor等带入Excel 2007+。。。这不太可能很快得到解决,因此我们需要一个黑客解决方案:)

更新的解决方案

结合以上两种方法!将每个系列从line转换为xlColumnClustered,然后从.Fill查询颜色属性,然后将系列图表类型更改回其原始状态。这可能比尝试利用顺序索引更可靠(如果用户重新排序了序列,例如“Series1”位于索引3等,则顺序索引根本不可靠)


信用证:

这是DeerSpotter的解决方案之一。 但当你将图表类型更改为某个临时图表类型,然后再将其更改回原始图表类型之后。您正在丢失一些格式。例如,在它后面有第二个轴,这并不总是需要的

所以,当您的图表线颜色自动设置时,您不能简单地得到它的颜色索引。您将始终收到0或16777215-白色。 最好的解决办法是,在你试图改变或得到你的图表线条颜色之前,先用线条做这个小把戏。可见的tur关闭,然后trun打开。之后,你可以简单地阅读和改变你的线条颜色

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

你能发布更多的代码吗?具体来说,我想看看您是如何设置这些属性的,因为您说过“[图表系列对象]
sr
…被设置为具有线条,其颜色与标记线和标记填充相同,设置为Accent1”。和/或如果您可以通过
msoThemeColorIndex
设置颜色链接到您提到的任何示例。
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
ppSeries.Format.Line.Visible = msoFalse 
ppSeries.Format.Line.Visible = msoTrue