【问题标题】:Fastest way to detect duplicate values in array? (VBA)检测数组中重复值的最快方法? (VBA)
【发布时间】:2019-03-13 08:41:52
【问题描述】:

为了检测 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 的“删除重复项”功能完成所需的时间几乎是瞬时的。这意味着必须有一种更有效的方法来实现我正在尝试做的事情。谁能建议这可能是什么?

【问题讨论】:

  • @Marcucciboy2 支持该链接特别建议使用字典而不是数组,以确保没有重复。
  • 另外...为什么不在加载数组之前使用“删除重复”功能(将该范围复制到临时表,RemoveDuplicates()),加载数组,删除临时范围。
  • “第三次”该链接。 this one 还涵盖了关于字典的一切。字典是处理独特数据的收集/存储的最简单方法。
  • 最后...如果您的潜在重复项位于一维数组中,那么您可以先排序,然后进行重复数据删除,这将是一个 TON 更快(如果您很难在这里使用数组)。

标签: arrays vba duplicates


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2015-02-20
    • 2021-06-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多