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

Excel 基于具有条件格式的单元公式的单元着色器,excel,vba,Excel,Vba,我正在尝试开发一种基于单元格内容(即基于以下标准)对单元格进行颜色编码的代码 硬编码单元 带公式的单元格 具有指向其他图纸链接的单元格 具有外部链接的单元格 这里的问题是,我能够开发的代码使用实际的背景颜色对单元格进行颜色编码 我正在寻找一种方法来使用条件格式来运行相同的代码,这样我就可以开发一个代码来取消单元格的阴影,并将其恢复为工作表中的原始格式 有人能帮我将代码转换为条件格式吗?此答案依赖于Excel 2013之前不可用的函数。另外,我将从这个有用的代码中抄录一些代码,它展示了一种向单元格

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

  • 硬编码单元
  • 带公式的单元格
  • 具有指向其他图纸链接的单元格
  • 具有外部链接的单元格
  • 这里的问题是,我能够开发的代码使用实际的背景颜色对单元格进行颜色编码

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

    有人能帮我将代码转换为条件格式吗?

    此答案依赖于Excel 2013之前不可用的函数。另外,我将从这个有用的代码中抄录一些代码,它展示了一种向单元格添加多个条件的简单方法

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

  • 硬编码单元格:
    =和(ISNA(公式文本(A2)),而不是(ISBLANK(A2))
  • 带公式的单元格:
    =NOT(ISNA(公式文本(A2))
  • 带有指向其他工作表链接的单元格:
    =NOT(iError(搜索(“*!*”,FORMULATEXT(A2),1))
  • 带有外部链接的单元格:
    =NOT(iError(搜索(“*.xls*]*!*”,FORMULATEXT(A2),1))
  • 注意到:

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

    • 公式2与公式1相反,因为
      FORMULATEXT
      中的任何非错误表示它是一个公式

    • 公式3和4符合您的通配符逻辑,除了我只实现了
      如“*!*”
      位,而不是其他子句-您可以为此扩展公式,尽管它可能最终会变得复杂

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

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

    您好,谢谢您的代码。它在很大程度上起作用。我有一个快速的问题,我发现了一个问题,我想我已经能够解决它。因此,在使用的公式中,似乎有一个对单元格A2的引用,当我在系统上尝试该代码时,条件格式应用于第1行。你也是这样吗?我将代码替换为显示A1而不是A2,然后工作正常。我不确定这是否是我的本意。对迟来的答复表示歉意@nikhilkumar-我在公式中使用A2,因为它是根据
    Set rng=Sheet1.range(“A2:A6”)
    应用条件格式的范围的第一个单元格。因此,对于您的工作表,您可能需要使用数据范围的第一个单元格来更新A2。这是有道理的。谢谢你的帮助。实际上,我将通过使用Set rng=Application.selection使它成为动态的,我想接下来我将不得不使用A1。让我知道这是否合理?我将不得不与一些同事分享代码,并希望它是动态的,因此希望确保我所想的是正确的。再次感谢您的帮助和快速响应是的,也许您可以使用
    selection.Cells(1,1).address(False,False)
    获取所选内容的第一个单元格的地址,并将该值代入公式中。不要认为A1会神奇地工作,认为你想使用Range左上角的单元格是有意义的,谢谢你的快速反馈。我今天会试试,会让你知道的