删除列中具有重复信息的行
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 更详细的实现。他们应该会解决您可能有的任何问题。
我正在编写一个代码,将数据从一个 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 更详细的实现。他们应该会解决您可能有的任何问题。