所以有一个噩梦,语法和一切都是正确的,但逻辑似乎是有缺陷的: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
然而不知何故,它一直在崩溃我的excel,我认为可能是因为我的原子处理器,所以我将循环的大小减小到最小。 然而它仍然崩溃,任何人都可以看到任何错误吗?
任何帮助将不胜感激
谢谢!
答案 0 :(得分:2)
删除行时需要后退,否则索引会混淆。您的ElseIf
逻辑也不起作用。请改用And
。最后,使用For
循环而不是While,因为它会自动索引。这是未经测试的,但应该有效:
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
答案 1 :(得分:1)
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
答案 2 :(得分:0)
而不是Rows(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
您看到我已使用stop语句添加了终止条件,并重做了If语句。