我更喜欢使用 Excel 数组公式(但如果它只能在 VBA 中完成,那就这样吧)从包含特定文本的列数组中复制所有单元格。下图显示了我所追求的以及我所尝试过的。我正在接近(感谢类似但不同的问题),但无法完全到达我想要的地方。目前,我只得到第一个单元格,而不是所有单元格。在我的实际应用程序中,我正在搜索大约 20,000 个单元格,并且将有几百个搜索词。我预计大多数搜索词都会为我提供大约 8 - 12 个具有该值的单元格。
我正在使用的公式:
=INDEX($A$4:$A$10,MATCH(FALSE,ISERROR(SEARCH($C$1,$A$4:$A$10)),0))
为了使这项工作高效进行,我建议使用一个单独的单元格来保存结果计数(我使用单元格 C2),其中包含以下公式:
=COUNTIF(A:A,"*"&C1&"*")
然后在单元格 C4 中并向下复制,使用此数组公式(
-3
只是因为标题行是第 3 行。如果标题行是第 1 行,则为 -1
):
=IF(ROW(A1)>$C$2,"",INDEX($A$4:$A$21000,SMALL(IF(ISNUMBER(SEARCH($C$1,$A$4:$A$21000)),ROW($A$4:$A$21000)-3),ROW(C1))))
我使用 A 列中的 21000 行数据进行了测试,每个搜索字符串平均有 30 个结果,并将公式复制到 C 列中的 60 个单元格。有了这么多数据,大约需要 1-2 秒才能完成重新计算。重新计算时间可能会有很大差异,具体取决于工作簿中的其他因素(附加公式、嵌套依赖项、易失性函数的使用等)以及您的硬件。
或者,您可以只使用内置的过滤器功能,但我希望这会有所帮助。
您需要获取行。将其放入 C4 并复制下来。
=IFERROR(AGGREGATE(15,6, IF(SEARCH($C$1, $A$4:$A$10)>0, ROW($A$4:$A$10)), ROW($C4)-ROW($A$4)+1), "")
数组公式所以使用ctrl-shift-Enter
使用FILTER怎么样:
=FILTER($A$4:$A$10,ISNUMBER(SEARCH($C$1,$A$4:$A$10)))
或者...我通常建议使用表格...请参阅https://youtu.be/Ss3AY-oJHDo?si=93FfkMlm7d6lGyiZ..。您可以使用表[列]引用而不是固定单元格引用:
=FILTER(Table1[Array of Strings],ISNUMBER(SEARCH($C$1,Table1[Array of Strings])))
额外:您可以将其用于下拉列表(又名数据验证作为列表)...参见下图...只需将数据验证添加到单元格=$C$5#(注意末尾的“#”,它告诉您使用动态数组的数据验证。
=$C$5#