基于VBA中的两个列值删除除一行外的所有行

我是VBA新手,想从Excel文件中删除行。 我想要删除一个状态为“已完成”的行,但只有当客户名至less还有一行时。 换句话说,如果某个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 

这将删除第18列(状态列)中具有“已完成”的所有行。 现在我真的坚持find一种方法来阻止Status = Completed的行,如果这会删除CustomerName的最后一行。

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

您可以使用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 

在删除行之前,将第一个IF块中的下一行作为另一个IF块。

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

这将计算客户名称,只有在超过1的情况下才会调用删除行。我假定客户名称在第10列中。根据需要进行更改。