【问题标题】:Excel VBA: How To Remove Duplicate Values From Table?Excel VBA:如何从表中删除重复值?
【发布时间】:2018-10-01 20:22:51
【问题描述】:

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

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

当前代码:

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

问题:

此代码要求表的每一列中的数据必须相同,然后才会被视为重复。 (通过测试发现)。

目标:

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

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    试试下面的代码:

    Option Explicit
    
    Sub RemoveDuplicates()
    
    Dim TblRng As Range
    
    Set TblRng = ActiveSheet.ListObjects("Table1").Range        
    TblRng.RemoveDuplicates Columns:=1, Header:=xlYes
    
    End Sub
    

    【讨论】:

    • 看起来这会产生与原始代码相同的结果。如果每列中的数据都匹配(而不是仅匹配第 1 列数据),则仅删除重复行
    【解决方案2】:

    或者

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

    【讨论】:

    • @Jeeped 谢谢。而且我需要花一些时间来解决您对有关大型的其他问题的回答!
    • 经过测试。这也产生与原始代码相同的结果。如果每列中的数据都匹配(而不是仅匹配第 1 列数据),则仅删除重复行
    • 你能显示表格的截图并提供一些数据吗?它在我运行的测试中对我有用。从您的解决方案来看,这听起来很可疑XY problem
    【解决方案3】:

    找到解决方案!实际上,这是一种解决方法。我为“.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】:

      试试,

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

      【讨论】:

      • 经过测试,结果与原始代码相同。如果每列中的数据都匹配(而不是仅匹配第 1 列数据),则仅删除重复行
      • 好吧,这对我来说肯定不行。以上测试并按要求工作。
      【解决方案5】:

      我也遇到过类似的问题。在 Microsoft Docs 中,Columns:= 参数被定义为数组。将我的代码中的参数更改为 Columns:=Array(1,1) 后,结果符合预期。我现在的代码是:

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

      希望对您有所帮助。

      【讨论】:

        【解决方案6】:

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

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

        有了这个,列在表中的位置无关紧要,如果它被移动(添加或删除其他列),也没关系。

        【讨论】:

          猜你喜欢
          • 2011-12-09
          • 2019-01-10
          • 1970-01-01
          • 2018-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多