如何加快在 Excel 中搜索大列的速度?

hek*_*ran 3 microsoft-excel

我在 Excel 文档中有 2 个工作表。我有一个工作表,我想计算一个值是否在第二个工作表的列中。第二个工作表的列是请勿呼叫列表中的电话号码列表。目标是找出第一张表中的哪些电话号码在不呼叫列表中。

我的公式使用MATCH()函数:

=MATCH(A2, 'DNC Worksheet'!$C$2:$C$100000, 0)

我遇到的问题是公式查看的数据列非常大(约 100,000 行)。我计算这个公式大约 25,000 次。结果是 Excel 打开、保存和滚动文件的速度非常慢。

有没有更高效的方式来进行这种搜索?也许有一种方法可以在数据结构中缓存不呼叫号码?

Pet*_*ert 10

有一种方法可以显着加快速度(因子 3,000,请参见下面的解释):如果对 worksheet 中 C 列中的数据进行排序DNC Worksheet,则可以在末尾MATCH不带 的情况下运行0,即=MATCH(A2,'DNC Worksheet'!$C:$C)。(旁注:Excel 2007 及更高版本在使用完整列时非常聪明,因此无需在此处指定 100000!)。

这种方法的最初缺点是,即使 A2 未包含在 C 列中,您也将获得匹配项。 但是,可以使用以下公式处理此问题:

=IF(INDEX('DNC Worksheet'!$C:$C,MATCH(A2,'DNC Worksheet'!$C:$C))=A2,MATCH(A2,'DNC Worksheet'!$C:$C) ,"不匹配")

当然,通过在一个单元格(例如 B2)中进行匹配,您可以将计算时间减半,然后在下一个单元格中使用它=IF(INDEX('DNC Worksheet'!$C:$C,B2)=B2,B2,"no match")

一些背景:

如果您在末尾提供MATCH(或VLOOKUP)0/FALSE参数,Excel 将执行精确搜索,即从 C2 中的第一个单元格开始,检查它是否匹配。如果没有,它会继续下一个,直到找到该值 - 或产生N/A!错误。因此,如果您有 100,000 个数据集,它将平均进行 50,000 次比较,直到找到该值 (=n/2) - 因此在您的情况下,计算总数为 1.25B!

如果FALSE省略该参数,Excel 假定范围已排序并应用二进制搜索算法:它从范围的中间开始,即单元格 50,000 并检查其值是更大还是更小。假设它更大,您尝试匹配的值因此必须在单元格 1 和 50,000 之间。现在它再次检查这个范围的中间,等等。因此,它将进行 log2(n) 比较,在您的情况下为 ~17。所以计算的总数只有 425K,也就是说它的计算速度会快 3,000 倍!:-)

为了进一步阅读/性能调整,我推荐这个网站