2016-02-26 48 views
0

我試圖刪除工作表中的所有重複項,條件是一列中的A列和B列中的值在任何其他行的A列和B列中重複。列數是無關緊要的。有人可以證明我要去哪裏嗎?基於兩個單元格刪除工作表中重複項的宏

我當前的代碼:

Sub RemoveDuplicate() 
    Dim rCell As Range 
    Dim rRange As Range 
    Dim lCount As Long 
    Dim sh As Worksheet 

    Set sh = ThisWorkbook.Sheets("Data") 
    lCount = sh.Range("A2", sh.Range("A2").End(xlDown)).Rows.Count + 1 
    Set rRange = sh.Range("A2:B" & lCount) 

    For lCount = lCount To 1 Step -1 
     With rRange("A" & lCount & ",B" & lCount) 
      If WorksheetFunction.CountIf(rRange, .Value) > 1 Then 
       .EntireRow.Delete 
      End If 
     End With 
    Next lCount 

End Sub 

例子:

| A | B | 
|00001|12345| - KEEP 
|00002|12345| - KEEP 
|00003|12345| - KEEP 
|00001|12346| - KEEP 
|00001|12346| - REMOVE 
|00001|12347| - KEEP 
|00004|12345| - KEEP 
|00002|12345| - REMOVE 

固定碼:

Sub RemoveDuplicate() 
    Dim lCount As Long 
    Dim sh As Worksheet 
    Set sh = ThisWorkbook.Sheets("Data") 
    lCount = sh.Range("A2", sh.Range("A2").End(xlDown)).Rows.Count + 1 
    sh.Range("A1:B" & lCount).RemoveDuplicates Columns:=Array(1,2), Header:=xlYes 
End Sub 
+0

錯誤應該在這行'如果WorksheetFunction.CountIf(rRange,.Value)> 1 Then'。當你根據你的'With'語句調用'.Value'時,excel會返回一個數組,而不是一個條件。嘗試爲您的場景使用'CountIfs'函數 – Rosetta

+0

儘量不要使用'lCount'來計算行數和迭代次數。您可以聲明一個單獨的變量,例如爲了達到迭代的目的。這使得你的代碼不會對自己產生困惑 – Rosetta

回答

1

只是使用過人之處內置式兩份的去除,例如

ActiveSheet.Range。( 「A1:B100」)RemoveDuplicates柱:=陣列(1, 2), Header:= xlYes

+0

真棒,感謝ninjaRoche。我改變了這個接受的答案,因爲它更乾淨。上面編輯的最終代碼。 – Joe

0

我的意思是:

此塊

With rRange("A" & lCount & ",B" & lCount) 
    If WorksheetFunction.CountIf(rRange, .Value) > 1 Then 
     .EntireRow.Delete 
    End If 
End With 

應該是

If worksheetfunction.countifs(_ 
    sh.range("A2:A" & lcount), sh.range("A" & lcount), _ 
    sh.range("B2:B" & lcount), sh.range("B" & lcount)) > 0 Then 

    sh.range("A" & lcount).Entirerow.delete 
end if 
+0

似乎這是正確的..但它消除了不同選項卡上的單元格。我對宏不太熟悉 - 這裏發生了什麼? – Joe

+0

只需添加'sh.'。我已編輯我的答案以顯示更改。請注意,您已將'sh'綁定到名爲「Data」的工作表 – Rosetta

+0

感謝您的幫助 - 我發佈了上面的最終代碼。 – Joe

相關問題