vba的类型不匹配运行时错误(13)

vba的类型不匹配运行时错误(13),vba,excel,Vba,Excel,我想对区域进行筛选,并删除与区域不匹配的其余行。工作表中没有公式,只有值和字符。这是我正在处理的较大代码的一部分,所以我只想发布这部分,这是我第一次看到错误,所以对于其他工作表,它们的工作方式与我声明的一样 如果InStr(1,Rng10.Cells(q,1).Value,“NW”)=0,则 我的数据有一个helper列,它是W,我正在过滤它。我确保我使用的变量没有重复项。(我使用了,s,t,m,n等等…)我试图将q声明为双精度或变量,但它们都不起作用 sub test() Worksheets

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

如果InStr(1,Rng10.Cells(q,1).Value,“NW”)=0,则

我的数据有一个helper列,它是W,我正在过滤它。我确保我使用的变量没有重复项。(我使用了,s,t,m,n等等…)我试图将q声明为双精度或变量,但它们都不起作用

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

不要使用
.Value
,使用
.Text
将错误视为文本等效项

改变

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


不要使用
.Value
,使用
.Text
将错误视为文本等效项

改变

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

假设
Rng10.Cells(q,1).Value
的类型是什么,并且假设无论该类型是什么,VBA都可以隐式地将其转换为
字符串
以传递给
InStr
函数

当一个单元格包含一个错误值(
#N/a
#value!
#REF!
或任何其他错误)时,
该单元格.value
的类型是
error
,VBA不知道如何将
error
值转换为
String
值(或任何其他相关内容),因此,它会引发运行时错误13类型不匹配,并迫使您改为修复代码

您可以使用
iError
功能检查单元格的值是否为
错误

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
请注意,注意如何使代码更容易理解

假设
Rng10.Cells(q,1).Value
的类型是什么,并且假设无论该类型是什么,VBA都可以隐式地将其转换为
字符串
以传递给
InStr
函数

当一个单元格包含一个错误值(
#N/a
#value!
#REF!
或任何其他错误)时,
该单元格.value
的类型是
error
,VBA不知道如何将
error
值转换为
String
值(或任何其他相关内容),因此,它会引发运行时错误13类型不匹配,并迫使您改为修复代码

您可以使用
iError
功能检查单元格的值是否为
错误

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

旁注,请注意如何使代码更容易理解。

如果您将上述行更改为
如果InStr(1,Rng10.Cells(q,1).Value,“NW”)<1,那么您的代码是否有效?你确定上面提到的单元格包含字符串吗?这是你的错误。您的单元格包含一个显示为“#N/A”的错误,而不是“#N/A”的文本。假设您的工作表上出现了“N/A”,则您已经将这些错误的特殊值复制/粘贴到文本“#N/A”中,除非您没有其他选项,否则不要在下一次错误恢复时使用
。请参阅我的答案,了解一个简单的替代方法。@sc1324
在错误恢复下一步时
几乎总是一个坏主意。如果您将所述行更改为
如果InStr(1,Rng10.Cells(q,1).Value,“NW”)<1,那么您的代码会工作吗
?你确定上面提到的单元格包含字符串吗?这是你的错误。您的单元格包含一个显示为“#N/A”的错误,而不是“#N/A”的文本。假设您的工作表上出现了“N/A”,则您已经将这些错误的特殊值复制/粘贴到文本“#N/A”中,除非您没有其他选项,否则不要在下一次错误恢复时使用
。请参阅我的答案,以获得一个简单的替代方案。@sc1324
关于“错误恢复下一步”
几乎总是一个坏主意。我将修改每个工作表的代码,以防将来出现类似问题。谢谢,您的代码工作得很好。这可能非常适合OP的需要-但是如果您发现自己正在验证字符串值以查看它是否为
“#N/a”
,我强烈建议使用强类型方法,使用范围的
,而不是它的文本表示。我将修改每个工作表的代码,以防将来出现类似问题。感谢您的代码工作得很好。这可能非常适合OP的需要-但是如果您发现自己在验证字符串值以查看它是否为
“#N/a”
,我强烈建议使用范围的
值而不是其文本表示的强类型方法。