如何从VBA中的函数返回错误对象?
问题描述:
我有一个函数,其目的是返回一个字符串来表示函数已完成并检索所需值或错误以指示存在问题。如何从VBA中的函数返回错误对象?
要看看我是否能做到这一点,我撞坏一起以下几点:
Private Function one()
Debug.Print TypeName(two(False))
End Function
Private Function two(b As Boolean) As Variant
Dim e As New ErrObject
If (b) Then
two = True
Else
two = e.number
End If
End Function
现在,这种失败在two = e.number
,因为你似乎没有能够设置这样一个错误号 - 语法不正确。
我可以使用err.raise但随后的意图是通过整个错误的对象回来,我就可以有一个自定义数字,在我自己的描述等填写...
你如何实际传递err对象回来了吗?你真的可以这样做吗?这是实现我所要做的最有效的方法吗?
谢谢
答
你没有。 Err
是来自标准库VBA.Information
模块的全局作用域Function
,该模块返回ErrObject
实例。
意图是通过整个错误的对象回来,我就可以有一个自定义号码,并填写在我自己的描述
你不需要通过整个错误对象回抛出自定义错误。
Const ERR_SomethingBad = vbObjectError + 42
Err.Raise ERR_SomethingBad, "MyModule.MyProcedure", "Uh-oh"
Err
已经在全球范围内 - 你不需要来回传递错误的对象......而事实上,你根本无法。因为ErrObject
类不可创建。这:
Dim e As ErrObject
Set e = New ErrObject
引发运行时错误429“ActiveX无法创建对象”。
非常想法错误背后(和例外情况,如果你的任何熟悉功能异常的语言),是他们取代旧的过时的“返回状态代码”的方式,如:
''' DON'T DO THIS, IT's 2017!!!
Public Function DoSomething(ByVal p1 As Double, ByRef outResult As Double) As Long
If p1 = 0 Then
DoSomething = 11 'return code for division by zero error
Exit Function
End If
outResult = 42/p1
DoSomething = 0 'return code for OK - everything went well!
End Function
有了这种模式,每个程序是一个Function
返回一个错误代码;实际的返回值作为一个ByRef
/输出参数传递,调用者就必须这样做才可以信任的结果:
Dim result As Double
Dim e As Long
e = DoSomething(42, result)
If e = 0 Then
' happy path
Else
MsgBox Error$(e) ' error path
End If
的On Error
声明简化通过采取最错误处理的担忧出来的代码“快乐之路”。
不应该只是'Err'吗? 'two = Err'? – dwirony
请看这里:http://www.cpearson.com/excel/ReturningErrors.aspx –
我认为你在VBA中所做的一切都是'提升'一个错误 - 你不能直接创建一个'Err'对象http:// www。 cpearson.com/Excel/ErrorHandling.htm。你的'ErrObject'似乎是VB。Net –