2016-02-26 76 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

相关问题