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 关键字允许您提供任意数量的参数。 它无法用于 ByVal、ByRef 或 Optional。 |
varname | 必填。 表示参数的变量的名称;遵循标准变量命名约定。 |
type | 可选。 传递给过程的参数的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(当前不受支持)、Date、String(仅限可变长度)、Object、Variant 或特定的对象类型。 如果参数不是可选的,则还可以指定用户定义的类型。 |
defaultvalue | 可选。 任何常量或常量表达式。 仅对 Optional 参数有效。 如果类型是一个 Object,则显式默认值只能为 Nothing。 |
备注
如果未使用 Public、 Private 或 Friend 显式指定, 则默认情况下,函数 过程是公共的。
如果未使用 Static ,则不会在调用之间保留局部变量的值。
Friend 关键字只能用于类模块。 但是, Friend 过程可以由项目的任何模块中的过程访问。 Friend 过程不出现在其父类的类型库中,Friend 过程也不能后期绑定。
Function 过程可以递归;即,它们可以自我调用以执行指定的任务。 但是递归可能会导致堆栈溢出。 Static 关键字通常不与递归 Function 过程配合使用。
所有可执行代码必须位于过程中。 不能在另一个 Function、Sub 或 Property 过程中定义 Function 过程。
Exit Function 语句会导致立即退出 Function 过程。 程序将继续执行已调用 Function 过程的语句后面的语句。 任何数量的 Exit Function 语句可以出现在 Function 过程中的任何位置。
与 Sub 过程一样,Function 过程是一个单独的过程,它可以获取参数、执行一系列语句和更改其参数的值。 但是,与 Sub 过程不同,当您希望使用函数返回的值时,可以在表达式的右侧使用 Function 过程,就像使用任何固有函数(例如 Sqr、Cos 或 Chr)一样。
在表达式中使用函数名称(后跟括号中的参数列表)调用 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 支持和反馈,获取有关如何接收支持和提供反馈的指南。