【发布时间】:2021-04-11 09:15:14
【问题描述】:
我正在尝试开发一种代码,根据单元格内容对单元格进行颜色编码,即基于以下标准
- 硬编码单元格
- 带有公式的单元格
- 带有指向其他工作表的链接的单元格
- 带有外部链接的单元格
这里的问题是我能够开发的代码使用实际的背景颜色来对单元格进行颜色编码。
我正在寻找一种使用条件格式来运行相同代码的方法,以便我可以开发一个代码来取消单元格的阴影并将其恢复为工作表中的原始格式。
有人可以帮我将代码转换为使用条件格式吗?
【问题讨论】:
我正在尝试开发一种代码,根据单元格内容对单元格进行颜色编码,即基于以下标准
这里的问题是我能够开发的代码使用实际的背景颜色来对单元格进行颜色编码。
我正在寻找一种使用条件格式来运行相同代码的方法,以便我可以开发一个代码来取消单元格的阴影并将其恢复为工作表中的原始格式。
有人可以帮我将代码转换为使用条件格式吗?
【问题讨论】:
这个答案依赖于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 "*!*" 位而不是其他子句 - 您可以为此扩展公式,尽管它可能最终会变得复杂。
条件格式中的顺序很重要。在下面的代码中,顺序实际上是 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
【讨论】:
Set rng = Sheet1.Range("A2:A6") 应用条件格式的范围的第一个单元格。因此,对于您的工作表,您可能需要使用范围的第一个单元格用于您的数据来更新 A2。 HTH
Selection.Cells(1, 1).Address(False, False) 获取所选内容的第一个单元格的地址,并将该值代入公式中。不要认为 A1 会神奇地工作,认为你想使用范围的左上角单元格
如果你只是想重置颜色,你可以编写一个新的 sub 循环遍历单元格并将内部颜色设置回白色或 (255, 255, 255)
【讨论】: