更快地获取VBA中列的所有唯一值?

AJJ*_*AJJ 24 excel vba

有更快的方法吗?

Set data = ws.UsedRange

Set unique = CreateObject("Scripting.Dictionary")

On Error Resume Next
For x = 1 To data.Rows.Count
    unique.Add data(x, some_column_number).Value, 1
Next x
On Error GoTo 0
Run Code Online (Sandbox Code Playgroud)

在这一点上unique.keys获得了我需要的东西,但是对于拥有成千上万条记录的文件来说,循环本身似乎非常慢(而在Python或C++这样的语言中,这根本不是问题).

Jer*_*son 32

使用Excel的AdvancedFilter函数执行此操作(使用Excel内置C++是最快的方法).

复制A列中的值并在B列中插入唯一值:

Range("A1:A6").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True
Run Code Online (Sandbox Code Playgroud)

它也适用于多列:

Range("A1:B4").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("D1:E1"), Unique:=True
Run Code Online (Sandbox Code Playgroud)

  • `AdvancedFilter` 不是最快的方法。在大型数据集上,使用字典的性能将优于“AdvancedFilter”(对于 100k 单元,约 500 毫秒 vs 约 60 秒)。 (3认同)
  • ***太容易了!***太棒了,我喜欢它,谢谢! (2认同)

Flo*_* B. 13

加载数组中的值会快得多:

Dim data(), dict As Object, r As Long
Set dict = CreateObject("Scripting.Dictionary")

data = ActiveSheet.UsedRange.Columns(1).Value

For r = 1 To UBound(data)
    dict(data(r, some_column_number)) = Empty
Next

data = WorksheetFunction.Transpose(dict.keys())
Run Code Online (Sandbox Code Playgroud)

您还应该考虑对Scripting.Dictionary进行早期绑定:

Dim dict As New Scripting.Dictionary  ' requires `Microsoft Scripting Runtime` '
Run Code Online (Sandbox Code Playgroud)


小智 10

这很有趣,因为我不得不一遍又一遍地阅读这些说明,但我认为我找到了一种更快的方法来做到这一点:

Set data = ws.UsedRange
dim unique as variant
unique = WorksheetFunction.Unique(data)
Run Code Online (Sandbox Code Playgroud)

然后你可以对数组做任何你想做的事情,unique比如迭代它:

For i = LBound(unique) To UBound(unique)
    Range("Q" & i) = indexes(i, 1)
Next
Run Code Online (Sandbox Code Playgroud)

  • 我认为此功能仅在 Office 365 中可用 (4认同)

bre*_*tdj 5

PowerShell是一个非常强大和高效的工具.这是作弊,但通过VBA炮轰PowerShell打开了很多选项

下面的大部分代码只是将当前工作表保存为csv文件.输出是另一个只有唯一值的csv文件

Sub AnotherWay()
Dim strPath As String
Dim strPath2 As String

Application.DisplayAlerts = False
strPath = "C:\Temp\test.csv"
strPath2 = "C:\Temp\testout.csv"
ActiveWorkbook.SaveAs strPath, xlCSV
x = Shell("powershell.exe $csv = import-csv -Path """ & strPath & """ -Header A | Select-Object -Unique A | Export-Csv """ & strPath2 & """ -NoTypeInformation", 0)
Application.DisplayAlerts = True

End Sub
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了! (2认同)