Самый быстрый способ обнаружить повторяющиеся значения в массиве?(VBA), - PullRequest
0 голосов
/ 08 октября 2018

Чтобы обнаружить дублирующиеся значения в массиве 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 для того же количества входов, почти мгновенно,Это подразумевает, что должен быть гораздо более эффективный способ достижения того, что я пытаюсь сделать.Кто-нибудь может подсказать, что это может быть?

1 Ответ

0 голосов
/ 08 октября 2018

вы можете использовать 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
...