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 = 您需要将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出错时如何从函数返回的主要内容,如果未能解决你的问题,请参考以下文章
用Excel使用VBA时显示运行错误5,错误调用参数,程序特别简单,如图,求问哪里出错了
使用listbox multiselect从列表返回多个索引时出错