2011-12-12 18 views
8

我试图在一个工作表上条件格式。我需要根据下列条件语句一种特定的颜色来填充单元格:使用AND()函数的条件格式

=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等),但我不确定它在性能方面是否真的很重要。

感谢大家回复我的问题。

回答

28

我和AND()有相同的问题,打破条件格式。我碰巧试着把AND当作乘法,它起作用!除去AND()函数,只是乘你的论点。Excel会将布尔值视为1表示为真,0表示为假。我只是测试这个公式,它似乎工作。

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

我还没有尝试过这个解决方案,但它很有意义。我会尽快尝试。 –

+0

@davient您的编辑都是错误的。首先,地址函数将该行作为第一个参数。第4行是行“D”。你给出的是当前行的第4和5列。另外,条件格式在单元上应用规则。要突出显示整行,规则必须对整行进行评估。至于逻辑运算符,False的值为0,True的值为1. TRUE - TRUE = 1 - 1 = FALSE不是有效的OR操作。另外,TRUE/FALSE = 1/0 = ERROR不是有效的AND操作。我已经证实这是它在excel中的工作原理。 – James

+1

有同样的问题,这个答案效果很好。 – perry

0

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

+0

感谢您的回复。我会尝试并报告。 –

+0

我结束了在一个函数中实现公式,我返回整数的原因不同。通过使用诸如Cells(ActiveCell.Row,4).Value之类的东西来获取DATE2和DATE3是相当容易的。但是当谈到获取DATE1时,Cells(4,ActiveCell.Column).Value似乎并没有成功。也许是因为我每次更新DATE2或DATE3时都不会调用我写的函数?我被卡住了,有时这有时会起作用,有时不会有任何想法? –

+0

你用Application.Volatile声明了你的函数吗? – ivan

3

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

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

选中A列,并输入条件格式公式:因为它们应用到正在调用它们的细胞

=AND(A1>B1,A1<C1) 
+0

感谢您的回应,但不可能将DATE1放入与其他人相同的行。 –

+0

错过了那一点抱歉。那么对于每一行都是如此? DATE1值在下面4行的同一列中?我努力想象你的数据。你可以附上工作表或截图吗? –

+0

连续有两个日期DATE2(开始)和DATE3(结束)。然后,从第10行开始,该行中的每个单元格在相应列的第4行都有一个日期。我今天晚些时候会尝试添加一个截图。 –

0

COLUMN()ROW()不会以这种方式工作。在条件格式中,您必须是显式而不是隐式

举例来说,如果你想用这个条件格式化对细胞A1范围开始时,你可以试试:

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

Excel将自动适应条件格式化到当前细胞。

+0

感谢您的回复。我最终更新了单元格中的值,以便根据单元格值完成条件格式化。 –

+0

很高兴你最终找到了解决方案。您可以将其作为答案发布并接受它,以便该主题将以某种方式关闭 - 请参阅http://stackoverflow.com/faq#howtoask – JMax

+0

当我完成它后,我会这样做。仍然有hickups。例如,ActiveCell函数在运行脚本时返回所选单元格。这没有任何意义。因此,我正在寻找能够返回执行函数的当前单元格的内容。我会尽快回复... –

1

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

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

,发现我可以删除AND+

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

希望这有助于加入了两个比较其他比较不那么复杂。

0

我目前负责有很多遗留代码的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秒。由于无论何时将数据加载到应用程序中都会运行此代码,因此这种节省对用户来说非常重要且显而易见。它也更加清洁和可重用。

我已经花时间发布此信息,因为我无法在本网站或其他地方找到任何涵盖所有情况的答案,但我确信还有其他人可以从上述方法中受益,有更多数量的细胞需要更新。

0

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

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