【问题标题】:IfError isn't catching type type mismatch error vbaIfError 未捕获类型类型不匹配错误 vba
【发布时间】:2014-11-04 01:00:04
【问题描述】:

我在下面的代码行中遇到类型不匹配错误。它在一个循环内,直到第一次迭代 .Cells(rowStart + i, ISO_revs_col).Value 是一个字符串时才会发生错误。这会导致错误是有道理的,但我希望.IfError 函数只返回“0”字符串。如果有人能告诉我为什么我收到错误而不是“0”,我将不胜感激。

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

提前致谢。

【问题讨论】:

  • 我认为 VBA 中没有可用的工作表函数中的 IFERROR。不过不确定,没有办法检查atm。但是您可以改用 On Error Resume NextOn Error Goto 0
  • 如前所述,您不能以这种方式使用IFERROR。过去,我一直使用 Application.Sum(.Cells(rowStart + i, ISO_revs_col).Value)) 之类的东西,因为 SUM 工作表函数会将文本字符串总计为零。
  • 有一个工作表函数(我在 Microsoft 的帮助下找到了它),但如下所述,我用错了。 @Jeeped 我想我会使用你的解决方案。谢谢!
  • @nateAtwork 是的,但不是在 VBA 中,正如我在评论中指出的那样。 Jeep 的解决方案很聪明,不使用CLng

标签: excel vba error-handling


【解决方案1】:

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

【讨论】:

  • 这很有道理,谢谢你的解释。我很犹豫是否将它用于我当前的循环,因为它相当大,我不想错过循环中其他地方的错误。不过,我肯定会在未来使用它。
  • @nateAtwork 然后不清除错误,只是测试看看是否还有错误;或者仅在执行该一条语句时才生效,而不是在整个循环中生效。
  • 这绝对解决了它,我没有意识到你可以把它放在循环中。再次感谢。
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多