在我自己的 vba 函数中获得没有 gosub 的返回

Posted

技术标签:

【中文标题】在我自己的 vba 函数中获得没有 gosub 的返回【英文标题】:Getting return without gosub in my own function in vba 【发布时间】:2013-03-05 14:11:21 【问题描述】:

我已经与 vba 斗争了一段时间,但令人惊讶的是它并没有变得更好。 我编写了以下代码,因此我可以为对象使用特殊的比较运算符。

Public Function myEquals(v As CCtypestore) As Boolean

    If v Is Nothing Then
        myEquals = False
        Return
    End If

    If Me.Acronym = v.Acronym Then
        myEquals = True
        Return
    End If

    myEquals = False
    Return
End Function

我传入的对象 v 目前是 Nothing,所以我有点预计结果是微不足道的 False。令人惊讶的是,我在没有 gosub 的情况下返回错误。有什么线索吗?

【问题讨论】:

【参考方案1】:

删除Return 语句!

在 VBA 中,您使用 myEquals = ... 行设置返回值。

总而言之,您可以将您的函数简化为以下代码:

Public Function myEquals(v As CCtypestore) As Boolean
    If Not v Is Nothing Then
        myEquals = (Me.Acronym = v.Acronym)
    End If
End Function

或者,使用这个:

Public Function myEquals(v As CCtypestore) As Boolean
    On Error Goto ErrorHandler
    myEquals = (Me.Acronym = v.Acronym)
    Exit Function
ErrorHandler:
    myEquals = False
End Function

Return 是一个古老的遗物,如果你想在代码中使用直接跳转,即构建意大利面条代码!请参阅帮助文件中的此示例:

Sub GosubDemo()
Dim Num
' Solicit a number from the user.
    Num = InputBox("Enter a positive number to be divided by 2.")
' Only use routine if user enters a positive number.
    If Num > 0 Then GoSub MyRoutine    
    Debug.Print Num
    Exit Sub    ' Use Exit to prevent an error.
MyRoutine:
    Num = Num/2    ' Perform the division.
    Return    ' Return control to statement.
End Sub    ' following the GoSub statement.

【讨论】:

啊,所以我应该使用退出而不是返回呢?谢谢 在你的情况下,你甚至不需要Exit Function,因为你没有错误处理程序或类似的。 End Function 就够了! 提前返回与高度嵌套的代码是有争议的,看看网上有很多关于它的论据! @HaveAGuess:我同意,事实上我非常喜欢提前返回——比嵌套代码要好得多。但是,即使那样,您也会使用 Exit Function 而不是 Return【参考方案2】:

使用Exit Function 代替Return

您还可以通过使用类似

的结构来避免使用 Exit Function
If .... Then  
    'some code
ElseIf...Then 
   'some other code
ElseIf...Then 
   'etc 
Else  
   'final 
End if 

【讨论】:

以上是关于在我自己的 vba 函数中获得没有 gosub 的返回的主要内容,如果未能解决你的问题,请参考以下文章

excel VBA - 从函数中重新获得可变长度数组

如何通过VBA覆盖获得智能感知

VBA 函数调用不正确

删除按钮后访问 2007 “Return without Gosub”

为啥我的自动填充代码在我没有为 VBA 引用的单元格中显示 #N/A?

setInterval如何在结束后返回执行结果?