2014-11-04 123 views
0

我在下面的代碼行中得到類型不匹配錯誤。它位於一個循環內,並且直到.Cells(rowStart + i, ISO_revs_col).Value是一個字符串的第一次迭代纔會發生錯誤。這是有道理的,這會導致錯誤,但我期望.IfError函數只返回「0」字符串。如果有人能告訴我爲什麼我得到一個錯誤而不是「0」,我將不勝感激。IfError不是捕獲類型類型不匹配錯誤vba

Debug.Print Application.WorksheetFunction.IfError(CLng(.Cells(rowStart + i, _ 
             ISO_revs_col).Value), "0") 

在此先感謝。

+1

我不認爲在VBA中可用的工作表函數中有* IFERROR *。不知道,但沒辦法檢查atm。但您可以使用* On Error Resume Next *和* On Error Goto 0 *代替。 – L42 2014-11-04 01:06:47

+0

如上所述,您不能以這種方式使用IFERROR。在過去,我通過'Application.Sum(.Cells(rowStart + i,ISO_revs_col).Value))'這樣的''SUM'工作表函數將文本字符串的總和設爲零。 – Jeeped 2014-11-04 01:11:17

+0

有一個工作表函數(我發現它在微軟的幫助下),但如下所述,我錯誤地使用了它。 @Jeeped我想我會用你的解決方案。謝謝! – nateAtwork 2014-11-04 02:01:51

回答

3

IFERROR是一個工作表函數,它將檢測工作表錯誤。評估以下錯誤類型:#N/A,#VALUE !, #REF!,#DIV/0 !, #NUM!,#NAME?或#NULL !.

類型不匹配(運行時錯誤13)是VBA錯誤,而不是工作表錯誤。

要處理VBA錯誤,您需要使用VBA錯誤處理例程。因此,像:

編輯:引發其他錯誤:

On Error Resume Next 
    'your looping routine start 
x = CLng(.Cells(rowStart + i, ISO_revs_col).Value) 
select case err.number 
    case 13 
     x=0 
     err.clear 
    case <> 0 
     msgbox "Error " & err.number & vbTab & err.description 
end select 
debug.print x 
    'your looping routine end 
on error goto 0 

以上不會告訴你哪裏出現了錯誤,所以你可能只想換單行爲:

on error resume next 
x = CLng(.Cells(rowStart + i, ISO_revs_col).Value) 
if err.number = 13 then x = 0 
on error goto 0 
+0

這很有道理,謝謝你解釋它。我很猶豫要在我的當前循環中使用它,因爲它相當大,我不想錯過循環中的其他地方的錯誤。儘管如此,我一定會在未來使用它。 – nateAtwork 2014-11-04 02:06:59

+2

@nateAtwork然後,而不是清除錯誤,只是測試,看看是否有另一個錯誤;或者只有在執行一條語句時纔有效,而不是整個循環。 – 2014-11-04 02:09:00

+0

這絕對可以解決它,我不知道你可以把它放在循環中。再次感謝。 – nateAtwork 2014-11-04 16:19:33