【发布时间】:2014-11-07 15:14:40
【问题描述】:
问题
我想知道如何读取图表中自动分配颜色的当前 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,但这是一个丑陋的 hack。
研究
有人问了基本相同的问题(如何提取主题颜色)here,但从未得到回答。有几个来源建议将已知主题颜色转换为 RGB 值的方法(例如 here 和 here),但这只是引出了问题;我不知道颜色先验,除了“这条线当前是什么颜色”。
【问题讨论】:
-
这是一个很好的第一个问题。我似乎记得 line 图表特别难以像这样使用,在 PPT 中的图表上使用主题颜色(和一些非主题颜色)时遇到了一些类似的问题。我看看有没有什么功能可以帮到你……
-
尝试调试,即使我 assign
srs.Format.Line.ForeColor.ObjectThemeColor = msoThemeColorAccent2然后尝试查询?srs.Format.Line.ForeColor.ObjectThemeColor给我0(应该是 6)。无论使用什么颜色,我都会得到零。 -
看看这里的答案能不能帮到你:stackoverflow.com/questions/21142732/…
-
@DavidZemens 感谢您的建议(以及友好的反馈!)。实际上,我在问题的最后链接到了那个答案;问题是我不知道要尝试提取哪种主题颜色(或其变体)——没有利用我的知识,即它在 6 种调色板颜色之间循环,亮度变化,我宁愿避免这种情况。
-
对。就好像他们故意让 ThemeColors 难以使用。我看到一个有趣的观察结果,我将其添加为“答案”,因为它太大而无法放入 cmets。