2014-11-04 81 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