Excel 基于具有条件格式的单元公式的单元着色器
我正在尝试开发一种基于单元格内容(即基于以下标准)对单元格进行颜色编码的代码Excel 基于具有条件格式的单元公式的单元着色器,excel,vba,Excel,Vba,我正在尝试开发一种基于单元格内容(即基于以下标准)对单元格进行颜色编码的代码 硬编码单元 带公式的单元格 具有指向其他图纸链接的单元格 具有外部链接的单元格 这里的问题是,我能够开发的代码使用实际的背景颜色对单元格进行颜色编码 我正在寻找一种方法来使用条件格式来运行相同的代码,这样我就可以开发一个代码来取消单元格的阴影,并将其恢复为工作表中的原始格式 有人能帮我将代码转换为条件格式吗?此答案依赖于Excel 2013之前不可用的函数。另外,我将从这个有用的代码中抄录一些代码,它展示了一种向单元格
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符合您的通配符逻辑,除了我只实现了
位,而不是其他子句-您可以为此扩展公式,尽管它可能最终会变得复杂如“*!*”
!
),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左上角的单元格是有意义的,谢谢你的快速反馈。我今天会试试,会让你知道的