删除重复项,其中同一行中另一列的值= 0

时间:2015-09-30 15:50:11

标签: excel vba excel-vba

我有一个包含大约30k行数据和20列的工作表。 B列中的许多值都是重复的,我想删除这些重复项。我遇到的问题是,即使列b可能是重复的,其余列中的该行的数据也不一定是重复的,因此,如果列B中的值是重复的,则只删除该行,这一点很重要。列M = 0的值。

有没有办法对工作表中的每一行执行此操作(工作表名称为Test)?我想它涉及“For Each ...”,但我没有很多经验,并且无法找到任何其他可以完成此任务的宏。如果您需要我详细说明我想要完成的任务,请告诉我。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

除非您需要经常重复相同的过程,否则您也可以只过滤符合条件的行并手动删除它们。

如果您的数据是根据B列分类的,您可以在M列中添加一个公式,将B列中每个单元格的值与上方和下方的值进行比较,以识别重复项。

以下公式将检查单元格B是否与 AND 上方的值匹配 AND 如果列M = 0且结果为True / False。 = AND(OR(B2 = B1,B2 = B3),M2 = 0)

答案 1 :(得分:0)

这是VBA中的一种简单方法,可以像表格一样查询电子表格。你必须为你的特定情况调整RunQuery()方法,因为我不知道你的列名。

这假设如下:

  1. 您的工作表的布局类似于表格,第1行的列名称及其下方的数据
  2. 您在运行此代码之前保存了工作簿
  3. 在我的特定工作簿中,我有一个标记为“类别”的列,一个标记为“类型”的列,我添加了一个名为“DeleteMe”的列。

    'Adapt RunQuery for your particular needs
    Sub RunQuery()
        'Change this SQL statement to reflect your particular need
        SQL = "SELECT [Category], [Types] FROM %table(0)% GROUP BY [Category], [Types] HAVING Count(*) > 1"
    
        'Change "Sheet2" to your sheet name
        Set rs = QuerySheet(SQL, Sheet2)
    
        Do While Not rs.EOF
            SQL = "UPDATE %table(0)% SET [DeleteMe]='x' WHERE [Category]='" & rs!Category & "' AND [Types]='" & rs!Types & "'"
            'Again, change Sheet2 to your sheet name
            QuerySheet SQL, Sheet2
            rs.MoveNext
        Loop
    End Sub
    
    'You don't need to change this function
    Function QuerySheet(sSQL, ParamArray Worksheets())
        Dim oSh
        Dim sConn, n
    
        On Error GoTo QuerySheet_Err
        Set QuerySheet = CreateObject("ADODB.Recordset")
        sConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Worksheets(0).Parent.FullName & ";Extended Properties=""Excel 8.0;HDR=Yes"";"
    
        n = 0
        For Each oSh In Worksheets
            sSQL = Replace(sSQL, "%table(" & n & ")%", "[" & oSh.Name & "$]")
            n = n + 1
        Next
        QuerySheet.Open sSQL, sConn
        Exit Function
    
    QuerySheet_Err:
        MsgBox "Error in QuerySheet(): " & Err.Description
        End
    End Function
    

    Source

    代码使用x更新“DeleteMe”列。现在,您可以按“DeleteMe”排序,并删除行(或者编写一个简单的VBA语句来执行此操作)。

    您的 RunQuery()方法需要看起来更像这样,将“B列”和“M列”替换为工作表标题行中字段的名称:

        ...
    
        'Change this SQL statement to reflect your particular need
        SQL = "SELECT [column B] FROM %table(0)% WHERE [column M] = 0 GROUP BY [column B] HAVING Count(*) > 1"
    
        'Change "Sheet2" to your sheet name
        Set rs = QuerySheet(SQL, Sheet2)
    
        Do While Not rs.EOF
            SQL = "UPDATE %table(0)% SET [DeleteMe]='x' " & _
               " WHERE " & _
               IIf(IsNull(rs![column B]), _
                   " [column B] IS NULL", _
                   " [column B]='" & rs![column B] & "' ") & _
               " AND [column M]=0"
    
            'Again, change Sheet2 to your sheet name
            QuerySheet SQL, Sheet2
    
        ...
    

    注意:当您将工作表的名称从“Sheet1”更改为其他内容时,有时会出现调试错误...尚未解决该问题。但这适用于“Quick N'Dirty”查询。

答案 2 :(得分:0)

你可以在没有VBA的情况下试试这个:

添加公式

的列
=B1&IF(M1=0,"",RAND()*9999999)

如果M1 = 0

,这将创建一个唯一条目

将新列粘贴到值

根据新列执行常规“删除重复”例程。

删除新列