答案 0 :(得分:1)
当您插入两行时,发生了一些导致转变的事情。
ROW($B$1:$B$1000)
成为ROW($B$3:$B$1002)
。这不是为了返回工作表上的实际行。它旨在返回在INDEX function引用的范围内的位置。在您的第一个公式中,这些是相同的,因为您使用了INDEX($A$1:$A$1000, ...
但在插入两行后它变为INDEX($A$3:$A$1002, ...
。 ROW($B$3:$B$1002)
返回的最小值为 3 ,而不是 1 ,因此您无法获得$A$3:$A$1002
中的第一行
SMALL function的 k 参数也用于返回一系列连续数字(例如 1,2,3,... )。原来ROW(C1)
会返回 1 然后 2,3,... ,因为公式已经填满。这返回了最小的,然后是第二个最小的,然后是第三个最小的,等等。在插入两行之后,这变为ROW(C3)
,它将返回第三个最小的并从那里继续。
您的array¹公式已修复,以反映两个插入的行
=IFERROR(INDEX($A$3:$A$1002, SMALL(IF($E$3=$B$3:$B$1002, ROW($1:$1000)), ROW(1:1))),"")
请注意,ROW($1:$1000)
和INDEX($A$3:$A$1002, ...
甚至不会反映相同的行,但它们的行数相同。 ROW(1:1)
将返回 1,2,3 ... ,因为它已填满,从而返回最小,第二小,第三小等等。
关于您的不完全匹配,您可以通过几种方式应用通配符搜索。我通常使用SEARCH² function进行与ISNUMBER function配对的通配符搜索,以处理不匹配的$N/A
返回。
=IFERROR(INDEX($A$3:$A$1002, SMALL(IF(ISNUMBER(SEARCH("*"&$E$3&"*", $B$3:$B$1002)), ROW($1:$1000)), ROW(1:1))),"")
使用较新的AGGREGATE³ function可以免除阵列¹输入您的公式。
=IFERROR(INDEX($A$3:$A$1002, AGGREGATE(15, 6, ROW($1:$1000)/ISNUMBER(SEARCH($E$3, $B$3:$B$1002)), ROW(1:1))),"")
¹数组公式需要用 Ctrl + Shift + Enter↵完成。一旦正确输入第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。
² SEARCH function不区分大小写。如果需要区分大小写的定位功能,请改用FIND function。
³{2010}引入了AGGREGATE function。它在早期版本中不可用。