【问题标题】:Conditional formatting using AND() function使用 AND() 函数的条件格式
【发布时间】:2023-04-06 04:12:01
【问题描述】:

我正在尝试在工作表上设置条件格式。我需要根据以下条件语句给单元格填充某种颜色:

=AND((INDIRECT(ADDRESS(4;COLUMN()))>=INDIRECT(ADDRESS(ROW();4)));(INDIRECT(ADDRESS(4;COLUMN()))<=INDIRECT(ADDRESS(ROW();5))))

当我分别尝试 AND() 函数中的语句时,它们似乎可以工作,但当我将它们放在函数中时,我看不到任何格式发生。

这里有一些背景: “当前列”的第 4 行包含一个日期 (DATE1)。 “当前行”(DATE2 和 DATE3)的 D 和 E 列也有日期。所以,如果 DATE1 介于 DATE2 和 DATE3 之间,我想用颜色填充单元格。

我不明白为什么该公式不起作用。非常感谢任何帮助。

更新(2011 年 12 月 13 日):

我实现了一个从需要此功能的单元格调用的函数。该函数返回整数值。然后条件格式仅使用单元格中的整数。这样,条件格式就不那么复杂了。我将 INDIRECT(ADDRESS(ROW();COLUMN())) 传递给我实现的函数。因此,在处理相对和/或绝对单元格时,我拥有所需的所有信息。很高兴知道将当前单元格作为范围传递给函数的更简单方法。

注意:ActiveCell 似乎对我不起作用。它使用函数运行时选择的单元格中的数据。这不是我要找的。我当然可以通过单元格本身(如 A4、B7 等),但我不确定它在性能方面是否真的很重要。

感谢所有回答我问题的人。

【问题讨论】:

    标签: excel excel-formula conditional-formatting


    【解决方案1】:

    与其他人报告的问题相同 - 使用 Excel 2016。发现对表格应用条件公式时; AND,条件相乘,条件相加失败。必须自己创建 TRUE/FALSE 逻辑:

    =IF($C2="SomeText",0,1)+IF(INT($D2)>1000,0,1)=0
    

    【讨论】:

      【解决方案2】:

      我目前负责一个包含大量遗留代码的 Excel 应用程序。此代码中最慢的部分之一是循环遍历 6 列中的 500 行,为每列设置条件格式公式。这些公式用于识别单元格内容非空白但不构成命名范围的一部分,因此两次引用单元格本身,最初写为:

      =AND(COUNTIF(<rangename>,<cellref>)=0,<cellref><>"")
      

      显然,通过一次更新每列(范围)中的所有单元格可以大大减少开销。但是,如上所述,在这种情况下使用 ADDRESS(ROW(),COLUMN(),n) 不起作用,即这不起作用:

      =AND(COUNTIF(<rangename>,ADDRESS(ROW(),COLUMN(),1))=0,ADDRESS(ROW(),COLUMN(),1)<>"")
      

      我对空白工作簿进行了广泛的试验,但无法找到解决此问题的方法,使用了各种替代方法,例如 ISBLANK。最后,为了解决这个问题,我创建了两个用户定义函数(使用我在本网站其他地方找到的提示):

      Public Function returnCellContent() As Variant
      
        returnCellContent = Application.Caller.Value
      
      End Function
      
      Public Function Cell_HasContent() As Boolean
      
        If Application.Caller.Value = "" Then
          Cell_HasContent = False
        Else
          Cell_HasContent = True
        End If
      
      End Function
      

      现在的条件公式是:

      =AND(COUNTIF(<rangename>,returnCellContent()=0,Cell_HasContent())
      

      效果很好。

      这加快了 Excel 2010 中的代码从 5 秒到 1 秒的速度。因为每当数据加载到应用程序时都会运行此代码,因此这种节省对用户来说意义重大且显而易见。它也更加清洁和可重复使用。

      我之所以花时间发布此问题,是因为我在本网站或其他地方找不到涵盖所有情况的任何答案,但我确信还有其他人可以从上述方法中受益,可能与要更新的单元格数量要多得多。

      【讨论】:

        【解决方案3】:

        我有一个不太复杂的公式的类似问题:

        = If (x > A & x <= B) 
        

        发现我可以删除AND并加入与+的两个比较

          = (x > A1) + (x <= B1)        [without all the spaces]
        

        希望这可以帮助其他人进行不太复杂的比较。

        【讨论】:

          【解决方案4】:

          我在 AND() 破坏条件格式时遇到了同样的问题。我只是碰巧尝试将 AND 视为乘法,它有效!删除 AND() 函数,然后将您的参数相乘。 Excel 会将布尔值视为 1 表示真,0 表示假。我刚刚测试了这个公式,它似乎有效。

          =(INDIRECT(ADDRESS(4,COLUMN()))>=INDIRECT(ADDRESS(ROW(),4)))*(INDIRECT(ADDRESS(4,COLUMN()))<=INDIRECT(ADDRESS(ROW(),5)))
          

          【讨论】:

          • 我还没有尝试过解决方案,但它是有道理的。我会尽快尝试。
          • @davient 您的两次编辑都是错误的。首先,地址函数将行作为第一个参数。第 4 行是“D”行。您给出的是当前行的第 4 列和第 5 列。此外,条件格式对单元格应用规则。要突出显示整行,该规则必须对整行评估为真。至于逻辑运算符,False 的值为 0,True 的值为 1。TRUE - TRUE = 1 - 1 = FALSE 不是有效的 OR 运算。此外,TRUE / FALSE = 1 / 0 = ERROR 不是有效的 AND 运算。我已经验证了这就是它在 excel 中的工作方式。
          • Excel OR() 函数是否有类似的解决方案,或者在整个公式变得复杂的情况下仍然有效?
          • @vwfreak 对 OR() 使用加法
          【解决方案5】:

          COLUMN()ROW() 不会以这种方式工作,因为它们被应用于调用它们的单元格。在条件格式中,您必须是 explicit 而不是 implicit

          例如,如果您想对从单元格A1 开始的范围使用这种条件格式,您可以尝试:

          `COLUMN(A1)` and `ROW(A1)`
          

          Excel 将自动调整条件格式以适应当前单元格。

          【讨论】:

          • 感谢您的回复。我最终更新了单元格中的值,以便根据单元格值完成条件格式。
          • 很高兴您最终找到了解决方案。您可以将其作为答案发布并接受它,以便以某种方式关闭该主题 - 请参阅stackoverflow.com/faq#howtoask
          • 当我完成它时,我会这样做。仍然有打嗝。例如,ActiveCell 函数在运行脚本时返回选定的单元格。这没有任何意义。因此,我正在寻找可以返回执行函数的当前单元格的东西。我很快就会回来回答...
          【解决方案6】:

          您可以使用更简单的公式。我刚刚创建了一个新的工作簿来测试它。

          Column A = Date1 | Column B = Date2 | Column C = Date3
          

          高亮A列并输入条件格式公式:

          =AND(A1>B1,A1<C1)
          

          【讨论】:

          • 感谢您的回复,但不能将 DATE1 与其他人放在同一行。
          • 抱歉错过了。那么每一行都是一样的吗? DATE1 值在下面 4 行的同一列中?我正在努力可视化您的数据。能否附上工作表或屏幕截图?
          • 一行中有两个日期DATE2(开始)和DATE3(结束)。然后,从第 10 行开始,该行中的每个单元格在相应列的第 4 行都有一个日期。今天晚些时候我会尝试附上屏幕截图。
          • 我试图模仿您的场景,只需将公式调整为 =AND(A1>B5,A1
          【解决方案7】:

          这可能是因为 column() 和 row() 函数。我不确定它们如何应用于条件格式。尝试使用此公式中的值创建一个新列,然后将其用于您的格式需求。

          【讨论】:

          • 感谢您的回复。我会尝试并报告。
          • 我最终在一个函数中实现了这个公式,我出于不同的原因返回整数。使用 Cells(ActiveCell.Row, 4).Value 之类的东西很容易获得 DATE2 和 DATE3。但是在获取 DATE1 时,Cells(4, ActiveCell.Column).Value 似乎并没有奏效。也许是因为,我写的函数不是每次更新 DATE2 或 DATE3 时都调用?我被困在一个有时有效,有时没有任何想法的地步?
          • 您是否使用 Application.Volatile 声明了您的函数?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多