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

标签 vba excel 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时可能仍然会遇到问题。 ,甚至是没有线条的目标情况下的强调色、不同的标记填充与标记线。

最佳答案

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

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

但事实显然并非如此。很明显,它们都是不同的颜色。如果我使用 .ObjectThemeColor 而不是 .RGB,那么我会得到所有 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 还有一些其他怪癖,例如您可以选择单个点并更改其填充颜色,然后这会影响前面线段的视觉外观等。 ..

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

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

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 相关,并且该错误可能会通过 ObjectThemeColor 等延续到 Excel 2007+ 中……不太可能很快就会得到解决,所以我们需要一个黑客解决方案:)

更新的解决方案

结合以上两种方法!将每个系列从折线转换为 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

信用:David Zemens

关于vba - 从图表系列获取主题颜色信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19395760/

相关文章:

笛卡尔坐标系中的 JavaScript/JSF2 数据(矩形)可视化

vba - 强制用户仅选择一个特定单元格

基于条件的 Excel 宏 : Copying row values from one worksheet to a specific place in another worksheet,

Excel:使用表格作为下拉列表的源

excel - 当数百设置为0时更改excel中行的高度

excel - 如何在 Excel 中将两个垂直数字列表合并为一个长垂直列表?

email - 带有脚本的 Outlook 规则不断重复

vba - Excel VBA 循环选择工作表

c# - MS asp.net雷达图丑图

用于甘特图的 JavaScript/jQuery 库