如何从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对象回来了吗?你真的可以这样做吗?这是实现我所要做的最有效的方法吗?

谢谢

+0

不应该只是'Err'吗? 'two = Err'? – dwirony

+2

请看这里:http://www.cpearson.com/excel/ReturningErrors.aspx –

+0

我认为你在VBA中所做的一切都是'提升'一个错误 - 你不能直接创建一个'Err'对象http:// www。 cpearson.com/Excel/ErrorHandling.htm。你的'ErrObject'似乎是VB。Net –

你没有。 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声明简化通过采取最错误处理的担忧出来的代码“快乐之路”。