我有一个图表系列,使用一种颜色(可以是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
来设置颜色,没有将其作为读取的值。
TintAndShade
,甚至是没有线,不同标记填充与标记线的目标情况下的重点颜色时遇到问题。
答案 0 :(得分: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
,那么我得到所有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还有一些其他的怪癖,就像你可以选择一个单独的点并改变它的填充颜色,然后这会影响前一个线段的视觉外观等...
这仅限于折线图吗?也许吧。我过去的经历说&#34;可能&#34;虽然我不能说这是一个错误,但它肯定是一个错误。
如果我在柱形图上运行类似的程序 - 再次仅使用自动分配的默认颜色
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+等......它不太可能随时解决,所以我们需要一个黑客解决方案:)
更新的解决方案
结合上述两种方法!将每个系列从行转换为xlColumnClustered,然后从.Fill查询color属性,然后将系列图表类型更改回其原始状态。这可能比尝试利用顺序索引更可靠(如果用户重新订购了系列,则根本不可靠,例如,&#34; Series1&#34;在索引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
答案 1 :(得分:1)
这是DeerSpotter的解决方案之一。 但是,在将图表类型更改为某个临时ChartType,然后将其更改回原始ChartType之后。你正在失去一些格式。举个例子,你得到第二个轴,但并不总是需要它。
因此,当您的图表线颜色自动设置时,您不能简单地获得它的颜色索引。你会一直收到0或16777215 - 白色。 最好的解决方案就是在您尝试更改或获取图表线颜色之前,使用Line.Visible关闭然后继续执行此操作。在它之后,您可以简单地读取和选择您的线条颜色。
ppSeries.Format.Line.Visible = msoFalse
ppSeries.Format.Line.Visible = msoTrue