vba的类型不匹配运行时错误(13)
我想对区域进行筛选,并删除与区域不匹配的其余行。工作表中没有公式,只有值和字符。这是我正在处理的较大代码的一部分,所以我只想发布这部分,这是我第一次看到错误,所以对于其他工作表,它们的工作方式与我声明的一样 如果InStr(1,Rng10.Cells(q,1).Value,“NW”)=0,则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
我的数据有一个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”
,我强烈建议使用范围的值而不是其文本表示的强类型方法。