我有两个非常大的清单。一个包含约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
答案 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秒(二进制搜索的速度非常快)