Excel:SMALL()、IF() 和 ROW() 使用多个条件查找值的行号 - AND() 不起作用
Excel: SMALL(), IF() and ROW() to look up row numbers of values using multiple criteria - AND() not working
我有一个名为 Purchases
的参考点差sheet,看起来类似于:
A B C D
1 Ord_ID Supplier PO_Date Receipt_Quantity
2 PO101 Aa 11/1/2017 5
3 PO102 Bb 12/1/2017 12
4 PO103 Cc 12/15/2017 100
5 PO104 Bb 1/15/2018 8
6 PO105 Dd 2/1/2018 30
7 PO106 Bb 3/1/2018 15
8 PO107 Bb 4/1/2018 10
...
我有一个名为 Supplier Bb Data
的单独 sheet,它应该 return 供应商 Bb 的 Purchases
数据的行号。公式如下所示,位于 A10
、A11
、A12
等单元格中:
=SMALL(IF('Purchases'!$B:$B=$A, ROW('Purchases'!$B:$B)), ROW(1:1))
=SMALL(IF('Purchases'!$B:$B=$A, ROW('Purchases'!$B:$B)), ROW(2:2))
=SMALL(IF('Purchases'!$B:$B=$A, ROW('Purchases'!$B:$B)), ROW(3:3))
...
A1
in Supplier Bb Data
包含要查找的值 "Bb"。
这个公式有效;它更正了来自 Purchases
的 returns 行号,其中包括供应商 Bb 的采购订单。 (3
、5
、7
、8
等)
但是,我希望能够 return 更具体的数据:Supplier = Bb
AND PO_Date >= 1/1/2018
和 PO_Date <= 3/1/2018
的行。因此,returning 5
和 7
.
看起来很简单;我试过这个(假设 1/1/2018
和 3/1/2018
分别在单元格 A2
和 A3
中:
=SMALL(IF(AND('Purchases'!$B:$B=$A, 'Purchases'!$C$C>=$A, 'Purchases!$C$C<=$A),
ROW('Purchases'!$B:$B)), ROW(1:1))
当我尝试这个时,excel 只是第一行 returns 0
,并且所有后续行都出错。
AND()
是否在 IF()
语句中根本不起作用?我还能做些什么来让它发挥作用?
对于这些单元格,我总是按 Ctrl+Shift+Enter
,因为它们是数组公式,所以这不是问题所在。
AND函数自己进行循环(数组式)计算。随后,AND 或 OR 函数在数组样式 (CSE) 公式中不能与其他函数很好地协同工作。将条件堆叠在嵌套 IF 中或根据您的目的使用 AGGREGATE。
'array style with CSE
=SMALL(IF(Purchases!$B:$B=$A, IF(Purchases!$C:$C>=$A, IF(Purchases!$C:$C<=$A, ROW($B:$B)))), ROW(1:1))
'standard style without CSE
=AGGREGATE(15, 7, ROW(B:B)/((Purchases!B:B=A)*(Purchases!C:C>=A)*(Purchases!C:C<=A)), ROW(1:1))
- 您在
'Purchases'!$C$C
中缺少一个 :
。
- 工作簿中所有工作表的行数相同。
ROW(B:B)
可以用来代替 ROW('Purchases'!$B:$B))
。
ROW(1:1)
表示您正在向下拖动连续的 k 个参数。无需将列锁定为绝对列。
如果不使用完整的列引用,具有循环计算的数组公式或函数的执行效率会高得多。考虑以下因素:
=AGGREGATE(15, 7, ROW(:9)/((Purchases!B:B9=A)*(Purchases!C:C9>=A)*(Purchases!C:C9<=A)), ROW(1:1))
或者,您可以将 SMALL+IF 与 SUMPRODUCT 函数结合使用 (Ctrl+Shift+Enter):
=IFERROR(SUMPRODUCT(SMALL(IF((Purchases!$B:$B=$A)*(Purchases!$C:$C>=$A)*(Purchases!$C:$C<=$A)=0,"",(ROW(Purchases!$B:$B))),ROW(1:1))),"")
我有一个名为 Purchases
的参考点差sheet,看起来类似于:
A B C D
1 Ord_ID Supplier PO_Date Receipt_Quantity
2 PO101 Aa 11/1/2017 5
3 PO102 Bb 12/1/2017 12
4 PO103 Cc 12/15/2017 100
5 PO104 Bb 1/15/2018 8
6 PO105 Dd 2/1/2018 30
7 PO106 Bb 3/1/2018 15
8 PO107 Bb 4/1/2018 10
...
我有一个名为 Supplier Bb Data
的单独 sheet,它应该 return 供应商 Bb 的 Purchases
数据的行号。公式如下所示,位于 A10
、A11
、A12
等单元格中:
=SMALL(IF('Purchases'!$B:$B=$A, ROW('Purchases'!$B:$B)), ROW(1:1))
=SMALL(IF('Purchases'!$B:$B=$A, ROW('Purchases'!$B:$B)), ROW(2:2))
=SMALL(IF('Purchases'!$B:$B=$A, ROW('Purchases'!$B:$B)), ROW(3:3))
...
A1
in Supplier Bb Data
包含要查找的值 "Bb"。
这个公式有效;它更正了来自 Purchases
的 returns 行号,其中包括供应商 Bb 的采购订单。 (3
、5
、7
、8
等)
但是,我希望能够 return 更具体的数据:Supplier = Bb
AND PO_Date >= 1/1/2018
和 PO_Date <= 3/1/2018
的行。因此,returning 5
和 7
.
看起来很简单;我试过这个(假设 1/1/2018
和 3/1/2018
分别在单元格 A2
和 A3
中:
=SMALL(IF(AND('Purchases'!$B:$B=$A, 'Purchases'!$C$C>=$A, 'Purchases!$C$C<=$A),
ROW('Purchases'!$B:$B)), ROW(1:1))
当我尝试这个时,excel 只是第一行 returns 0
,并且所有后续行都出错。
AND()
是否在 IF()
语句中根本不起作用?我还能做些什么来让它发挥作用?
对于这些单元格,我总是按 Ctrl+Shift+Enter
,因为它们是数组公式,所以这不是问题所在。
AND函数自己进行循环(数组式)计算。随后,AND 或 OR 函数在数组样式 (CSE) 公式中不能与其他函数很好地协同工作。将条件堆叠在嵌套 IF 中或根据您的目的使用 AGGREGATE。
'array style with CSE
=SMALL(IF(Purchases!$B:$B=$A, IF(Purchases!$C:$C>=$A, IF(Purchases!$C:$C<=$A, ROW($B:$B)))), ROW(1:1))
'standard style without CSE
=AGGREGATE(15, 7, ROW(B:B)/((Purchases!B:B=A)*(Purchases!C:C>=A)*(Purchases!C:C<=A)), ROW(1:1))
- 您在
'Purchases'!$C$C
中缺少一个:
。 - 工作簿中所有工作表的行数相同。
ROW(B:B)
可以用来代替ROW('Purchases'!$B:$B))
。 ROW(1:1)
表示您正在向下拖动连续的 k 个参数。无需将列锁定为绝对列。如果不使用完整的列引用,具有循环计算的数组公式或函数的执行效率会高得多。考虑以下因素:
=AGGREGATE(15, 7, ROW(:9)/((Purchases!B:B9=A)*(Purchases!C:C9>=A)*(Purchases!C:C9<=A)), ROW(1:1))
或者,您可以将 SMALL+IF 与 SUMPRODUCT 函数结合使用 (Ctrl+Shift+Enter):
=IFERROR(SUMPRODUCT(SMALL(IF((Purchases!$B:$B=$A)*(Purchases!$C:$C>=$A)*(Purchases!$C:$C<=$A)=0,"",(ROW(Purchases!$B:$B))),ROW(1:1))),"")