如何通过VBA代码获取Excel 2012条件格式的色标制作的颜色
Posted
技术标签:
【中文标题】如何通过VBA代码获取Excel 2012条件格式的色标制作的颜色【英文标题】:How to get colors made by color scale of conditional formatting of Excel 2012 through VBA code 【发布时间】:2012-04-04 03:02:09 【问题描述】:我需要知道:如何通过 VBA 代码获取 Excel 2010 条件格式的色标生成的颜色。这些颜色随后将由 VBA 根据下图指定为图表背景:
www.lnkm.cz/Slozka/Example.jpg http://www.lnkm.cz/Slozka/Example.jpg
我对各种网络方面进行了研究,并且:
-
大多数人建议如何通过方法读取条件格式的颜色
<Cell>.FormatConditions(index that is active).Interior.ColorIndex
但在我的情况下它不起作用,因为错误“对象不支持此属性或方法”
有些人建议编写自己的颜色计算(基于单元格值)。我找到了各种方法,但没有一种方法可以计算出与之前 excel 计算出的颜色相同的颜色(与上一张图片上的颜色相同)。
所以我问:
-
有没有办法直接从单元格中准备好颜色? (或者 API 无法访问这些颜色)
你知道如何计算与 excel 计算相同的颜色吗?
您知道如何解决我的问题吗?
我相信它必须以某种方式工作。
【问题讨论】:
您是否有正在尝试解决的特定代码示例?不完全清楚您要做什么。直接从oSheet.Range("A1").Interior.Color
或oSheet.Range("A1").Interior.ColorIndex
等单元格中读取颜色很容易。也许我们可以帮助解决代码中的其他错误。
对于第 1 点的“对象”错误,您需要先将单元格设置为某个值。直接引用它(例如ActiveSheet.Range("A1")>.FormatConditions(SomeVariable).Interior.ColorIndex
)或SET
它作为变量(例如Set MyCell = ActiveSheet.Range("A1")
)
嗨,Gaffi,感谢您的回复,但我已经回复了。我通过各种方式(SET功能,选定的单元格等)设置各种单元格。我在 .FormatConditions(SomeVariable) 其他已经工作的命令之后。所以我认为“FormatConditions”不知道“interior”
【参考方案1】:
如果没有提供更好的答案,您可以尝试以下解决方法:
-
将数据链接/复制到图表下方的单元格(使用
=Sheet1!A1
等公式)
应用相同的条件格式
隐藏值(使用自定义数字格式,如""
,即空字符串文字(2 个双引号))
使图表透明
将单元格与图表对齐
更新:
如果条件格式仅对 2 个极端情况使用 2 种基色 (r1, g1, b1) 和 (r2, g2, b2),则您可以尝试通过线性逼近每个 R、G、B 通道来计算颜色可以是
min
和 max
值,例如:0 - 4 000
min
和max
percent,例如:10% - 90% (我相信你可以使用 % * [max_value - min_value] 得到实际值)
min
和 max
百分位,例如:第 0 个百分位 - 第 100 个百分位
对于百分比/百分位选项,您首先需要将实际值转换为百分比/百分位值,然后如果value < min
或value > max
使用角颜色,否则:
r = r1 + (r2 - r1) * (value - min_value) / (max_value - min_value)
g = ...
b = ...
【讨论】:
嗨,deathApril,好主意,但我在我的问题中简化了解释。事实上,我需要在每个图表小矩形(Excel 术语中的形状)的每个左上角添加条件格式的颜色及其值。如果它是图表的背景,则无法观察深紫色情况的图表点。但你的想法很鼓舞人心。 如果你的图表是白色的,除了左上角形状中的小矩形区域......但不,它不能用于检索“它的值”:( 我更新了我的答案,但计算只是我有根据的猜测,我这里没有 excel 来测试它.. 我试试你的更新。颜色与 excel 条件格式不同。但矩阵越大,颜色差异就越不明显。我会尝试它是否适合我的目的,如果解决了,我会告诉你。【参考方案2】:这会将单元格的图片复制到同一工作表上图表对象的左上角。请注意,图片链接到复制的单元格 - 如果值或格式颜色发生更改,它将更改为匹配。
Sub Tester()
CopyLinkedPicToPlot ActiveSheet.Range("E4"), "Chart 2"
End Sub
Sub CopyLinkedPicToPlot(rngCopy As Range, chtName As String)
Dim cht As ChartObject
Set cht = ActiveSheet.ChartObjects(chtName)
rngCopy.Copy
With rngCopy.Parent.Pictures.Paste(Link:=True)
.Top = cht.Top
.Left = cht.Left
End With
End Sub
编辑:我刚刚用一个相当小的 4x8 单元格/图表矩阵对此进行了测试,性能非常糟糕!不使用 Link:=True 粘贴可能会更好......
【讨论】:
我试过这个解决方案,但性能有问题。出于我的目的,我需要更改名称为“NPHR”的参数(上一张图片上的橙色)并观察“紫色格式区域”和“图表组”(图片左侧和右侧部分)的变化。两者都包含大量数据(excel 文件有 90 MB),参数 NPHR 的一次更改对于“紫色格式化区域”需要 0.5 秒,对于“图表组”需要 2.5 秒。一旦我按照你的建议只复制一个单元格,它需要 cca 6 秒,我想对于所有必要的单元格来说,它肯定会很慢。【参考方案3】:这不是特定于您的问题,但很容易修改以解决您的问题...
Sub CopyCondFill()
Dim FromSheet As Object
Dim ToSheet As Object
Dim FromSheetName as String
Dim ToSheetName as String
Dim ToRange As Range
Dim StrRange As String
'''Sheet with formatting you want to copy
FromSheetName = "YourSheetsName"
Set FromSheet = Application.ThisWorkbook.Sheets(FromSheetName )
'''Start of range within sheet you want to copy
FromFirstRow = 3
FromFirstCol = 2
'''Sheet you want to copy formatting to
ToSheetName = "YourSheetsName"
Set ToSheet = Application.ThisWorkbook.Sheets(ToSheetName)
'''range to copy formatting to
ToFirstRow = 3
ToFirstCol = 2
'''NOTE: Adjust row/column to take lastrow/lastcol from or enter value manually
ToLastRow = FromSheet.Cells(Rows.Count, 1).End(xlUp).Row
ToLastCol = FromSheet.Cells(2, Columns.Count).End(xlToLeft).Column
Set ToRange = ToSheet.Range(Cells(ToFirstRow, ToFirstCol), Cells(ToLastRow, ToLastCol))
'''Apply formatting to range
For Each cell In ToRange
StrRange = cell.Address(0, 0)
ToSheet.Range(StrRange).Offset(ToFirstRow - FromFirstRow, ToFirstCol - FromFirstCol).Interior.Color = _
FromSheet.Range(StrRange).DisplayFormat.Interior.Color
Next cell
End Sub
【讨论】:
【参考方案4】:试试这个:
<Cell>.DisplayFormat.Interior.Color
这应该在 2010 年以后使用 Excel。
【讨论】:
【参考方案5】:这对我有用,基于 JKirchartz 的回答
Sub copyBackgroundColors(source As Range, target As Range)
target.Interior.color = source.DisplayFormat.Interior.color
End Sub
【讨论】:
【参考方案6】:这是对您问题的部分回答。下表的第 1 列列出了 Excel 的标准 40 种颜色。第 2、3 和 4 列列出了每种颜色的红色、绿色和蓝色分量。因此,如果您希望单元格的字体为浅橙色:
Cell(Row, Column).Font.Color = RGB(255, 153, 0)
如果您尝试任何其他红绿组合,Excel 会将其匹配到这些标准颜色中最接近的一种,尽管 Excel 的“最接近”概念与我的不匹配。
如果您问题的其他部分得到解答,希望这会有所帮助。
Colour Red Green Blue
Black 0 0 0
Light orange 255 153 0
Lime 153 204 0
Gold 255 204 0
Bright green 0 255 0
Yellow 255 255 0
Grey 80% 51 51 51
Dark teal 0 51 102
Plum 153 51 102
Sea green 51 153 102
Dark blue 0 0 128
Dark red 128 0 0
Violet 128 0 128
Teal 0 128 128
Grey 50% 128 128 128
Grey 40% 150 150 150
Indigo 51 51 153
Blue-grey 102 102 153
Tan 255 204 153
Light yellow 255 255 153
Grey 25% 192 192 192
Aqua 51 204 204
Red 255 0 0
Rose 255 153 204
Light green 204 255 204
Blue 0 0 255
Pink 255 0 255
Light blue 51 102 255
Lavender 204 153 255
Sky blue 0 204 255
Pale blue 153 204 255
Turquoise 0 255 255
Light turquoise 204 255 255
Dark green 0 51 0
White 255 255 255
Olive green 51 51 0
Brown 153 51 0
Orange 255 102 0
Green 0 128 0
Dark yellow 128 128 0
【讨论】:
我认为 Excel 2007 比以前的版本更不容易将颜色捕捉到调色板。例如:见databison.com/index.php/… @蒂姆。感谢您的信息,我将不得不尝试。我在七八年前进行了导致上述列表的实验,但我从来没有理由重新审视它。由于我非常小心地坚持这个列表,我没有注意到 Excel 2007 在处理颜色方面比 2003 更好。学习新东西总是好的。我也很高兴现在可以在 Internet 上找到 Excel 的颜色列表。当我需要它时,我找不到任何类似的东西。 @Tony 你在哪里找到这个列表的?来源? 我通过实验创建了我的列表。我为单元格着色,然后阅读 Cells.Interior.Color。如果您在网上搜索“Excel 调色板”,您会发现任何数量的网站都包含此信息,以上是关于如何通过VBA代码获取Excel 2012条件格式的色标制作的颜色的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 vba 在 Excel 2007 中找到条件格式单元格的填充颜色值?