根据VBA

时间:2017-10-06 14:09:36

标签: excel vba excel-vba

我是VBA的新手,想要从Excel文件中删除行。我想删除具有Status' Completed'的行,但仅限于CustomerName还剩下至少一行。换句话说,如果某个CustomerName只剩下一行,则不应删除它,即使它可能具有Status' Completed'。

如果有状态='已完成'我知道如何删除行:

Sub RemoveAlmostAllCompletedRows()
Dim i As Long

i = 1

Do While i <= ThisWorkbook.ActiveSheet.Range("A1").CurrentRegion.Rows.Count

If InStr(1, ThisWorkbook.ActiveSheet.Cells(i, 18).Text, "Completed", vbTextCompare) > 0 Then
    ThisWorkbook.ActiveSheet.Cells(i, 1).EntireRow.Delete
Else
    i = i + 1
End If

Loop

End Sub

这将删除所有已完成&#39;已完成&#39;在第18栏(状态栏)。现在我真的很难找到一种方法来阻止Status = Completed的行,如果那样会删除CustomerName的最后一行。

让我走的任何想法或提示? 非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用WorksheetFunction.CountIf。考虑到列A:A是包含客户名称和工作表Sheet1的列是您正在使用的工作表:

Sub RemoveAlmostAllCompletedRows()

    'You should always define precisely your worksheet
    Dim WS As Worksheet
    Set WS = ThisWorkbook.Worksheets("Sheet1")

    Dim i As Long
    i = 1

    Do While i <= WS.Range("A1").CurrentRegion.Rows.Count

        If (InStr(1, WS.Cells(i, 18).Text, "Completed", vbTextCompare) > 0) Then
            If (Excel.Application.WorksheetFunction.CountIf(WS.Range("A:A"), _
                WS.Range("A" & i).Value2)) > 1 Then

                WS.Cells(i, 1).EntireRow.Delete

            End If
        Else
            i = i + 1
        End If

    Loop

End Sub

答案 1 :(得分:1)

将下一行放在第一个IF块内作为另一个IF块,然后再删除该行。

If Application.WorksheetFunction.Countif(ThisWorkbook.ActiveSheet.Cells(i,10).EntireColumn),ThisWorkbook.ActiveSheet.Cells(i,10).Value) > 1 Then

这将计算客户名称,如果超过1,则仅调用删除行。我假设客户名称在第10列。根据需要进行更改。