当您插入两行时,发生了几件事导致了这种转变。
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),它将返回第三小的并从那里继续。
您的数组¹公式已固定以反映插入的两个行,
=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。
³AGGREGATE function 是随 Excel 2010 引入的。它在早期版本中不可用。