试图运行循环来删除没有特定单词的行时,Excel崩溃

所以有一个噩梦,语法和所有是正确的,但逻辑似乎是有缺陷的:S此代码是为了删除行不包含单词

Facility 

 Government 

从列B中的所有单元格开始,从第2行开始

 Sub lol() Dim i As Integer i = 2 'While i < LastRow <---- Use for real calc, LastRow calculated beforehand While i < 4 If Cells(i, 2).Value <> "Facility" Then ElseIf Cells(i, 2).Value <> "Government" Then Rows(i).EntireRow.Delete Else i = i + 1 End If Wend End Sub 

然而,不知何故,它不断崩溃我的优秀,我认为这可能是因为我的primefaces处理器,所以我减less了循环的规模最小。 但它仍然崩溃,任何人都可以看到任何错误?

任何帮助,将不胜感激

谢谢!

 Sub DeleteRowsBasedOnCriteria() Dim i As Long ' instead of integer ' always delete from the end For i = Range("B" & Rows.Count).End(xlUp).Row To 2 Step -1 If StrComp(CStr(Range("B" & i).Value), "Facility", vbTextCompare) = 0 Or _ StrComp(CStr(Range("B" & i).Value), "Government", vbTextCompare) = 0 Or _ isEmpty(Range("B" & i)) Then Else Rows(i & ":" & i).Delete (xlShiftUp) End If Next i End Sub 

删除行时,您需要向后退步,否则索引将混淆。 另外你的ElseIf逻辑将不起作用。 使用And而不是。 最后,使用For循环代替While,因为它会自动索引。 这是未经testing,但应该工作:

 Sub lol() Dim i As Integer i = 2 For i = LastRow to 2 Step -1 If Cells(i, 2).Value <> "Facility" And Cells(i, 2).Value <> "Government" Then Rows(i).EntireRow.Delete End If Next i End Sub 

而不是行(i).EntireRow.Delete使用Cells(i,2).Delete(xlShiftUp)。 应该这样做。

在wend之前放一个VBA.DoEvents(),这样就可以进入程序。

我会尽量做一些更有用的事情! 这将工作:

 Sub lol() Dim rng As Excel.Range Dim i As Integer i = 2 'While i < LastRow <---- Use for real calc, LastRow calculated beforehand While i < 4 If Cells(i, 2).Value = "" Then Stop If Cells(i, 2).Value <> "Facility" And Cells(i, 2).Value <> "Government" Then Set rng = Cells(i, 2) rng.Delete (xlShiftUp) Else i = i + 1 End If VBA.DoEvents Wend End Sub 

你看到我已经添加了停止语句的终止条件并重做了If语句。