此问题基于我回答的其他人的问题。如果需要,您可以找到原始问题here。 (而且,也许提供比我更好的答案。)但是,回答这个问题所需的一切都在这里。
背景
给出A1:C5中的以下数据
+-------------+--------+----------+
| Invoice Nbr | Type | Status |
+-------------+--------+----------+
| A0001 | Credit | Paid |
| A0002 | Credit | Not Paid |
| B0001 | Debit | Paid |
| B0002 | Debit | Not Paid |
+-------------+--------+----------+
目标是使用评估两个列的数组公式在表中查找特定值。也就是说,给我第一张发票(A列),其中类型是借记,而状态是没有付款。
我的第一个答案是尝试解决我认为是OP条件的问题。我将AND包装器放在两个条件的周围,如下所示:
{=INDEX($A$2:$A$5,
SMALL(IF(AND($B$2:$B$5 = "Debit",
$C$2:$C$5 = "Not Paid"),
ROW($A$2:$A$5)-ROW($A$2)+1),
1)
)}
但是,那没用。
我最终提出了这个答案,因为它确实有效:
{=INDEX($A$2:$A$5,
SMALL(IF($B$2:$B$5 & $C$2:$C$5 = "DebitNot Paid",
ROW($A$2:$A$5)-ROW($A$2)+1),
1)
)}
我的问题
Excel中的数组公式有时对我来说是很大的麻烦。 似乎就像任何一个都应提供结果 B0002 。实际上,只有第二个公式给出了期望的结果。 Excel(2013)遵循的原则或评估过程是这样的?或者换句话说,我对Excel如何管理数组公式不了解?
答案 0 :(得分:3)
@StoneGiant是正确的。有些函数不能在数组公式中使用,因为它们的唯一“存在理由”是将数组转换为标量值。有时您实际上希望这些函数返回数组公式中的单个值,因此公式执行算法如何知道所需的方式。
AND()
和OR()
就是很好的例子。 =AND(array of values)
返回一个值。 MIN()
是另一个示例。取数组公式
= SUM((A1:A10 =“ Bob”)*(Min(B1:B10))
MIN()
应该采用一堆值并返回最小值。如何编程MIN()
返回数组?您在哪里决定什么情况下最低的价格?你不能这就是为什么它在数组公式中不起作用的原因。
接下来执行SMALL()
。它可以返回数组公式,因为它不仅应该返回最小值,而且要返回第n个最小值。由于有第n个参数,您现在可以返回一个数组
=SMALL(A1:A10,{2,3})
这将返回一个包含两个元素的数组。 MS可以编写很小的程序,使其不能用作数组公式,但总的来说,我发现它们在可行的地方都包含了数组功能。
我说AND()
和OR()
是很好的例子。 MS可以对它们进行编程,使其返回类似@StoneGiant的注释的数组。对我来说,这将是一个奇怪的设计决定,但他们可以做到。但是它们在数组公式中已经具有AND和OR。乘以AND并乘以OR。
=MAX((B2:B5="Debit)*(C2:C5="Not Paid")*(ROW(B2:B5))
这将返回最后行的行号,该行是借方但未支付。 (您的示例问题想要第一个,但是MIN引入了使该示例复杂化的问题)。等式之间的乘法与AND相同。如果您希望最后一行是借方,并且C列显示“未付款”或“不确定”,则可以添加它。
=MAX((B2:B5="Debit)*((C2:C5="Not Paid")+(C2:C5="Not Sure"))*(ROW(B2:B5))
加号是这两组括号之间的OR。并且该OR的结果作为AND(相乘)包含在其他括号中。
您可以将它们放在索引中
=INDEX(A2:A5, MAX((B2:B5="Debit)*(C2:C5="Not Paid")*(ROW(B2:B5)))
因此,我想回答您的问题:通常,旨在将一堆值转换为一个值的函数在数组公式中不起作用。 AND()
和OR()
有点特殊,因为加和减已经在数组公式中完成了。
在http://dailydoseofexcel.com/archives/2004/04/05/anatomy-of-an-array-formula/上查看有关数组的更多信息
答案 1 :(得分:2)
AND
和OR
通常不适用于数组公式,因为它们返回单个结果(而不是数组)。 / p>
这部分公式:
AND($B$2:$B$5 = "Debit", $C$2:$C$5 = "Not Paid")
如果TRUE
全部为TRUE
,则将返回单个FALSE
(不是$B$2:$B$5
/ Debit
值的数组) 和,如果$C$2:$C$5
都是Not Paid
(否则将返回FALSE
)。
公式的这一部分返回您想要的内容(一个由TRUE
/ FALSE
值组成的 array ):
$B$2:$B$5 & $C$2:$C$5 = "DebitNot Paid"
我个人并不喜欢这种方法,相反,我会做类似的事情:
($B$2:$B$5="Debit")*($C$2:$C$5="Not Paid")
侧注
尽管在此特定问题中没有任何区别,但将字符串连接起来并与结果进行比较的问题是,如果不小心,您可能会得到误报。
简单的例子:
(A1="ab")*(B1="cd")
将返回与以下结果“略有不同”的结果:
A1&B1 = "abcd"
例如,如果A1
是abc
,而B1
是d
,则顶部公式将返回FALSE
,而底部公式将返回TRUE
然后再说一次...取决于应用程序,也许这是您想要的 。为此,请小心连接字符串并比较结果。
底线...通常,应避免在数组公式中使用AND
和OR
,因为它们不会返回数组。
答案 2 :(得分:1)
我不确定您对数组公式的哪一部分有疑问-但为了公平起见,我花了很长的时间来解决这些问题,主要是因为我很少需要他们。
很大一部分原因是在Excel中,通常有几种方法可以完成同一任务。例如,在您的示例中,我将在Type
列的左侧插入一个隐藏的“帮助器列”以将Status
和Invoice #
串联起来, VLOOKUP
在该范围内。
数组公式是可以对数组中的一个或多个项目执行多次计算的公式。您可以将数组视为值的行,值的列或值的行和列的组合。数组公式可以返回多个结果或单个结果。
例如
- 您可以在一系列单元格中创建一个数组公式,并使用该数组公式来计算小计的列或行。
- 您还可以将数组公式放在单个单元格中并计算单个数量。
包含多个单元格的数组公式称为多单元格公式,而单个单元格中的数组公式称为单单元格公式。
(Source)
对于您的示例问题,也许按照以下步骤进行讲解即可。
这假定您已经了解使用Match
/ Index
函数执行查找的基础。
没有所有$
绝对参考标记的公式为:
=INDEX(B3:B6,MATCH(F3&G3,C3:C6&D3:D6,0))
分解:
F3&G3
将我们正在寻找的Type
和Status
连接(组合)为单个字符串,例如DebitPaid
C3:C6&D3:D6
,类似于:C3&D3
和 C4&D4
和 C5&D5
和 C6&D6
0
表示我们需要完全匹配。 (请参见docs for MATCH
。) MATCH
中单独的公式的H3
部分将返回3
,因为匹配是在数组的第3个子集中找到的(也就是从数组的顶部向下的第3行)我们的数组。)
然后将INDEX
包裹起来,我们可以使Excel从Invoice #
列中返回“第三值向下”。
添加$
美元符号以表示绝对引用,然后我们可以根据需要复制或“拖动”公式。
请记住,要输入数组公式,您需要使用 Ctrl + Shift + Enter 。
有关索引/匹配和绝对相对引用的更多说明和示例,请参见my other answer here。