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

时间:2018-10-08 16:11:44

标签: arrays vba duplicates

要检测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秒。

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

1 个答案:

答案 0 :(得分:0)

您可以使用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