- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道如何读取图表中自动分配颜色的当前 RGB 值,即使这需要将颜色卡住为其当前值(而不是在主题更改、系列重新排序时更新它们,等)
我的实际用例是我想让数据标签与折线图中线条/标记的颜色相匹配。如果我通过方案或显式 RGB 值显式设置系列的颜色,则这很容易,例如
' assuming ColorFormat.Type = msoColorTypeRGB
s.DataLabels.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB= _
s.Format.Line.ForeColor.RGB
但是,在自动分配系列颜色时执行此操作会产生白色标签。更具体地说,以下两个等式均成立
s.Format.Line.ForeColor.Type = msoColorTypeRGB
s.Format.Line.ForeColor.RGB = RGB(255,255,255) ' White
当然,这条线不是白色的,而是主题自动分配的颜色。这说明颜色是自动分配的
s.Border.ColorIndex = xlColorIndexAutomatic
我认为颜色不与相关系列一起存储是有道理的。即使将索引存储到颜色方案中通常也不起作用,因为如果添加另一个数据系列或有人对数据重新排序,Excel 需要更改颜色。不过,如果有某种方法可以自动识别当前的 RGB 值,我会很高兴。
对于包含 6 个或更少条目的图表,一个简单的解决方法是利用主题颜色按顺序分配的事实,因此我可以这样做(例如)
chrt.SeriesCollection(1).DataLabels.Format.TextFrame2.TextRange.Font.Fill.ForeColor.ObjectThemeColor _
= msoThemeColorAccent1
大概这可以扩展到解释用于在主题耗尽后区分条目的TintAndShade
,但这是一个如此丑陋的黑客。
有人问了基本相同的问题(如何提取主题颜色)here ,但从未得到答复。有多个来源建议将已知主题颜色转换为 RGB 值(例如 here 和 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
关于VBA:使用默认颜色提取图表中线条的RGB值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25825269/
我是一名优秀的程序员,十分优秀!