有更快的方法吗?
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)
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)
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)