2010-05-06 159 views
186

如何从函数返回结果?如何从VBA函数返回结果

例如:

Public Function test() As Integer 
    return 1 
End Function 

这给出了一个编译错误。

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

+5

文档:http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx – 2014-09-15 07:07:55

回答

286

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

Public Function test() As Integer 
    test = 1 
End Function 

用法示例:

Dim i As Integer 
i = test() 

如果该函数返回一个对象类型,那么你必须使用Set这样的关键字:

Public Function testRange() As Range 
    Set testRange = Range("A1") 
End Function 

用法示例:

Dim r As Range 
Set r = testRange() 

请注意,为函数名称分配返回值不会终止函数的执行。如果你想退出该功能,那么你需要明确地说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 

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

+26

为了完整起见,应该注意的是,当您返回一个对象例如'Range'),您需要像使用常规方法设置对象变量那样使用'Set'。因此,例如,如果“test”是一个返回Range的函数,则返回语句看起来像这样:'set test = Range(“A1”)'。 – 2013-03-21 15:23:08

+0

这是为什么@JayCarr? – PsychoData 2014-02-11 14:07:52

+3

@PsychoData - 简单地说,因为这就是你如何设置一个对象变量的一般情况,而没有'set'就会导致问题。我有问题没有,但如果我使用'set'我不:)。 – 2014-02-11 14:36:38

75

VBA函数将函数名本身作为一种变量。因此,而不是使用“return”的声明,你只是说:

test = 1 

通知,不过,这并没有打出来的功能。此声明后的任何代码也将被执行。因此,可以有许多赋值语句将不同的值赋予test,并且当到达函数结尾时的任何值都将返回值。

+0

其实你用更多的信息更清楚地回答了这个问题(这可能会导致另一个问题,从新到VBA的人)。保持良好的工作 – Adarsha 2010-05-06 14:39:22

+0

对不起,看起来你只是回答了我的回答,我刚刚回答了同样的事情,但只是增加了它没有突破功能的事实。这是一个很好的补充,我只是觉得它更适合作为评论。我不确定什么是适当的礼仪,我想这样做是不礼貌的,因为这是一个很好的答案,但它不会让我撤销它。 – Dan 2010-05-06 15:20:21

28

只需设置返回值函数名仍然没有完全相同一样的Java(或其他)return语句,因为在Java中,return退出函数,就像这样:

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

    // still here? return 0 as default. 
    return 0; 
} 

在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 

既然是这样的话,它也很高兴知道你可以使用返回变量像法任何其他变量。就像这样:

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 

或者极端例如如何返回变量工作(但不一定是一个很好的例子,你应该如何实际代码)-the一个,将让你在夜间:

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 
+2

“也很高兴知道你可以像方法中的任何其他变量一样使用返回变量”is * mostly * true - 但例如,如果返回类型是“Variant”,并且您的目标是返回一个数组,那么像'ReDim test(1到100)'会引发错误。另外,即使它*可以像对待像Integers这样的基本类型,它被认为有点单一。它使代码更难阅读。 VBA程序员扫描分配给函数名称的行来理解函数的功能。使用函数名称作为常规变量不必要地掩盖了这一点。 – 2016-04-04 13:49:46

+0

@JohnColeman,完全同意这两点。绝不应该将最后一个例子作为推荐的方法之一。但是,主题问题是关于如何返回一个变量,所以这只是一个试图全面解释VB的返回结果,以及它们如何工作。当然,最后一种情况并不是建议。 (我当然不会将代码作为一个例子。) 所以,你的观点是很好的,很好的补充。谢谢。 – LimaNightHawk 2016-04-04 15:00:48

+0

它*对于小函数很有用,并且是任何VBA程序员都应该知道的东西,所以我没有提到它的问题。我只是认为应该包括一个警告。 – 2016-04-04 15:10:57

-2

在下面的代码保存返回值的变量retVal然后MsgBox可用于显示的值:

Dim retVal As Integer 
retVal = test() 
Msgbox retVal