我正在尝试开发一种代码,根据单元格内容对单元格进行颜色编码,即基于以下标准
这里的问题是我已经能够开发的代码使用实际的背景颜色来对单元格进行颜色编码。
我正在寻找一种使用条件格式来运行相同代码的方法,以便我可以开发一个代码来取消单元格的阴影并恢复到工作表中的原始格式。
有人可以帮我转换代码以使用条件格式吗?
答案 0 :(得分:1)
此答案依赖于 FORMULATEXT
函数,该函数在 Excel 2013 之前不可用。此外,我将从这个有用的 post 中编写一些代码,它显示了添加多个条件的相当简单的方法到细胞。
因此对于您的 4 个标准,我们可以对每个标准使用 FORMULATEXT
:
=AND(ISNA(FORMULATEXT(A2)),NOT(ISBLANK(A2)))
=NOT(ISNA(FORMULATEXT(A2)))
=NOT(ISERROR(SEARCH(""*!*"",FORMULATEXT(A2),1)))
=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
在这些测试用例上使用它会产生正确的结果:
您可以看到 A2
是空白的并且没有被格式化,因为它不是一个公式,但不包含任何值(硬编码或其他)。
HTH
答案 1 :(得分:0)
如果您只想重置颜色,您可以编写一个新的子程序来遍历单元格并将内部颜色设置回白色或 (255, 255, 255)