如何从一个函数中返回结果?
例如:
Public Function test() As Integer
return 1
End Function
这会产生编译错误。
我该如何使此函数返回一个整数?
如何从一个函数中返回结果?
例如:
Public Function test() As Integer
return 1
End Function
这会产生编译错误。
我该如何使此函数返回一个整数?
对于非对象返回类型,你必须将值分配给函数名称,像这样:
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
文档:Function语句
Range
)时,需要像在常规方法中设置对象变量一样使用 Set
。因此,例如,如果“test”是返回 Range
的函数,则返回语句应如下所示:set test = Range("A1")
。 - Jay Carrset
来设置对象变量,是因为不使用set
可能会导致问题。我在没有使用set
的情况下遇到了问题,但如果我使用了set
就不会出现问题。 - Jay Carrset test = Range("A1")
和 test = Range("A1").Value
是完全等同的,其中“test”被定义为 Variant 类型,而不是 Range 类型。 - Doug JenkinsVBA函数会将函数名称本身视为一种变量。因此,您只需使用一个函数名称即可,而不是使用“return
”语句:
test = 1
需要注意的是,这并不会跳出函数。在此语句之后的任何代码也将被执行。因此,你可以有许多赋值语句来分配不同的值给 test
,而当你到达函数结尾时,无论其值为何都将成为返回的值。
仅将返回值设置为函数名称仍然不完全等同于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
或者,极端的示例来说明返回变量的工作方式(但并不一定是你实际编写代码应该使用的好示例)- 这将使你整晚都睡不好觉:
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
Variant
且您的目标是返回一个数组,则类似于ReDim test(1 to 100)
的操作将触发错误。此外,即使可以像对待基本类型(如Integers
)那样处理它,但这被认为是不太符合惯例的。它会使代码更难阅读。VBA程序员扫描分配给函数名称的行以了解函数的作用。将函数名称用作常规变量会不必要地使其变得模糊。” - John ColemanExit Function
与 return
的关系。 - AustinReDim
。Dim test As Variant
后跟 ReDim test(1 to 100)
是没有问题的。在函数体中不能使用变量函数的名称来执行此操作,这表明您不能像在函数体中使用其他变量一样使用返回变量,这正是我所说的。顺便说一句,您使用感叹号似乎有些过头了。在互联网上,它似乎有点像喷子,尽管您的评论并没有任何喷子的意思。 - John Coleman