【发布时间】:2016-03-03 06:33:31
【问题描述】:
我想检查某个列 (W) 是否有重复项(出现次数存储在另一列 (AZ) 中),然后以这种方式删除所有行:
- 在列中找到两次值 - 仅删除包含该值的一行。
- 在该列中找到的值更多次 - 删除所有包含该值的行。
我的代码运行良好,但有时它并没有按照应有的方式删除所有重复项。有什么改进的想法吗?
编辑:更新后的代码效果非常好,只是它总是会遗漏一个重复项并且不会将其删除。
fin = ws.UsedRange.Rows.count
For i = 2 To fin
ws.Range("AZ" & i).value = Application.WorksheetFunction.CountIf(ws.Range("W2:W" & fin), ws.Range("W" & i))
Next i
For j = fin To 2 Step -1
If ws.Range("AZ" & j).value > 2 Then
ws.Range("AZ" & j).EntireRow.Delete
fin = ws.UsedRange.Rows.count
ElseIf ws.Range("AZ" & j).value = 2 Then
Set rng = Range("W:W").Find(Range("W" & j).value, , xlValues, xlWhole, , xlNext)
rngRow = rng.Row
If rngRow <> j Then
ws.Range("AZ" & rngRow) = "1"
ws.Range("AZ" & j).EntireRow.Delete
fin = ws.UsedRange.Rows.count
Else
MsgBox "Error at row " & rngRow
End If
End If
Next j
【问题讨论】:
-
您能描述一下您的代码何时无法成功删除重复项吗?
-
我认为问题在于您在删除一些行后重新进行计数。这会改变一些计数,并可能导致对行进行重新分类。
-
这背后的想法是我必须在删除第二次出现的重复项后重新进行计数,以便将第一次出现的重复项标记为非重复项 (1),并且以后不会被删除。至少我是这么想的。速度对我来说还不是一个大问题。我只需要将双重重复减少到一次(A,A到A) - 删除一个A,然后完全删除三重和更多重复(B,B,B到-; C,C,C,C, C to -) @RonRosenfeld
-
@Gussmayer,我在下面的回答正是这样做的,在第一个循环(AZ)上计数大于 2 的任何行都将被删除,删除除原始重复项之外的所有行,OR 负责这些通过计数并删除其中一个重复项,它很简单,不知道为什么新的答案对于一项简单的任务变得如此复杂......
-
@StevenMartin 增加了复杂性以提高速度。如果数据库比较小,问题不大;如果数据库需要删除数千行,那么复杂性就变得值得了。
标签: excel vba duplicates countif find-occurrences