2017-04-03 15 views
1

這是來自How to remove duplicates that are case SENSITIVE in Excel (for 100k records or more)? 的後續問題。如何在Excel中找到區分大小寫的重複項時刪除整行(對於100k條記錄或更多)?

因爲他的代碼程序操縱A列的數據而已,我想也刪除數據整行如果區分大小寫重複被發現。

區分大小寫的含義:

  1. 案例1
  2. 案例1
  3. CASE1

都是獨一無二的記錄。

+0

您可以通過一系列循環,當它發現一個區分大小寫的重複,不要說'細胞(1,1).EntireRow.Delete'。注意:你需要向後循環,例如'For i = lastRow to 1 Step -1' – BruceWayne

+1

@BruceWayne,對於100k +記錄肯定不是個好主意? – CallumDA

+0

@CallumDA好趕上,我一直在打這個內存限制錯誤(https://i.stack.imgur.com/PNRZN.png)。 所以我認爲唯一的方法是使用字典或有其他方式? – compski

回答

4

您可以使用Dictionary來檢查二進制唯一性和變體數組以加快速度。要使用字典,你將需要包括對Microsoft腳本運行時的參考圖書館

(工具>參考> Microsoft腳本運行時庫)

我已經擁有10萬行,其平均需要0.25測試這在我的筆記本電腦上秒

Sub RemoveDuplicateRows() 
    Dim data As Range 
    Set data = ThisWorkbook.Worksheets("Sheet1").UsedRange 

    Dim v As Variant, tags As Variant 
    v = data 
    ReDim tags(1 To UBound(v), 1 To 1) 
    tags(1, 1) = 0 'keep the header 

    Dim dict As Dictionary 
    Set dict = New Dictionary 
    dict.CompareMode = BinaryCompare 

    Dim i As Long 
    For i = LBound(v, 1) To UBound(v, 1) 
     With dict 
      If Not .Exists(v(i, 1)) Then 'v(i,1) comparing the values in the first column 
       tags(i, 1) = i 
       .Add Key:=v(i, 1), Item:=vbNullString 
      End If 
     End With 
    Next i 

    Dim rngTags As Range 
    Set rngTags = data.Columns(data.Columns.count + 1) 
    rngTags.Value = tags 

    Union(data, rngTags).Sort key1:=rngTags, Orientation:=xlTopToBottom, Header:=xlYes 

    Dim count As Long 
    count = rngTags.End(xlDown).Row 

    rngTags.EntireColumn.Delete 
    data.Resize(UBound(v, 1) - count + 1).Offset(count).EntireRow.Delete 
End Sub 

基礎上輝煌的答案從this question

+0

哇,令人難以置信的快速,任何想法如何保持數組中的一切?換句話說,刪除不在數組中的所有內容? – Lowpar

+0

@Lowpar,對不起,我不太明白? Dim dict As Dictionary的 – CallumDA

+0

。我得到了「用戶定義類型未定義」。堅持,當我發現爲什麼我得到這個錯誤 – compski

相關問題