为vba

时间:2017-04-25 15:32:58

标签: vba excel-vba excel

我想对该区域进行过滤,并删除与该区域不匹配的其余行。工作表中没有公式,只有值和字符。这是我正在处理的更大代码的一部分,所以我只发布这部分,这是我第一次看到错误,所以对于其他工作表,它们的工作方式就像我声明的那样。

有错误并且不会通过的行在If InStr(1, Rng10.Cells(q, 1).Value, "NW") = 0 Then

我的数据有一个辅助列,它是W,我正在过滤它。我确保我使用的变量没有重复。 (我用过,s,t,m,n等等......)我试图将q声明为double或variate,并且它们都不起作用。

sub test()
Worksheets("A").Activate
    'filter
    Dim sh9 As Worksheet
    Set sh9 = Sheets("A")
    Dim LR16 As Long
    Dim Rng10 As Range
    Dim q As Long
    LR16 = sh9.Cells(Rows.Count, "B").End(xlUp).Row
    Set Rng10 = Range("W5:W" & LR16 - 1)
    For q = Rng10.Rows.Count To 1 Step -1
    If InStr(1, Rng10.Cells(q, 1).Value, "NW") = 0 Then
    Rng10.Cells(q, 1).EntireRow.Delete
    End If
    Next q
end sub

2 个答案:

答案 0 :(得分:2)

请勿使用.Value,请使用.Text将错误视为等效的文字。

更改

If InStr(1, Rng10.Cells(q, 1).Value, "NW") = 0 Then

If InStr(1, Rng10.Cells(q, 1).Text, "NW") = 0 Then

答案 1 :(得分:2)

If InStr(1, Rng10.Cells(q, 1).Value, "NW") = 0 Then

您正在假设Rng10.Cells(q, 1).Value的类型是什么,并且您假设无论该类型是什么,VBA都可以隐式地将其转换为String以通过到InStr函数。

如果某个单元格包含错误值(#N/A#VALUE!#REF!或任何其他错误),则thatCell.Value的类型为Error - 并且VBA不知道如何将Error值转换为String值(或其他任何内容),因此它会引发运行时错误13 type mismatch 并强制您改为修改你的代码。

您可以使用Error功能检查单元格的值是否为IsError

Dim myValue As Variant
myValue = Rng10.Cells(q, 1).Value
If IsError(myValue) Then
    'cell contains an error
Else
    'cell contains no error: myValue is safe to convert to a string
    If InStr(1, CStr(myValue), "NW") = 0 Then
        '...
    End If
End If

旁注,请注意proper indentation如何让代码更容易理解。