如果另一列的值为“未完成”或“空”,则删除重复的行

时间:2013-09-25 05:13:15

标签: vba

我是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 Long

For 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 |空单元格 - 删除

2 个答案:

答案 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