计算有条件格式的单元格(如果有颜色)

Posted

技术标签:

【中文标题】计算有条件格式的单元格(如果有颜色)【英文标题】:Count Conditionally Formatted Cells if Colored 【发布时间】:2020-05-13 18:43:48 【问题描述】:

我正在尝试编写一个函数来计算由于条件格式而被着色的单元格。 UDF 不能使用 DisplayFormat 属性,所以 Tim Williams 在下面写了这个绝妙的解决方案。当我最初将函数输入到单元格时,它工作得很好。但是,当我更改它指向的其中一个单元格中的值时,该函数会报告 0。然后我必须重新输入该函数以使其正确回答。

有人知道为什么会这样吗?以及如何解决?

Function DFColor(addr As String)
    DFColor = Range(addr).DisplayFormat.Interior.color
End Function


Function CountColoredCells(rng As Range) As Long
    Dim count As Long, color As Long, cell As Range
    count = 0
    For Each cell In rng.Cells
        color = rng.Parent.Evaluate("DFColor(""" & cell.Address() & """)")
        If color <> 16777215 Then       '16777215 is the blank color value
            count = count + 1
        End If
    Next cell
    CountColoredCells = count
End Function

这是他的解决方案帖子的链接 - https://***.com/a/54757688/7053791

【问题讨论】:

最好根据Conditional Format规则的逻辑实际计数,而不是这种方法。 ^ 这是要走的路。当您可以直接使用逻辑时,您只是使用条件格式作为中间人。即在 VBA 中重新创建条件格式逻辑。刚刚意识到我对你原来的问题留下了同样的评论哈 这种方法在大多数情况下可能会更好,但对我来说不是。在我的特殊情况下,拥有一个函数是最好的方法,我需要为我的工作表的用户界面设置条件格式。你知道我在 19 列中有 23 种不同的条件格式规则。我不会在 VBA 中编写该 逻辑。它已经在 ocnditional 格式中进行了说明。上面的方法效果很好。我只需要它在单元格更改时自动更新。这就是我的问题的目标。 【参考方案1】:

这个设计有一个错误:

Function DFColor(addr As String)
    DFColor = Range(addr).DisplayFormat.Interior.color
End Function

单元格地址作为字符串传递,然后使用Range() 转换为范围对象,但由于Range()(在常规代码模块中)默认为 ActiveSheet,如果具有条件格式的工作表不是ActiveSheet 你会得到错误的结果(因此你看到的是零)。

这更健壮 - 传入一个实际的 Range 并直接使用它:

Function DFColor(c As Range)
    DFColor = c.DisplayFormat.Interior.color
End Function

Function CountColoredCells(rng As Range) As Long
    Dim count As Long, color As Long, cell As Range
    count = 0
    For Each cell In rng.Cells
        color = rng.Parent.Evaluate("DFColor(" & cell.Address() & ")") '<<EDITED
        If color <> 16777215 Then       '16777215 is the blank color value
            count = count + 1
        End If
    Next cell
    CountColoredCells = count
End Function

我已经在链接的帖子中编辑了版本

【讨论】:

这确实解决了零问题,谢谢!但是,它仍然不会在更改后更新,除非我单击公式框并按 Enter 键,或者向下重新拖动单元格。公式正在自动计算。 使用 application.volatile 可以做到这一点,所以我只需要在其中一个单元格中单击 enter 即可自动计算所有内容。但我仍然希望能够在任何更改时自动自动计算。 我最终使用了这篇文章中的解决方案#2 - superuser.com/a/1261461。但是,它仅在我更新该功能的工作表时才有效。实际上,我经常更改其他工作表中影响函数输出值的内容,因此我需要它来更新对任何工作表的任何更改。有任何想法吗?我喜欢 Now() 的可选变体解决方案,因为它只会在每次更改某些内容时重新计算 UDF。我想避免使用每次更改都重新计算工作簿中的每个公式的解决方案,因为那样会非常昂贵。 如果输入范围内的单元格正在更新,我希望它会更新。但是,如果单元格的 CF 链接到其他一些范围,则公式将不会更新。如果为值发生变化的单元格添加范围参数,则可以使其自动执行。

以上是关于计算有条件格式的单元格(如果有颜色)的主要内容,如果未能解决你的问题,请参考以下文章

excel如何根据条件自动变换行列颜色?

有条件地格式化 Python 熊猫单元格

整行和单元格的 Google 表格条件格式

如果单元格 <> 单元格在上方,则条件格式

怎么用条件格式将一个区域设置为渐变填充蓝色(标准色)数据条?

根据单元格的数字格式设置条件格式?