删除列中具有重复信息的行

Deleting rows with duplicate info in columns

我正在编写一个代码,将数据从一个 sheet 复制到另一个 sheet,并且该功能运行良好。现在,我正在尝试对其进行编码,以根据 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

试试看,

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。此外,所有内容都将匹配一次。

所以您的代码中有几个错误需要解决。首先,如果您要遍历一个范围并删除行,最好从底部开始,然后逐步向上。这可以防止迭代器在一行上,该行被删除,并且循环基本上跳过下一行的问题。

接下来,您要在 x 的 F 列中查找 Match,其中包含 F 列中的值。因此,它总是 return 一个值(本身,最低限度)。也许尝试使用 COUNTIF 并查看它是否大于 1 可能是更好的选择?

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

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

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

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

这里是 msdn doc for the method, and another page 更详细的实现。他们应该会解决您可能有的任何问题。