如何通过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.ColoroSheet.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 通道来计算颜色可以是

minmax ,例如:0 - 4 000 minmax percent,例如:10% - 90% (我相信你可以使用 % * [max_value - min_value] 得到实际值) minmax 百分位,例如:第 0 个百分位 - 第 100 个百分位

对于百分比/百分位选项,您首先需要将实际值转换为百分比/百分位值,然后如果value < minvalue > 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 中找到条件格式单元格的填充颜色值?

excel中怎样用vba使单元格在特定条件下才可以编辑?

如何更改通过 Excel VBA 代码通过 Outlook 发送的电子邮件的字体格式?

excel vba中如何获取筛选数据的正确行号

Excel VBA - 条件格式中的用户定义函数

Excel VBA:编辑新行的现有条件格式规则