我是VBA的初学者,如果其他值的列是“未完成”或“空”,我想删除A列中的重复行
我使用以下代码删除“未完成”或“空”但我无法弄清楚如何找到重复值并且其他列值为“未完成”
如果Range(“f”& p).Value =“Not Completed”或Range(“f”& p).Value =“”Then Rows(p).Delete(这适用于删除行)
我使用以下函数作为代码的一部分,但其语法错误 如果WorksheetFunction.Countif(A:A,A2)> 1则(找到重复)
像这样 Dim p As LongFor p = Range("f1").End(xlDown).Row To 1 Step -1
If WorksheetFunction.Countif(A:A,A2)>1 then
If Range("f" & p).Value = "Not Completed" or Range("f" & p).Value = "" Then Rows(p).Delete
Next p
EX
ColA | ColB | colF
21 | 456 |通
25 | 673 |通
21 | 679 |未完成 - 删除
22 | 568 |通
22 | 367 |未完成 - 删除
25 | 456 |空单元格 - 删除
答案 0 :(得分:1)
尝试此操作(如果列A值有重复且两者都在F列中传递,则不会删除它):
Sub SO_18996725()
Dim p As Long
' Start from last row of used range
For p = ActiveSheet.UsedRange.SpecialCells(xlLastCell).Row To 1 Step -1
If WorksheetFunction.CountIf(Range("A:A"), Range("A" & p)) > 1 Then
If (InStr(1, Range("F" & p).Text, "Not Completed", vbTextCompare) > 0) Or IsEmpty(Range("F" & p)) Then
Debug.Print "Delete row: " & p
Rows(p).Delete
End If
End If
Next p
End Sub
答案 1 :(得分:0)
您可以使用此
WorksheetFunction.CountIf(Range("A:A"), Range("A3")) > 1
但是,您的代码存在一些问题。
1)您正在使用End(xlDown)
进行循环。在您的示例中,由于列F的最后一行为空,End(xlDown)
将返回第二行。更好地使用另一列。
2)你需要重新考虑你的字符串匹配机制吗?例如
?"Not completed"="Not Completed"
False
所以在你的情况下,行21 | 679 |未完成不会被删除。如果有任何尾随空格,则比较也将返回false。
3)WorksheetFunction.CountIf(Range("A:A"), Range("A3"))
当你循环相关的行时,你应该相应地改变你的第二个参数。
e.g。使用Offset