【问题标题】:Cell shader based on cell formula with conditional formatting基于具有条件格式的单元格公式的单元格着色器
【发布时间】:2021-04-11 09:15:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: excel vba


    【解决方案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 "*!*" 位而不是其他子句 - 您可以为此扩展公式,尽管它可能最终会变得复杂。

    条件格式中的顺序很重要。在下面的代码中,顺序实际上是 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
    

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

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

    HTH

    【讨论】:

    • 嗨罗宾,感谢您的代码。它在大多数情况下都有效。我有一个关于我发现问题的快速问题,我认为我已经能够解决它。因此,在使用的公式中,您似乎引用了单元格 A2,当我在系统上尝试代码时,条件格式被应用于行 -1。你也有同样的情况吗?我替换了代码以显示 A1 而不是 A2,然后它工作正常。不确定这是否是本意。抱歉回复晚了!!
    • @nikhilkumar - 我在公式中使用了 A2,因为它是每个Set rng = Sheet1.Range("A2:A6") 应用条件格式的范围的第一个单元格。因此,对于您的工作表,您可能需要使用范围的第一个单元格用于您的数据来更新 A2。 HTH
    • 这是有道理的。感谢您的帮助。我实际上将通过使用 Set rng = Application.selection 使其动态化,然后我想我将不得不使用 A1。让我知道这是否有意义?我将不得不与几个同事共享代码,并希望它是动态的,因此想确定我的想法是否正确。再次感谢您的帮助和快速响应
    • 是的,也许您可​​以使用Selection.Cells(1, 1).Address(False, False) 获取所选内容的第一个单元格的地址,并将该值代入公式中。不要认为 A1 会神奇地工作,认为你想使用范围的左上角单元格
    • 有道理,感谢您的快速反馈。我今天会试一试,然后告诉你
    【解决方案2】:

    如果你只是想重置颜色,你可以编写一个新的 sub 循环遍历单元格并将内部颜色设置回白色或 (255, 255, 255)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多