0

所以做了一场噩梦,语法和一切都是正确的,但逻辑似乎有缺陷: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 崩溃,我认为这可能是因为我的 atom 处理器,所以我将循环的大小减小到最小。但是它仍然崩溃,任何人都可以看到任何错误吗?

任何帮助,将不胜感激

谢谢!

4

3 回答 3

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
于 2013-05-16T15:00:57.000 回答
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
于 2013-05-16T15:03:38.267 回答
0

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

并在结束之前放置一个 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 语句。

于 2013-05-16T14:55:28.560 回答