我是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的最后一行。
让我走的任何想法或提示? 非常感谢您的帮助!
答案 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列。根据需要进行更改。