Function 语句

声明构成 Function过程主体的名称、参数和代码。

语法

[公共 | 私人 | 好友][ 静态 ] 函数名称 [ ( arglist ) ] [ Astype ]
[ 语句 ]
[ name=表达式 ]
[ Exit 函数 ]
[ 语句 ]
[ name=表达式 ]
End Function

Function 语句的语法包含以下部分:

Part 说明
Public 可选。 指示 Function 过程可由所有模块中的所有其他过程访问。 如果在包含 Option Private 的模块中使用,那么该过程不能在项目的外部使用。
Private 可选。 指示 Function 过程仅能由声明它的模块中的其他过程访问。
Friend 可选。 仅在类模块中使用。 指示 Function 过程在整个项目中可见,但是对于对象实例的控制器不可见。
Static 可选。 指示在两次调用之间保留 Function 过程的本地变量Static 属性不影响在 Function 外部声明的变量,即使在过程中使用它们也一样。
名称 必填。 Function 的名称;遵循标准变量命名约定。
arglist 可选。 代表调用 Function 过程时传递给该过程的参数的变量列表。 多个变量使用逗号分隔。
type 可选。 函数过程返回的值的数据类型;可以是字节布尔值、整数货币精度、双精度小数 (当前不支持) 、日期字符串 (,固定长度) 、对象Variant 或任何用户定义的类型除外。
statements 可选。 任何一组要在 Function 过程中执行的语句。
expression 可选。 返回 Function 的值。

arglist 参数具有以下语法和组成部分:

[ 可选 ][ ByVal | ByRef ][ ParamArray ] varname [ ( ) ] [ Astype ] [ =defaultvalue ]

Part 说明
可选 可选。 指示不需要参数。 如果使用,arglist 中的所有后续参数也必须是可选的,并使用 Optional 关键字 (keyword) 进行声明。 如果使用了 ParamArray,则不能将 Optional 用于任何参数。
ByVal 可选。 指示按值传递参数。
ByRef 可选。 指示按引用传递参数。 ByRef 是 VBA 中的默认值,与 Visual Basic .NET 中不同。
ParamArray 可选。 仅用作 arglist 中的最后一个参数来指示最后的参数为 Variant 元素的 Optional 数组。 ParamArray 关键字允许您提供任意数量的参数。 它无法用于 ByValByRefOptional
varname 必填。 表示参数的变量的名称;遵循标准变量命名约定。
type 可选。 传递给过程的参数的数据类型;可以是 ByteBooleanIntegerLongCurrencySingleDoubleDecimal(当前不受支持)、DateString(仅限可变长度)、ObjectVariant 或特定的对象类型。 如果参数不是可选的,则还可以指定用户定义的类型。
defaultvalue 可选。 任何常量或常量表达式。 仅对 Optional 参数有效。 如果类型是一个 Object,则显式默认值只能为 Nothing

备注

如果未使用 PublicPrivateFriend 显式指定, 则默认情况下,函数 过程是公共的。

如果未使用 Static ,则不会在调用之间保留局部变量的值。

Friend 关键字只能用于类模块。 但是, Friend 过程可以由项目的任何模块中的过程访问。 Friend 过程不出现在其父类的类型库中Friend 过程也不能后期绑定。

Function 过程可以递归;即,它们可以自我调用以执行指定的任务。 但是递归可能会导致堆栈溢出。 Static 关键字通常不与递归 Function 过程配合使用。

所有可执行代码必须位于过程中。 不能在另一个 FunctionSubProperty 过程中定义 Function 过程。

Exit Function 语句会导致立即退出 Function 过程。 程序将继续执行已调用 Function 过程的语句后面的语句。 任何数量的 Exit Function 语句可以出现在 Function 过程中的任何位置。

Sub 过程一样,Function 过程是一个单独的过程,它可以获取参数、执行一系列语句和更改其参数的值。 但是,与 Sub 过程不同,当您希望使用函数返回的值时,可以在表达式的右侧使用 Function 过程,就像使用任何固有函数(例如 SqrCosChr)一样。

在表达式中使用函数名称(后跟括号中的参数列表)调用 Function 过程。 有关如何调用 Function 过程的具体信息,请参阅 Call 语句。

要从函数返回值,请为函数名称赋值。 任意数量的此类赋值可以出现在过程中的任意位置。 如果未对名称进行赋值,该过程将返回一个默认值:数字函数返回 0,字符串函数返回零长度的字符串 (""),Variant 函数返回 Empty。 如果在 Function 内没有为名称指定对象引用(使用 Set),那么返回对象引用的函数将返回 Nothing

以下示例演示如何将返回值分配给函数。 在这种情况下,将为名称赋予 False 以指示找不到某个值。

Function BinarySearch(. . .) As Boolean 
'. . . 
 ' Value not found. Return a value of False. 
 If lower > upper Then 
  BinarySearch = False 
  Exit Function 
 End If 
'. . . 
End Function

Function 过程中使用的变量分为两类:一类在过程中显式声明,另一类则不是。

过程中显式声明(使用 Dim 或等效语句)的变量始终是该过程的局部变量。 在过程中使用但未显式声明的变量依然是局部变量,除非在过程外某些更高级别显式声明这些变量。

过程可以使用未在过程中显式声明的变量,但如果在模块级别定义的任何内容具有相同的名称,则会发生命名冲突。 如果过程引用与其他过程、常量或变量具有相同名称的未声明变量,则假定该过程引用该模块级别名称。 显示声明变量可避免此类型的冲突。 使用 Option Explicit 语句强制显式声明变量。

Visual Basic 可以重新安排算术表达式以提高内部效率。 当函数更改相同表达式中变量的值时,应避免在算术表达式中使用 Function 过程。 有关算术运算符的详细信息,请参阅 运算符

示例

此示例使用 Function 语句声明组成 Function 过程主体的名称、参数和代码。 上一个示例使用初始化的硬类型 Optional 参数。

' The following user-defined function returns the square root of the 
' argument passed to it. 
Function CalculateSquareRoot(NumberArg As Double) As Double 
 If NumberArg < 0 Then ' Evaluate argument. 
  Exit Function ' Exit to calling procedure. 
 Else 
  CalculateSquareRoot = Sqr(NumberArg) ' Return square root. 
 End If 
End Function

使用 ParamArray 关键字允许函数接受可变数量的参数。 在以下定义中,它按值传递。

Function CalcSum(ByVal FirstArg As Integer, ParamArray OtherArgs()) 
Dim ReturnValue 
' If the function is invoked as follows: 
ReturnValue = CalcSum(4, 3, 2, 1) 
' Local variables are assigned the following values: FirstArg = 4, 
' OtherArgs(1) = 3, OtherArgs(2) = 2, and so on, assuming default 
' lower bound for arrays = 1. 

Optional 参数具有默认值和类型,而不是 Variant

' If a function's arguments are defined as follows: 
Function MyFunc(MyStr As String,Optional MyArg1 As _
 Integer = 5,Optional MyArg2 = "Dolly") 
Dim RetVal 
' The function can be invoked as follows: 
RetVal = MyFunc("Hello", 2, "World") ' All 3 arguments supplied. 
RetVal = MyFunc("Test", , 5) ' Second argument omitted. 
' Arguments one and three using named-arguments. 
RetVal = MyFunc(MyStr:="Hello ", MyArg1:=7) 

另请参阅

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。