2017-04-25 185 views
0

我想对该区域执行过滤并删除与该区域不匹配的其余行。该表没有公式,只有值和字符。这是我正在处理的更大代码的一部分,所以我只会发布这部分内容,这是我第一次看到错误,因此对于其他工作表,它们的工作方式正好符合我声明的方式。类型不匹配运行时错误(13)vba

有错误,并不会经过这里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 
+1

如果您将提到的行更改为'If InStr(1,Rng10.Cells(q,1).Value,“NW”)<1 Then',您的代码是否可以工作?你确定提到的单元格包含字符串吗? – reporter

+0

它仍然给我同样的错误,列W有NW,N东,SE和#N/A的值,但是,我以前的工作表具有相同的情况,我没有这个问题。 – sc1324

+1

有你的错误。您的单元格包含显示为“#N/A”的错误,而不是*表示“#N/A”的文本。 – CLR

回答

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 
+0

我将修改每张工作表的代码,以防将来出现类似问题。感谢您的代码完美工作。 – sc1324

+2

这对于OP的需求来说可能是完美的 - 但是如果你发现自己在验证字符串值以查看它是否为“#N/A”的情况下,我会热烈推荐使用强类型方法范围的“值”而不是其文本表示。 –

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

你承担什么样的Rng10.Cells(q, 1).Value类型将是,和你假设,无论该类型是,VBA可以将其隐式转换为String以传递给InStr fu nction。

当单元格中包含一个错误值(#N/A#VALUE!#REF!或任何其他错误),那么thatCell.Value类型是Error - 和VBA不知道如何Error值转换为String值(或任何其他为问题),所以它会引起运行时错误13 类型不匹配并强制您修改您的代码。

您可以检查单元格的值是一个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使代码更易于理解。