我想对该区域进行过滤,并删除与该区域不匹配的其余行。工作表中没有公式,只有值和字符。这是我正在处理的更大代码的一部分,所以我只发布这部分,这是我第一次看到错误,所以对于其他工作表,它们的工作方式就像我声明的那样。
有错误并且不会通过的行在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
答案 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如何让代码更容易理解。