2016-03-16 9 views
11

これを行うより速い方法がありますか?この時点unique.keysVBAの列の一意の値をすばやく取得する方法はありますか?

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 

は私が必要なものを取得しますが、ループ自体が、これはPythonのような言語では全く問題にならないのに対し、(十何千ものレコードのを持っているファイルに対して非常に遅くなるように思われますまたはC++)。

+0

使用すると、彼らはすべてC++あるとして、特にスピードのために、VBAのための作り付けの機能が優れていています。 @florentbrよりもはるかに速い、VBAの*の列の一意の値をすべて得るためのExcelの組み込み関数の答えを参照してください。 –

答えて

5

配列の値をロードすると、はるかに高速になります:

Dim data(), unique As Variant, r As Long 
data = ws.UsedRange.Value 

Set unique = CreateObject("Scripting.Dictionary") 
For r = 1 To UBound(data) 
    unique(data(r, some_column_number)) = Empty 
Next r 

ます。また、Scripting.Dictionaryのための事前バインディングを検討する必要があります。

Dim unique As New Scripting.Dictionary 
+0

初期バインディングを使用すると、見つからないエラーが発生します –

+0

参照 "Microsoft Scripting Runtime" –

+0

私は既にそれを追加しました。 "Scripting"の ".Dictionary"を見つけることができないようです。 –

0

この

Option Explicit 

Sub UniqueValues() 
Dim ws As Worksheet 
Dim uniqueRng As Range 
Dim myCol As Long 

myCol = 5 '<== set it as per your needs 
Set ws = ThisWorkbook.Worksheets("unique") '<== set it as per your needs 

Set uniqueRng = GetUniqueValues(ws, myCol) 

End Sub 


Function GetUniqueValues(ws As Worksheet, col As Long) As Range 
Dim firstRow As Long 

With ws 
    .Columns(col).RemoveDuplicates Columns:=Array(1), header:=xlNo 

    firstRow = 1 
    If IsEmpty(.Cells(1, col)) Then firstRow = .Cells(1, col).End(xlDown).row 

    Set GetUniqueValues = Range(.Cells(firstRow, col), .Cells(.Rows.Count, col).End(xlUp)) 
End With 

End Function 

をお試しくださいそれは非常に高速でなければならない欠点なしでNeepNeepNeepについて語った

14

これを行うにはExcelのAdvancedFilter関数を使用します(Excels inbuilt C++を使用するのが最も速い方法です)。

コピー列Aの値とB列で一意の値を挿入します。

Range("A1:A6").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True 
それはあまりにも複数の列で動作します

Range("A1:B4").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("D1:E1"), Unique:=True 
+0

***あまりにも簡単!***恐ろしい、私はそれを愛する、ありがとう! – ashleedawg

4

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 
+1

これは素晴らしいです! – AntiDrondert

関連する問題