如何从VBA函数返回结果

Mik*_*ike 255 excel vba return function return-value

如何从函数返回结果?

例如:

Public Function test() As Integer
    return 1
End Function
Run Code Online (Sandbox Code Playgroud)

这给出了编译错误.

如何让这个函数返回一个整数?

Dan*_*Dan 399

对于非对象返回类型,您必须将值分配给函数的名称,如下所示:

Public Function test() As Integer
    test = 1
End Function
Run Code Online (Sandbox Code Playgroud)

用法示例:

Dim i As Integer
i = test()
Run Code Online (Sandbox Code Playgroud)

如果函数返回Object类型,那么必须使用如下Set关键字:

Public Function testRange() As Range
    Set testRange = Range("A1")
End Function
Run Code Online (Sandbox Code Playgroud)

用法示例:

Dim r As Range
Set r = testRange()
Run Code Online (Sandbox Code Playgroud)

请注意,为函数名称指定返回值不会终止函数的执行.如果要退出该功能,则需要明确说出Exit Function.例如:

Function test(ByVal justReturnOne As Boolean) As Integer
    If justReturnOne Then
        test = 1
        Exit Function
    End If
    'more code...
    test = 2
End Function
Run Code Online (Sandbox Code Playgroud)

文档:http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx

  • 为了完整性,应该注意当你返回一个对象(例如``Range`)时,你需要像在常规方法中设置对象变量一样使用`Set`.因此,例如,如果"test"是返回Range的函数,则return语句看起来像这样`set test = Range("A1")`. (31认同)
  • @PsychoData - 只是因为你通常会设置一个对象变量,而没有`set`这样做可能会导致问题.我没有问题,但是如果我使用`set`我不会:). (3认同)
  • 在 VBA 中调用时,该函数将返回一个范围对象,但从工作表中调用时,它将只返回值,因此 `set test = Range("A1")` 完全等同于 `test = Range("A1") .Value`,其中“测试”被定义为一个变体,而不是一个范围。 (2认同)

fro*_*die 84

VBA函数将函数名称本身视为一种变量.因此return,您只需说:而不是使用" "语句,而不是

test = 1
Run Code Online (Sandbox Code Playgroud)

但是请注意,这并没有突破该功能.此语句后的任何代码也将被执行.因此,您可以使用许多赋值语句来分配不同的值test,并且当您到达函数末尾时的值将是返回的值.

  • 实际上,您使用额外的信息更清楚地回答了这个问题(这可能会导致 VBA 新手提出另一个问题)。保持良好的工作 (2认同)

Lim*_*awk 36

只是将返回值设置为函数名仍然与Java(或其他)语句不完全相同return,因为在java中,return退出函数,如下所示:

public int test(int x) {
    if (x == 1) {
        return 1; // exits immediately
    }

    // still here? return 0 as default.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在VB中,如果未在函数末尾设置返回值,则精确等效项需要两行.因此,在VB中,确切的推论看起来像这样:

Public Function test(ByVal x As Integer) As Integer
    If x = 1 Then
        test = 1 ' does not exit immediately. You must manually terminate...
        Exit Function ' to exit
    End If

    ' Still here? return 0 as default.
    test = 0
    ' no need for an Exit Function because we're about to exit anyway.
End Function 
Run Code Online (Sandbox Code Playgroud)

既然如此,那么知道你可以像使用方法中的任何其他变量一样使用return变量也是很好的.像这样:

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test <> 1 Then ' Test the currently set return value
        test = 0 ' Reset the return value to a *new* value
    End If

End Function 
Run Code Online (Sandbox Code Playgroud)

或者,返回变量如何工作的极端例子(但不一定是你应该如何实际编码的一个很好的例子) - 那个会让你夜不能寐的例子:

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test > 0 Then

        ' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,
        ' AND THE RESULT RESETTING THE RETURN VALUE.
        test = test(test - 1)

    End If

End Function
Run Code Online (Sandbox Code Playgroud)

  • "知道你可以像使用方法中的任何其他变量一样使用返回变量"也很好*"*大多数是真的 - 但是例如,如果返回类型是`Variant`并且你的目标是返回一个数组,那么就像` ReDim测试(1到100)`将触发错误.而且,即使它*可以像对待整数一样处理基本类型,但它被认为是有点单一的.它使代码更难阅读.VBA程序员扫描分配给函数名称的行以了解函数的作用.使用函数名作为常规变量不必要地模糊了这一点. (2认同)