gpt4 book ai didi

VBA:使用默认颜色提取图表中线条的RGB值

转载 作者:行者123 更新时间:2023-12-01 18:56:47 25 4
gpt4 key购买 nike

问题

我想知道如何读取图表中自动分配颜色的当前 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 值(例如 herehere ),但这只是回避了问题;我不知道颜色先验,除了“无论这条线当前是什么颜色。”

最佳答案

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

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

关于VBA:使用默认颜色提取图表中线条的RGB值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25825269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com