我有2个Excel 2007 PT-PT工作表: 一个(sheet1)具有多个要验证的列。 另一个(base_valid)有5列要验证。 我正在尝试使用宏来验证“区域”(M2)列:
Sub Validar_Regioes()
Dim rg As Range
Dim cond1 As FormatCondition, cond2 As FormatCondition, cond3 As FormatCondition
Set rg = Range("M2", Range("M2").End(xlDown))
'clear any existing conditional formatting
rg.FormatConditions.Delete
'define the rule for each conditional format
Set cond1 = rg.FormatConditions.Add(xlCellValue, xlExpression, "=COUNTIF(base_valid!$B$6:$B$10|M2)>0")
'define the format applied for each conditional format
With cond1
.Interior.Color = vbGreen
.Font.Color = vbWhite
End With
End Sub
这个想法是要检查M2列中的区域是否匹配base_valid地区范围内的任何值(base_valid!$ B $ 6:$ B $ 10) 调用宏时,我不断收到“无效的过程调用或参数”消息。
我在做什么错了?
答案 0 :(得分:3)
您在这里必须很棘手。条件格式设置规则不允许添加对其他工作表上范围的引用,甚至不能手动添加!警报将弹出!
弹出警报说不能将其他工作簿或工作表的引用用于条件格式的条件
但是Excel有另一个可以帮助的功能,称为INDIRECT
这个很棒的功能将使我们可以引用不同工作表中的范围,但可以引用同一工作表中的范围。要引用范围,请使用引用名称作为字符串(作为文本)
所以我们将用作标准的公式是:
=COUNTIF(INDIRECT("base_valid!$B$6:$B$10");M2)
因此,您的VBA代码需要像这样进行修复:
Dim rg As Range
Dim cond1 As FormatCondition, cond2 As FormatCondition, cond3 As FormatCondition
Set rg = Range("M2", Range("M2").End(xlDown))
Set cond1 = rg.FormatConditions.Add(xlExpression, , "=COUNTIF(INDIRECT(""base_valid!$B$6:$B$10"");M2)")
With cond1
.Interior.Color = vbGreen
.Font.Color = vbWhite
End With
这完全适合我!应用宏后,我得到了:
哦,我在base_valid
工作表中的数据是这样的:
希望您可以使其适应您的需求。
2019年12月更新:
感谢@BigBen,另一种选择是使用全局范围的命名范围,而不是间接的。在这种情况下,您可以创建一个名称MyValuesList
,该名称引用范围base_valid!$B$6:$B$10
。
然后,CF规则将为=COUNTIF(MyValuesList;M2)
,它将正常工作。
因此,如果您使用命名范围,则无需使用INDIRECT
。
您的代码可能是:
Set cond1 = rg.FormatConditions.Add(xlExpression, , "=COUNTIF(MyValuesList;M2)")