基于具有条件格式的单元格公式的单元格着色器

时间:2021-04-11 09:15:14

标签: excel vba

我正在尝试开发一种代码,根据单元格内容对单元格进行颜色编码,即基于以下标准

  1. 硬编码单元格
  2. 带有公式的单元格
  3. 带有其他工作表链接的单元格
  4. 带有外部链接的单元格

这里的问题是我已经能够开发的代码使用实际的背景颜色来对单元格进行颜色编码。

我正在寻找一种使用条件格式来运行相同代码的方法,以便我可以开发一个代码来取消单元格的阴影并恢复到工作表中的原始格式。

有人可以帮我转换代码以使用条件格式吗?

2 个答案:

答案 0 :(得分:1)

此答案依赖于 FORMULATEXT 函数,该函数在 Excel 2013 之前不可用。此外,我将从这个有用的 post 中编写一些代码,它显示了添加多个条件的相当简单的方法到细胞。

因此对于您的 4 个标准,我们可以对每个标准使用 FORMULATEXT

  1. 硬编码单元格:=AND(ISNA(FORMULATEXT(A2)),NOT(ISBLANK(A2)))
  2. 带有公式的单元格:=NOT(ISNA(FORMULATEXT(A2)))
  3. 带有其他工作表链接的单元格:=NOT(ISERROR(SEARCH(""*!*"",FORMULATEXT(A2),1)))
  4. 带有外部链接的单元格:=NOT(ISERROR(SEARCH(""*.xls*]*!*"",FORMULATEXT(A2),1)))

注意:

  • 公式 1 的区别在于,逻辑表示任何不是公式的值,大多数情况下将表示硬编码值。

  • 公式 2 是公式 1 的逆,因为 FORMULATEXT 的任何非错误都意味着它是一个公式

  • 公式 3 和 4 是根据您的通配符逻辑,除了我只实现了 Like "*!*" 位而不是其他子句 - 您可以为此扩展公式,尽管它最终可能会变得复杂。< /p>

条件格式中的顺序很重要。在下面的代码中,顺序实际上是 1, 4, 3, 2 因为 4 是 3 的特例(即包含 !)而 4 和 3 是 2 的特例(即所有 3 都是公式) .

所以我使用的代码是:

Option Explicit

Sub CellShader()

    Dim rng As Range
    
    Set rng = Sheet1.Range("A2:A6")
    
    ' delete existing conditional formatting
    rng.FormatConditions.Delete
    
    ' add your 4 rules in order 1, 4, 3, 2
    AddRule rng, "=AND(ISNA(FORMULATEXT(A2)),NOT(ISBLANK(A2)))", vbCyan
    AddRule rng, "=NOT(ISERROR(SEARCH(""*.xls*]*!*"",FORMULATEXT(A2),1)))", vbMagenta
    AddRule rng, "=NOT(ISERROR(SEARCH(""*!*"",FORMULATEXT(A2),1)))", vbRed
    AddRule rng, "=NOT(ISNA(FORMULATEXT(A2)))", vbGreen
   
End Sub

' https://stackoverflow.com/questions/40209398/conditional-formatting-vba-multiple-conditions
Sub AddRule(rng As Range, strFormula As String, lngColor As Long)
    With rng.FormatConditions
        With .Add(Type:=xlExpression, Formula1:=strFormula)
            .Interior.Color = lngColor
            .StopIfTrue = True
        End With
    End With
End Sub

在这些测试用例上使用它会产生正确的结果:

enter image description here

您可以看到 A2 是空白的并且没有被格式化,因为它不是一个公式,但不包含任何值(硬编码或其他)。

HTH

答案 1 :(得分:0)

如果您只想重置颜色,您可以编写一个新的子程序来遍历单元格并将内部颜色设置回白色或 (255, 255, 255)