如果一个单元格包含一个特定单词,VBA中删除整行的更好方法是什么?

时间:2017-06-28 07:38:36

标签: vba excel-vba excel

我编写了以下代码,它在G列中查找3个单词,然后如果出现其中一个,则删除整行。 但是,效率不高(快速)。我猜是因为3 If和ElseIf。 有人知道更好的方法吗?

 Last = Workbooks("reportI.xlsm").Sheets("SII_I").Cells(Rows.Count, "G").End(xlUp).Row
For i = 2 To Last Step 1
    If (Workbooks("reportI.xlsm").Sheets("SII_I").Cells(i, "G").Value) = "01NU SfG" Then
          Workbooks("reportI.xlsm").Sheets("SII_I").Cells(i, "A").EntireRow.Delete
    '
    'with the word "01NU" in column  G
     ElseIf (Workbooks("reportI.xlsm").Sheets("SII_I").Cells(i, "G").Value) = "01NU" Then
          Workbooks("reportI.xlsm").Sheets("SII_I").Cells(i, "A").EntireRow.Delete
     'with the word "11G SfG" in column  G
     ElseIf (Workbooks("reportI.xlsm").Sheets("SII_I").Cells(i, "G").Value) = "11G SfG" Then
          Cells(i, "A").EntireRow.Delete
    End If
    Debug.Print i
Next i

3 个答案:

答案 0 :(得分:1)

您可以使用OR运算符只使用一个if子句。

If "A1"= "01NU OR "A1" = "SfG" OR "A1" = "11G SfG" Then
'delete row

或者,您可以将宏添加到过滤该列,以获取值01NU,SfG,11G SfG,然后删除所有已过滤的行。这肯定更快。

只需将范围A1替换为您所需的范围即可。

答案 1 :(得分:1)

另一种解决方案:

Sub Demo()
    Dim delItems As String
    Dim rng As Range, searchRng As Range, cel As Range
    Dim lastRow As Long

    delItems = "01NU SfG,01NU,11G SfG" 'search items
    With Workbooks("reportI.xlsm").Sheets("SII_I")
        lastRow = .Cells(Rows.Count, "G").End(xlUp).Row
        Set searchRng = .Range("G1:G" & lastRow)

        For Each cel In searchRng
            If InStr(1, delItems, cel.Value, vbTextCompare) Then
                If rng Is Nothing Then
                    Set rng = .Rows(cel.Row)
                Else
                    Set rng = Union(rng, .Rows(cel.Row))
                End If
            End If
        Next cel
    End With
    rng.Delete
End Sub

答案 2 :(得分:0)

代码需要稍加改动以满足您的需求,但this answer非常强大且可扩展。

例如:

Sub Sample()
    Dim DeleteThese(3) As String, strg As String
    Dim rng As Range
    Dim Delim As String
    Dim Last As Long
    Dim ws As Worksheet

    Set ws = Workbooks("reportI.xlsm").Sheets("SII_I")

    Last = ws.Cells(Rows.Count, "G").End(xlUp).Row

    Delim = "#"

    DeleteThese(0) = "01NU SfG"
    DeleteThese(1) = "01NU"
    DeleteThese(2) = "11G SfG"

    strg = Join(DeleteThese, Delim)
    strg = Delim & strg

    For i = 2 To Last Step 1
        If InStr(1, strg, Delim & ws.Range("G" & i).Value & Delim, vbTextCompare) Then _
        ws.Range("G" & i).EntireRow.Delete
    Next i
End Sub