2017-09-01 53 views
0

我在Excel中很缺乏经验,我遇到了编程宏的问题。无论我是否设置了断点并逐步结束,它都会停止,不会出现任何错误对话框。Excel VBA宏和错误消息

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

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

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

功能是使用的公式在细胞内,这样

=Provoke(4711) 

我怎么能让他抱怨师零?

回答

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

如果您还希望捕获其他特定错误,请检查http://onlinelibrary.wiley.com/doi/10.1002/9781 118257616.app3/pdf以及(我总是保持书签)。 –

+0

在你的第一段很好! – curious

2

是的,你需要作出规定告诉VBA如果发生错误做什么。

这个错误是因为该行代码中存在的:

Provoke = XYZ/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 
+2

'XYZ/0'不返回错误值,它会产生错误。所以,即使'Provoke'是一个'Variant',它也不会工作,因为没有什么可以分配给'Provoke'。如果错误需要返回,那么需要将引发的错误陷入困境,然后可能会返回一个“Variant/Error”(在更改函数类型以允许该错误之后)。 – YowE3K

+0

不错的pt YowE3K。我最初的重点是强调“XYZ/0”是一个无限数量的事实。在你的笔记之后,我已经相应地更新了我的答案。感谢名单 – curious