5

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

我尝试返回一个系列的一些属性,但没有运气。在执行具有对图表系列的引用的 Sub 期间的断点处sr(出于测试目的,设置为具有线条,其颜色与标记线和标记填充相同,设置为 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) 的值,这在我的系列中使用。有没有办法做到这一点?

我发现的所有示例都使用 amsoThemeColorIndex来设置颜色,none 作为读取的值。

PS:我在第一部分没有成功,有一个颜色统一的系列。我预见,如果我克服了这个障碍,我可能仍然无法检测到正确的TintAndShade,甚至是在没有线条、不同标记填充与标记线的目标情况下的强调色。

4

2 回答 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

但显然情况并非如此。很明显,它们都是不同的颜色。如果,而不是.RGB我做.ObjectThemeColor,那么我得到了 all 0,通过观察图表,这同样明显是错误的!

Line Colors   
Series1 : 0
Series2 : 0
Series3 : 0

现在这里是有趣的地方:

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

Line Colors   
Series1 : 5066944
Series2 : 12419407
Series3 : 5880731

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

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

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

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

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+ 中......不太可能得到任何解决时间很快,所以我们需要一个黑客解决方案:)

更新的解决方案

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

信用:大卫泽门斯

于 2015-08-21T14:33:01.403 回答
1

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

因此,当您的图表线颜色自动设置时,您不能简单地获取它的颜色索引。您将始终收到 0 或 16777215 - 白色。最好的解决方案是在您尝试更改或获取图表线条颜色之前,使用 Line.Visible 关闭然后再打开来执行此小技巧。之后,您可以简单地阅读和更改线条颜色。

ppSeries.Format.Line.Visible = msoFalse 
ppSeries.Format.Line.Visible = msoTrue
于 2017-09-06T13:24:02.740 回答