2017-04-25 188 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使代碼更易於理解。