检测数组中重复值的最快方法?(VBA)



为了检测VBA数组中的重复值,我目前正在使用一个函数来检查数组中的每个值,数组中的后续值是否不同:

Public Function ContainsDuplicateKeys() As Boolean
Dim inputKeyArray As Variant
inputKeyArray = MyWorksheet.Range("MyTable[InputKey]")
Dim i As Long
Dim j As Long
For i = LBound(inputKeyArray) To UBound(inputKeyArray)
For j = i + 1 To UBound(inputKeyArray)
If inputKeyArray(i, 1) = inputKeyArray(j, 1) Then
ContainsDuplicateKeys = True
Exit Function
End If
Next
Next
ContainsDuplicateKeys = False
End Function

要检查 n 个值的数组是否唯一,此方法涉及执行 1 + 2 + ... + (n-1( 比较。因此,检查 10,000 个输入的唯一性需要多达 49,995,000 次比较,这大约需要 13 秒。

相反,对于相同数量的输入,Excels的"删除重复项"功能完成所需的时间几乎是瞬时的。这意味着必须有一种更有效的方式来实现我试图做的事情。谁能建议这可能是什么?

您可以使用Application.Match()函数:

Public Function ContainsDuplicateKeys() As Boolean
Dim inputKeyArray As Variant
inputKeyArray = MyWorksheet.Range("MyTable[InputKey]")
Dim i As Long
For i = UBound(inputKeyArray) To LBound(inputKeyArray) Step -1
If Application.Match(inputKeyArray(i, 1), inputKeyArray, 0) <> i Then
ContainsDuplicateKeys = True
Exit Function
End If
Next
End Function

最新更新