Excel VBA宏和错误消息

时间:2017-09-01 19:25:32

标签: excel vba excel-vba excel-udf

我对Excel非常缺乏经验,而且我遇到了编程宏的问题。无论是否设置断点并跳过,它都会在没有任何错误对话框的情况下停止。

我错过了什么吗?我是否必须明确打开错误消息?

这样的事情,在一个模块中:

Function Provoke(XYZ As Integer) As Integer
   Provoke = XYZ / 0
End Function

函数用在单元格内部的公式中,如此

=Provoke(4711)

我怎么能让它以零为由抱怨?

2 个答案:

答案 0 :(得分:4)

如果在从工作表调用UDF时函数中发生错误,您将看不到任何错误消息 - 您只是将#VALUE错误返回到单元格

如果从VBA中的Sub调用相同的函数,您将看到错误。

如果您希望能够返回更具体的错误消息,则需要进行更多编码。

E.g。

Function Provoke(XYZ As Integer)

   On Error GoTo haveError
   Provoke = XYZ / 0
   Exit Function

haveError:
    'what type of error did we get?
    Select Case Err.Number
        Case 11: Provoke = CVErr(xlErrDiv0)
        Case Else: Provoke = "Error!"
    End Select

End Function

这方面的一个很好的参考:http://www.cpearson.com/excel/ReturningErrors.aspx

答案 1 :(得分:1)

是的,您需要做出规定告诉VBA如果发生错误该怎么做。

由于代码中的这一行而发生错误:

Provoke = XYZ / 0

没有数字可以被0整除,并且会产生错误。基础数学:any number ÷ 0 = ∞

要第一手验证,您可以尝试这样的方法来捕获错误编号以及来源和描述:

Function Provoke(XYZ As Integer)
    On Error Resume Next
    Provoke = XYZ / 0
    If Err.Number <> 0 Then Provoke = "Error# " & Err.Number & " - generated by " & Err.Source & " - " & Err.Description
    On Error GoTo 0
End Function

现在,如果你尝试

=Provoke(4711)

您将获得如下结果:

Error# 11 - generated by VBAProject - Division by zero