【问题标题】:Delete rows that do not contain string删除不包含字符串的行
【发布时间】:2017-08-19 18:19:26
【问题描述】:

我正在尝试搜索由另一个模块生成的表并删除不包含字符串 "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 的新手,所以我很难解决这个问题。我也对其他方法持开放态度,在继续我的第一份分析师工作时,我正在努力学习新的方法。

【问题讨论】:

  • 您知道要在哪个工作表上运行吗?
  • 短语 'rows that do not contain' 不明确。是指它是整个单元格值还是较长字符串的一部分?
  • 崩溃时Cells(i, 4).Value的值是多少?是Error 2007 或Error 2042 之类的错误值吗? (即 D 列中有 #N/A、#DIV/0! 等值吗?)
  • @Jeeped 没有 REPAIR_RTS 是整个单元格值。它运行的工作表名为“Chargable Vendors”
  • @YowE3K 有 #N/A 值以及包含其他文本的值

标签: excel string vba find delete-row


【解决方案1】:

解决这个问题的最简单方法是先测试错误...

错误...没有。

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

不过,.Text 可能会很痛苦,因为它会返回显示的内容。

从Cells(i, 4).Value 更改为CStr(Cells(i, 4).Value) 有点不太容易。但是,它应该完全符合您的要求。

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

【讨论】:

  • 我每天都学到新东西! (我原以为 CStr(CVErr(xlErrNA)) 会给出类型不匹配错误。)
【解决方案2】:

您无法将错误值(例如 #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

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 2022-08-11
    • 2015-04-15
    • 2012-03-21
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多