在Excel中的两个非常大的列表中查找匹配项

时间:2019-01-15 02:47:08

标签: excel excel-formula

我有两个非常大的清单。一个包含约130,000个项目(列表A),另一个包含约600,000列(列表B)。我需要知道列表A中的哪些项目出现在列表B中,但是我遇到了处理时间的限制。

我通常的方法是这样的:

将列表A放入A列,将列表B放入B列。将以下内容放入C1:

=Not(IsError(Match(A1,B$1:B$600000,0)))

然后我将其填写为C130000。

很明显,这可以处理两个列表,每个列表的长度为100。但是,列表太大,以至于我的计算机无法处理那么长的时间。

是否可以在Excel中使用一种方法来处理这么大的列表而无需花费一个月的时间?还是我需要开始寻找其他选择?

使用Office 365

2 个答案:

答案 0 :(得分:0)

下面的代码在6.2秒内检查了100个项目。按照这个速度,它应该在15分钟内完成130,000个工作。您可能会使用同一测试来查看处理更长的字符串需要花费多长时间。

Private Sub SearchForDuplicates()

    Dim Rng As Range
    Dim Arr As Variant, Arr2 As Variant
    Dim R As Long, i As Long
    Dim Tstart As Single

    Tstart = Timer
    Set Rng = Range(Cells(1, 1), Cells(600000, 1))
    Arr = Rng.Value
    ReDim Arr2(1 To 130000)
    Randomize
    For R = 1 To UBound(Arr2)
        Arr2(R) = Int((1200000 - 1 + 1) * Rnd + 1)
'        If R Mod 10000 = 0 Then Debug.Print R, Timer - Tstart
    Next R
    For R = 1 To UBound(Arr2)
        For i = 1 To UBound(Arr)
            If Arr2(R) = Arr(i, 1) Then
                Debug.Print "Found"
                Exit For
            End If
        Next i
        If R Mod 100 = 0 Then Exit For
'        If R Mod 1000 = 0 Then Debug.Print R, Timer - Tstart
    Next R
'    Rng.Value = Arr
    Debug.Print Timer - Tstart
End Sub

请注意,我测量的时间包括设置730,000个字符串进行测试的时间

答案 1 :(得分:0)

在B列中排序600000列表。然后在C列中使用

=IF(VLOOKUP(A1,$B$1:$B$600000,1,True)=A1,"Match","")

然后将公式复制为A列中的130000个项目。

在我的计算机上,对于A列中的100000多个项目,计算需要花费0.04秒(二进制搜索的速度非常快)