【问题标题】:Conditional formating based on formula in another sheet基于另一个工作表中的公式的条件格式
【发布时间】:2019-08-21 11:41:01
【问题描述】:

我有 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) 调用宏时,我不断收到“无效的过程调用或参数”消息。

我做错了什么?

【问题讨论】:

  • "=COUNTIF(base_valid!$B$6:$B$10|M2)>0") 不应该是"=COUNTIF(base_valid!$B$6:$B$10;M2)>0") 你输入| 而不是;(或者, 如果你有英文版的Excel)
  • 尝试使用 , 和 ;我得到了同样的信息! :(
  • Set cond1 = rg.FormatConditions.Add(xlExpression, , "=COUNTIF(base_valid!$B$6:$B$10;M2)>0") 怎么样?将 COUNTIF 替换为您使用 Excel 的任何语言的函数名称
  • 这样我得到“参数不是可选的”
  • 它非常适合我,你的 excel 是什么语言?另外,Excel中函数中参数的分隔符是什么?是; 还是,?并确保工作表base_valid 存在并确保范围base_valid!$B$6:$B$10 未合并且不包含任何错误

标签: excel vba conditional-formatting


【解决方案1】:

你必须在这里很棘手。条件格式规则不允许在其他工作表上添加对范围的引用,甚至不能手动添加!将弹出警报!

弹出警告说不能使用对其他工作簿或工作表的引用作为条件格式的条件

但 Excel 有另一个可以提供帮助的函数,称为 INDIRECT

INDIRECT function

这个奇妙的功能将允许我们在不同的工作表中引用一个范围,但它在同一个工作表上的位置。要引用范围,请使用引用名称作为字符串(作为文本)

所以我们将用作标准的公式是:

=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)")

【讨论】:

  • 我添加了 -> 设置 cond1 = rg.FormatConditions.Add(xlExpression, , "=CONTAR.SE(INDIRECTO(""base_valid!$B$2:$B$6"")|M2)> 0") 仍然没有成功......如果我使用相同的公式而没有 "" 我在单元格中得到正确
  • 还向 cond1 添加了一个手表,我在 "formula1" --> Formula1 中得到以下信息: "=CONTAR.SE(INDIRECTO("base_valid!$B$2:$B$6")|L1048571 )>0"
  • 为什么在"=CONTAR.SE(INDIRECTO(""base_valid!$B$2:$B$6"")|M2)>0") 中使用|
  • 因为我使用的分隔符在 Excel 中是这样配置的
  • @BigBen,编辑了这个原始答案以显示有关使用全局范围命名范围而不是 INDIRECT 的选项 :)
猜你喜欢
  • 2021-03-24
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
相关资源
最近更新 更多