删除不包含字符串的行

时间:2017-08-19 18:19:26

标签: excel string vba find delete-row

我正在尝试搜索由另一个模块生成的表,并删除不包含字符串"REPAIR_RTS"的行。我从这个网站尝试了几种方法,但每次将搜索值更改为"REPAIR_RTS"(表示CASE ...的行)时,我都会出现类型不匹配。

以下是我最近的尝试。

Public Sub Test()
lastRow = Range("D65000").End(xlUp).row
For i = lastRow To 2 Step -1
Select Case Cells(i, 4).Value
    Case "REPAIR_RTS"
        'Do nothing
    Case Else
        Cells(i, 8).EntireRow.Delete
End Select
Next i
End Sub

我还是VBA的新手,所以我很难排除故障。我也对其他方法持开放态度,我正在努力学习新的方法,因为我继续我的第一份分析师工作。

2 个答案:

答案 0 :(得分:3)

  

最简单的方法是首先测试错误......

错误......不。

只需将Cells(i, 4).Value更改为Cells(i, 4).Text

尽管如此,.Text可能会很痛苦,因为它会准确地返回所显示的内容。

Cells(i, 4).ValueCStr(Cells(i, 4).Value)的变化不那么容易。但是,它应该完全符合您的要求。

如果您还有任何问题,请问:D

答案 1 :(得分:1)

您无法将错误值(例如#N/A)与字符串进行比较 - 这就是产生"类型不匹配的问题"错误。

最简单的方法是首先测试错误,然后继续测试特定字符串,如果它不是错误:

Public Sub Test()
    Dim lastRow As Long
    Dim i As Long
    With Worksheets("Chargable Vendors")
        lastRow = .Cells(.Rows.Count, "D").End(xlUp).row
        For i = lastRow To 2 Step -1
            If IsError(.Cells(i, 4).Value) Then
                .Rows(i).Delete
            Else
                Select Case .Cells(i, 4).Value
                    Case "REPAIR_RTS"
                        'Do nothing
                    Case Else
                        .Rows(i).Delete
                End Select
            End If
        Next i
    End With
End Sub

另一种方法是在Select Case语句中包含针对字符串测试的每个错误值之前的特定测试,例如

Select Case .Cells(i, 4).Value
    Case CVErr(xlErrNA), CVErr(xlErrDiv0), CVErr(xlErrName), CVErr(xlErrValue) 'etc
        .Rows(i).Delete
    Case "REPAIR_RTS"
        'Do nothing
    Case Else
        .Rows(i).Delete
End Select

但我发现单IsError更容易测试所有这些。

注意:

这也可以使用If语句而不是Select Case语句来完成:

Public Sub Test()
    Dim lastRow As Long
    Dim i As Long
    With Worksheets("Chargable Vendors")
        lastRow = .Cells(.Rows.Count, "D").End(xlUp).row
        For i = lastRow To 2 Step -1
            If IsError(.Cells(i, 4).Value) Then
                .Rows(i).Delete
            ElseIf .Cells(i, 4).Value <> "REPAIR_RTS" Then
                .Rows(i).Delete
            End If
        Next i
    End With
End Sub