删除列中包含重复信息的行

时间:2016-05-11 17:58:00

标签: excel vba excel-vba rowdeleting

我正在编写一个代码,将数据从一个工作表复制到另一个工作表中,并且我已经将该功能正常工作了。现在,我尝试对其进行编码,以根据F列中的信息ID号删除包含重复信息的任何行。我们流程的一部分是在每行工作时手动输入E列。

所以我的最终目标是让代码删除E列为空白且F列为重复的行。我的代码运行,但不删除任何内容。我真的希望我能错过一些非常明显的东西。

For i = 1 To Range("f" & Rows.Count).End(xlUp).Row
    If Cells(i, 5).Value = "" Then 'if column E is blank on row i
        x = Cells(i, 6).Value
        If Not IsError(Application.Match(x, "F:F", 0)) Then '& if that row is a duplicate
            ActiveSheet.Range(x).EntireRow.Delete 'delete new duplicate row
        End If
    End If
Next i

3 个答案:

答案 0 :(得分:5)

尝试使用,

For i = Range("f" & Rows.Count).End(xlUp).Row to 1 Step -1
    If Cells(i, 5).Value = "" Then 'if column E is blank on row i
        x = Cells(i, 6).Value
        If Application.Countif(Columns(6), x) > 1 Then '& if that row is a duplicate
            Rows(i).EntireRow.Delete 'delete new duplicate row
        End If
    End If
Next i

您试图删除行号 x ,而不是 i 。此外,一切都将匹配一次。

答案 1 :(得分:4)

因此,您的代码中需要解决几个错误。首先,如果您在一个范围内循环并删除行,最好从底部开始并逐步完成。这可以防止迭代器在一行上,行被删除,循环实际上跳过下一行的问题。

接下来,您在Match的F列中寻找x,其中包含来自F列的值。因此,它将始终返回一个值(本身,至少为其值)。也许尝试使用COUNTIF并查看它是否大于1可能是更好的选择?

接下来,使用x中的值填充变量Cells(i, 6),但是在删除时尝试将其用作范围。将您的代码更改为以下内容,看看它是否有效:

For i = Range("f" & Rows.Count).End(xlUp).Row To 1 Step -1
If Cells(i, 5).Value = "" Then 'if column E is blank on row i
x = Cells(i, 6).Value
    If Application.Countif(Columns(6), x) > 1 Then '& if that row is a duplicate
    ActiveSheet.Rows(i).Delete 'delete new duplicate row
    End If
End If
Next i

答案 2 :(得分:0)

为什么不使用.RemoveDuplicates方法?它比循环更快。以下是其使用的概述:

With Range
    .RemoveDuplicates Columns:=Array(6), Header:=xlYes
End With

此处为方法的msdn doc,以及another page,其中包含更详细的实施方案。他们应该清理你可能遇到的任何问题。

相关问题