【发布时间】: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