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 数据的行号。公式如下所示,位于 A10A11A12 等单元格中:

=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 的采购订单。 (3578 等)

但是,我希望能够 return 更具体的数据:Supplier = Bb AND PO_Date >= 1/1/2018PO_Date <= 3/1/2018 的行。因此,returning 57.

看起来很简单;我试过这个(假设 1/1/20183/1/2018 分别在单元格 A2A3 中:

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