VBA出错时如何从函数返回

Posted

技术标签:

【中文标题】VBA出错时如何从函数返回【英文标题】:How to return from a function in case of error in VBA 【发布时间】:2011-06-01 00:40:59 【问题描述】:

我是 VBA 新手,当我看到错误时想从函数返回。不能这样做。有什么指点吗?

Function GetEditboxValue(control As IRibbonControl, text As String) As String

    If Not IsMissing(text) Then
        If Not IsNumeric(text) Then
            MsgBox "Please enter numeric value only."
            ' I WANT TO RETURN HERE 
        End If
    End If


    If control.id = "xyz" Then
    spaceAboveTable = text
    End If


End Function

【问题讨论】:

您确实意识到您的函数没有返回值,对吧?在 VBA 中,不返回值的函数应声明为 Sub。否则,您需要在退出函数之前为GetEditboxValue 分配一个值。 (显然,这是在您不想提前退出 而不 返回值的情况。) 别忘了,这个函数看起来很丑。它没有从编辑框(顾名思义)返回一个值,它似乎做的唯一一件事就是产生一些令人讨厌的副作用 - 迟早会给您带来维护方面的麻烦。它没有将错误检测与错误处理分开,而是使用 MsgBox 自己处理错误。最好将这些问题分开,如果文本不是数字,返回错误值或引发错误事件或类似的东西,但让调用者决定是否要显示消息框或进行一些不同的错误处理。 @Cody,为了澄清您对@ydobonmai 的评论,所有声明为函数的例程都将返回一个值。如果您没有使用像 'GetEditboxValue = ' 这样的行准确指定 what 值,那么您的函数将返回函数类型的默认值。在这种情况下,它是空字符串,但它可以是 0、""、False、Empty、Nothing 等。 @Doc,我同意。我是 VBA 新手,这是我写得很快的东西,只是不知道 EXIT FUNCTION。该功能甚至不完整。我只是碰壁并在这里问。感谢您宝贵的时间和宝贵的时间。 【参考方案1】:

您需要将EXIT FUNCTION 放在那里以退出进一步执行:

Function GetEditboxValue(control As IRibbonControl, text As String) As String

    If Not IsMissing(text) Then
        If Not IsNumeric(text) Then
            MsgBox "Please enter numeric value only."
            EXIT FUNCTION
        End If
    End If


    If control.id = "xyz" Then
    spaceAboveTable = text
    End If


End Function

【讨论】:

@Sarfraj,我在这里有一个 VBA 问题:- ***.com/questions/4565185/…。你能帮忙吗? 如果是子程序,而不是函数,则为 EXIT SUB。【参考方案2】:

在一般意义上(我实际上并没有说任何尚未说过的话):

Function Foo(inputVar As Double) As Double

    On Error GoTo ErrorHandler

    ' Code assigning something to returnValue and defaultOutput

    Foo = returnValue

    Exit Function

    ErrorHandler:

    Foo = defaultOutput

 End Function

当然,它没有理由必须是 Double。

(编辑因为我有第二个“退出函数”而不是“结束函数”。)

【讨论】:

【参考方案3】:

您可以在 MsgBox 声明之后使用 Exit Function

【讨论】:

【参考方案4】:

另一种选择是使用Err.Raise 显式引发错误。由于您在此函数中没有错误处理程序(即没有On Error ... 行),因此错误将通过调用堆栈向上传播,直到它运行到错误处理程序中。

【讨论】:

以上是关于VBA出错时如何从函数返回的主要内容,如果未能解决你的问题,请参考以下文章

使用个人 VBA 函数时出错

用Excel使用VBA时显示运行错误5,错误调用参数,程序特别简单,如图,求问哪里出错了

使用listbox multiselect从列表返回多个索引时出错

在 VBA 中设置 UDF 描述时出错

尝试使用 RETURNING 和更新/插入从 plpgsql 函数返回时出错

使用 VBA 出错后重置 html 元素