Excel VBA:如何从表中删除重复值?

时间:2018-04-21 06:42:53

标签: excel vba excel-vba

彻底搜索了StackOverflow和谷歌,但没有找到答案。

尝试从Excel中的表格中删除重复值(不仅仅是电子表格)

当前代码:

Sub RemoveDuplicates()
ActiveSheet.ListObjects("Table1").ListColumns(1).DataBodyRange.RemoveDuplicates Columns:=1, Header:=xlYes
End Sub

问题:

此代码要求表格的每一列中的数据在被认为是重复之前是相同的。 (通过测试发现了这一点)。

目标:

仅在表的第1列中检查重复值,然后在找到重复项时删除整行。我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:3)

尝试以下代码:

Option Explicit

Sub RemoveDuplicates()

Dim TblRng As Range

Set TblRng = ActiveSheet.ListObjects("Table1").Range        
TblRng.RemoveDuplicates Columns:=1, Header:=xlYes

End Sub

答案 1 :(得分:1)

或者

Option Explicit

Sub RemoveDuplicates()
   ActiveSheet.ListObjects("Table1").DataBodyRange.RemoveDuplicates Columns:=1, Header:=xlNo
End Sub

答案 2 :(得分:0)

尝试,

ActiveSheet.ListObjects("Table1").Range.RemoveDuplicates Columns:=1, Header:=xlYes

enter image description here

答案 3 :(得分:0)

找到解决方案!实际上,这是一个解决方法。我为“.RemoveDuplicates”研究了20种不同的代码选项,并且没有成功。这是代码

Sub sbFindDuplicatesInColumn2()
    Dim lastRow As Long
    Dim matchFoundIndex As Long
    Dim iCntr As Long
    lastRow = Range("A65000").End(xlUp).Row

For iCntr = 1 To lastRow
  If Cells(iCntr, 1) <> "" Then
    matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 1), Range("A1:A" & lastRow), 0)
    If iCntr <> matchFoundIndex Then
            Cells(iCntr, 2).EntireRow.Delete xlShiftUp
            'Line below is because when a row is deleted the row numbers change so the next row is skipped via the counter unless we have the line below
            iCntr = iCntr - 1
   End If
  End If
Next

End Sub

关于代码的说明:

  • 判断工作表是否有表格
  • 保留第一个重复实例并删除其余部分(确保您的表首先正确排序!)
  • 仅在所需列中检查重复项,但会删除整行

花了这么多时间来做这么简单的事情。我希望这会有所帮助!

答案 4 :(得分:0)

我也有类似的问题。在Microsoft Docs中,Columns:=参数定义为数组。将代码中的参数更改为Columns:= Array(1,1)后,结果与预期的一样。我的代码现在是:

RefDest.DataBodyRange.RemoveDuplicates Columns:=Array(1, 1), Header:=xlNo

希望有帮助。

答案 5 :(得分:0)

假设您的表名为“数据”,而要查看的列为“ NumCode”,则此代码有效且简单:

    With ActiveWorkbook.Worksheets("Raw Data").ListObjects("Data")
        .Range.RemoveDuplicates Columns:=Array(.ListColumns("NumCode").Index), Header:=xlYes
    End With

因此,该列在表中的位置无关紧要,并且如果它被移动(添加或删除其他列)也没关系。