2012-02-24 115 views
1

我需要讀取包含多個條目的文件並構建一個包含文件摘要的表格。在讀取的文件中,可能有多個條目中的一個值,總結中只需要單個條目,並且必須對它們進行排序。VBA:建立無重複表格的高效方法

我已經實現了兩個方法:

  1. 我用一個循環來檢查,如果輸出表已經包含的值,如果不添加它。循環遍歷整個列表(未排序)

  2. 「優化」1:在每次插入一個新值之後,該表正在進行排序,並且在找到值時循環正在中止。

兩種方法都做了他們的工作,但花了很長時間。有沒有更有效的方法來做到這一點?

編輯

爲了更好的理解:我的文件看起來像這樣

a 
d 
b 
c 
a 

和我的列表/表應該是這樣的:

a 
b 
c 
d 
+0

您的問題有點含糊,但您可以使用集合或字典來測試是否已經找到一個值。 – assylias 2012-02-24 11:52:09

+0

與SELECT DISTINCT套裝會http://support.microsoft.com/kb/257819? – Fionnuala 2012-02-24 11:56:05

+0

assylias:我增加了一個例子,我希望這會有助於理解。Remou:ADO解決方案看起來不錯,但爲了更好的兼容性,我只想在標準的excel vba中做到這一點。 – poeschlorn 2012-02-24 12:02:40

回答

2

下面是一個簡單的例子,使用詞典:

Sub test() 

    Dim a As Variant 
    Dim dict As Variant 
    Dim i As Long 

    Set dict = CreateObject("Scripting.Dictionary") 
    ReDim a(1 To 4) As Variant 

    a(1) = "a" 
    a(2) = "b" 
    a(3) = "c" 
    a(4) = "a" 
    For i = 1 To 4 
    If Not dict.exists(a(i)) Then dict.Add a(i), i 
    Next i 

    MsgBox "array size = " & UBound(a, 1) & " and dict size = " & dict.Count 'respectively 4 and 3 

End Sub 
+0

另外,如果您將數據放在工作表中並循環遍歷單元格,這可能是整體性能的重要因素,但您並未具體指出如何讀取數據。 – assylias 2012-02-24 12:21:18

+0

我要弄清楚,如何使用數組而不是迭代通過單元格影響我的算法的效率 – poeschlorn 2012-02-27 08:46:17

1

您是否嚴格使用VBA?嗯,我認爲這個想法可以記錄到宏...

我要強調重複值的列,然後做一個濾鏡>高級篩選>複製到另一個位置> [X],唯一值僅

然後對它給出的唯一值的結果表進行排序。

3

如果您使用Excel 2010,則內置了刪除重複項的功能。

我會從您的文件導入所有數據,然後刪除重複項。

從UI,選擇您的數據,然後點擊數據標籤,刪除重複。出現提示時,選擇所需的選項,然後單擊確定。

VBA提供了相同的功能。

Sub Remove_Duplicates() 
    ActiveSheet.Range("$A$1:$B$500").RemoveDuplicates _ 
    Columns:=Array(1, 2), Header:=xlYes 
End Sub 

在Excel 2003及更早版本中,可以使用此VBA。它使用內置的高級過濾功能。

Sub Remove_Duplicates_2003() 

    Range("A1:B500").AdvancedFilter Action:=xlFilterCopy, _ 
    CopyToRange:=Range("C1"), Unique:=True 

    Columns("A:B").Delete Shift:=xlToLeft 

End Sub 
+0

嗨,我使用Excel 2003.您發佈的代碼段看起來不錯,但在2003年不起作用。 「範圍」沒有這樣的方法。有沒有類似的有效解決方法? – poeschlorn 2012-02-27 09:35:40

+0

代碼使用的功能僅在Excel 2010中存在。我添加了適用於Excel 2003及更早版本的代碼。 – 2012-02-27 21:03:20