我有一个图表系列,使用一种颜色(可以是 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
时可能仍然会遇到问题。 ,甚至是没有线条的目标情况下的强调色、不同的标记填充与标记线。
最佳答案
所以这很有趣。我使用所有默认值创建折线图,然后运行此过程:
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/