在 Excel 中创建一个函数来测试可与条件格式一起使用的单元格内部颜色

问题描述 投票:0回答:1

我看到了 2020 年的一篇文章 根据单元格背景颜色亮度自动调整字体颜色,并发现 @Tragamor 的回复“几乎”正是我正在寻找的内容。 Tragamor 发布了参考创建函数来测试单元格颜色是否为深色的代码。

作为 VBA 的新手,我试图弄清楚如何使该函数一次应用于多个单元格,并参考在条件格式中使用它。我尝试在 IsDark 中嵌套其他函数来引用单个单元格,例如 ADDRESS(ROW(),COLUMN(),4),但在这种情况下,我不断得到 #VALUE!错误。

我的目标是找到一种方法,在条件格式中使用该函数,根据单元格的颜色是否为深色来选择单元格,然后将非填充格式选项设置为其他互补颜色。理想情况下,我希望能够指定要在我称为设置的工作簿中的单独工作表中使用的颜色。我目前已经为条件格式规则中使用的颜色定义了名称,并且我想使用相同的配置来使用此函数来指示条件格式中规则的格式选项。

但是,正如所写,IsDark 只能设置为引用单个单元格,该单元格必须手动键入并且不支持函数嵌套。如果您不想点击上面的链接,则帖子中的原始代码如下:

Public Function IsDark(ByRef Cell As Range) As Boolean
    'If Cell.Cells.Count > 1 Then Exit Function
    Dim Blue As Long, Green As Long, Red As Long, PerceivedColor As Double
    
    Red = Cell.Interior.Color Mod 256
    Green = Cell.Interior.Color \ 256 Mod 256
    Blue = Cell.Interior.Color \ 65536 Mod 256
    PerceivedColor = 0.299 * (Red ^ 2) + 0.587 * (Green ^ 2) + 0.114 * (Blue ^ 2)
    IsDark = IIf(Sqr(PerceivedColor) > 127.5, False, True)
End Function

预先感谢您的帮助。

excel vba colors formatting
1个回答
0
投票

如果要引用条件格式单元格的颜色,则应使用

DisplayFormat
属性。您的函数可能如下所示:

Public Function IsDarkCF(ByRef Cell As Range) As Boolean
    If Cell.CountLarge > 1 Then E xit Function
    Dim Blue As Long, Green As Long, Red As Long, PerceivedColor As Double
    Dim col As Long
    col = Cell.DisplayFormat.Interior.Color
    Red = col Mod 256
    Green = col \ 256 Mod 256
    Blue = col \ 65536 Mod 256
    PerceivedColor = 0.299 * (Red ^ 2) + 0.587 * (Green ^ 2) + 0.114 * (Blue ^ 2)
    IsDarkCF = IIf(Sqr(PerceivedColor) > 127.5, False, True)
End Function

如果从 VBA 调用该函数,它就可以工作,而且有趣的是,它还可以用于条件格式化。但是,当从工作表作为 UDF 调用它时,它将无法工作。在这种情况下,只能间接调用它,包装在 Evaluate 方法中。

Public Function EIsDarkCF(ByRef Cell As Range) As Boolean
    EIsDarkCF = Cell.Parent.Evaluate("IsDarkCF(" & Cell.Address & ")")
End Function

在下图中,我展示了当使用色标格式化单元格时如何使用此函数。

IsDark

© www.soinside.com 2019 - 2024. All rights reserved.