INDEX 和 SMALL 只返回一个结果
INDEX and SMALL only returning one result
我编写的以下 Excel 公式有错误。
=IFERROR(INDEX([Testbook2.xlsx]Sheet1!$A$2:$B$6,SMALL(IF([Testbook2.xlsx]Sheet1!$B$2:$B$6="A",ROW ([Testbook2.xlsx]Sheet1!$A$2:$A$6)-ROW([Testbook2.xlsx]Sheet1!$A$2)+1),ROW([Testbook2.xlsx]Sheet1!1 :1)),1),"No Active Volunteers")
该代码应该在另一个工作簿 (Testbook2) 中的列中查找,其中输入的文本应该是 A 或 I。然后应该 return 所有带有 A 的名称在他们旁边。然而,它只是 return 的名字。
关于为什么会发生这种情况有什么想法吗?
我不太喜欢将公式变得比需要的更复杂。 ROW function 的目的是产生一系列序号。它用于记录范围内的位置,而不是工作表上的实际行。行引用在哪里并不重要;它不必引用您收集数据的 workbook/worksheet。
这些,
ROW([Testbook2.xlsx]Sheet1!$A:$A) - ROW([Testbook2.xlsx]Sheet1!$A) + 1
ROW([Testbook2.xlsx]Sheet1!1:1)
...可以缩短为,
ROW(:)
ROW(1:1)
[Testbook2.xlsx]Sheet1!$A$2:$A$6 中有 5 个单元格,所以您只需要一个介于 1 和 5 之间的数字。ROW(1:1)
是一个 1,它将成为一个 2 然后一个 3,等等,因为它被填满了。它提供了SMALL function的k参数。不管它来自哪里。
一旦我将这些削减到实际需要的程度,很明显您的公式在当前状态下有效。但是,它是一个数组公式,而不是SQL公式。
=IFERROR(INDEX([Testbook2.xlsx]Sheet1!$A:$A, SMALL(IF([Testbook2.xlsx]Sheet1!$B:$B="A", ROW(:)), ROW(1:1))), "No Active Volunteers")
数组公式需要用Ctrl+Shift+Enter↵完成。一旦正确输入第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。如果没有特殊的 CSE 终结,您将只会获得第一个值,然后会出现错误。
如果您正在寻找不需要 CSE 的标准公式,那么 AGGREGATE¹ function 函数可以提供类似伪数组的处理而无需使用 CSE。
=IFERROR(INDEX([Testbook2.xlsx]Sheet1!$A:$A, AGGREGATE(15, 6, ROW(:)/([Testbook2.xlsx]Sheet1!$B:$B="A"), ROW(1:1))),"No Active Volunteers")
¹ AGGREGATE function 是在 Excel 2010 中引入的。它在早期版本中不可用。
对于 Excel 的 2010 之前版本,此标准公式也不需要 CSE。
=IFERROR(INDEX([Testbook2.xlsx]Sheet1!$A:$A, SMALL(INDEX(ROW(:)+([Testbook2.xlsx]Sheet1!$B:$B<>"A")*1E+99, , ), ROW(1:1))),"No Active Volunteers")
既然您已经决定提供要使用的实际工作簿名称、工作表名称和范围,下面是工作公式,
作为数组公式(所有范围大小相同),
=IFERROR(INDEX('[Volunteer Contact list July 2015.xlsm]Volunteers'!$A:$A, SMALL(IF('[Volunteer Contact list July 2015.xlsm]Volunteers'!$Q:$Q="A",ROW(:)),ROW(1:1))),"No Active Volunteers")
作为标准公式(所有范围大小相同),
=IFERROR(INDEX('[Volunteer Contact list July 2015.xlsm]Volunteers'!$A:$A, SMALL(INDEX(ROW(:)+('[Volunteer Contact list July 2015.xlsm]Volunteers'!$Q:$Q<>"A")*1E+99, , ), ROW(1:1))),"No Active Volunteers")
根据公式类型将每个适当地输入单元格。根据需要填写,以便后续记录。
我编写的以下 Excel 公式有错误。 =IFERROR(INDEX([Testbook2.xlsx]Sheet1!$A$2:$B$6,SMALL(IF([Testbook2.xlsx]Sheet1!$B$2:$B$6="A",ROW ([Testbook2.xlsx]Sheet1!$A$2:$A$6)-ROW([Testbook2.xlsx]Sheet1!$A$2)+1),ROW([Testbook2.xlsx]Sheet1!1 :1)),1),"No Active Volunteers")
该代码应该在另一个工作簿 (Testbook2) 中的列中查找,其中输入的文本应该是 A 或 I。然后应该 return 所有带有 A 的名称在他们旁边。然而,它只是 return 的名字。
关于为什么会发生这种情况有什么想法吗?
我不太喜欢将公式变得比需要的更复杂。 ROW function 的目的是产生一系列序号。它用于记录范围内的位置,而不是工作表上的实际行。行引用在哪里并不重要;它不必引用您收集数据的 workbook/worksheet。
这些,
ROW([Testbook2.xlsx]Sheet1!$A:$A) - ROW([Testbook2.xlsx]Sheet1!$A) + 1
ROW([Testbook2.xlsx]Sheet1!1:1)
...可以缩短为,
ROW(:)
ROW(1:1)
[Testbook2.xlsx]Sheet1!$A$2:$A$6 中有 5 个单元格,所以您只需要一个介于 1 和 5 之间的数字。ROW(1:1)
是一个 1,它将成为一个 2 然后一个 3,等等,因为它被填满了。它提供了SMALL function的k参数。不管它来自哪里。
一旦我将这些削减到实际需要的程度,很明显您的公式在当前状态下有效。但是,它是一个数组公式,而不是SQL公式。
=IFERROR(INDEX([Testbook2.xlsx]Sheet1!$A:$A, SMALL(IF([Testbook2.xlsx]Sheet1!$B:$B="A", ROW(:)), ROW(1:1))), "No Active Volunteers")
数组公式需要用Ctrl+Shift+Enter↵完成。一旦正确输入第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。如果没有特殊的 CSE 终结,您将只会获得第一个值,然后会出现错误。
如果您正在寻找不需要 CSE 的标准公式,那么 AGGREGATE¹ function 函数可以提供类似伪数组的处理而无需使用 CSE。
=IFERROR(INDEX([Testbook2.xlsx]Sheet1!$A:$A, AGGREGATE(15, 6, ROW(:)/([Testbook2.xlsx]Sheet1!$B:$B="A"), ROW(1:1))),"No Active Volunteers")
¹ AGGREGATE function 是在 Excel 2010 中引入的。它在早期版本中不可用。
对于 Excel 的 2010 之前版本,此标准公式也不需要 CSE。
=IFERROR(INDEX([Testbook2.xlsx]Sheet1!$A:$A, SMALL(INDEX(ROW(:)+([Testbook2.xlsx]Sheet1!$B:$B<>"A")*1E+99, , ), ROW(1:1))),"No Active Volunteers")
既然您已经决定提供要使用的实际工作簿名称、工作表名称和范围,下面是工作公式,
作为数组公式(所有范围大小相同),
=IFERROR(INDEX('[Volunteer Contact list July 2015.xlsm]Volunteers'!$A:$A, SMALL(IF('[Volunteer Contact list July 2015.xlsm]Volunteers'!$Q:$Q="A",ROW(:)),ROW(1:1))),"No Active Volunteers")
作为标准公式(所有范围大小相同),
=IFERROR(INDEX('[Volunteer Contact list July 2015.xlsm]Volunteers'!$A:$A, SMALL(INDEX(ROW(:)+('[Volunteer Contact list July 2015.xlsm]Volunteers'!$Q:$Q<>"A")*1E+99, , ), ROW(1:1))),"No Active Volunteers")
根据公式类型将每个适当地输入单元格。根据需要填写,以便后续记录。