3

我正在编写一个代码,将数据从一张表复制到另一张表中,并且该功能可以正常工作。现在,我正在尝试对其进行编码,以根据 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
4

3 回答 3

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。此外,一切都将匹配一次。

于 2016-05-11T18:12:45.240 回答
4

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

接下来,您要Match在 F 的列中查找 a x,其中包含 F 列中的值。因此,它将始终返回一个值(本身,至少)。也许尝试使用 aCOUNTIF并查看它是否大于 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
于 2016-05-11T18:13:47.063 回答
0

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

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

这是该方法的msdn 文档,以及具有更详细实现的另一个页面。他们应该解决您可能遇到的任何问题。

于 2016-05-11T20:52:44.853 回答