Sub
声明构成Sub过程主体的名称、参数和代码。
语法:
[ attributes ]
[ Public | Private | Friend | Protected ] [ Static ] [ Overridable ] Sub name [ ( Of typevars ) ] [ ( arglist ) ] [ binding-clause ]
[ statements ] ...
[ Exit Sub ] ...
[ statements ] ...
End Sub
- attributes
可选 过程的一个或多个受支持属性。
- Public
可选 指示Sub过程可被所有模块中的所有其他过程访问。如果在包含Option Private的模块中使用,则该过程在项目外不可用。
- Private
可选 指示Sub过程仅在其声明的模块中的其他过程可访问。
- Friend
可选 仅在类模块中使用。指示Sub过程在整个项目中可见,但对对象实例的控制器不可见。
- Protected
可选 (twinBASIC) 仅在类中使用。指示Sub过程可从声明类的内部和通过Inherits派生的类中访问,但外部调用者不能访问。
- Static
可选 指示Sub过程的局部变量在调用之间保留。Static属性不影响在Sub外部声明的变量,即使它们在过程中被使用。
- Overridable
可选 (twinBASIC) 将Sub标记为继承钩子,通过Inherits派生的类可以用Overrides子句替换。仅在参与Inherits层次结构的类成员上有意义。
- name
Sub的名称;遵循标准变量命名约定。特殊名称
New声明实例构造函数——参见继承了解链式构造*baseclass*.New(...)。- Of typevars
可选 一个或多个类型变量名称,遵循标准变量命名约定。名称以逗号分隔。使过程成为泛型Sub。
- arglist
可选 表示调用Sub过程时传递参数的变量列表。多个变量以逗号分隔。语法见下面的arglist。
- binding-clause
可选 (twinBASIC) 三种尾随子句之一,将此主体绑定到在其他地方声明的成员:
- Handles object.event [ , object.event … ]——将此Sub连接为命名事件的处理程序,取代传统的
Object_Event命名约定。参见Handles语句。 - Implements iface.member [ , iface2.member2 … ]——为命名的Interface(或Class)成员提供主体,取代传统的
Iface_Member命名约定。逗号分隔列表允许一个主体同时满足多个接口的成员。参见Implements语句。 - Overrides base.member——为通过Inherits继承的Overridable member提供主体。与同一标题上的Overridable组合可允许更深层派生类再次覆盖。
- Handles object.event [ , object.event … ]——将此Sub连接为命名事件的处理程序,取代传统的
- statements
可选 在Sub过程中执行的任何语句组。
- Exit Sub
可选 立即从Sub过程返回。(裸Return语句不会退出Sub——它保留给GoSub...Return构造。)
arglist
语法:一个或多个
[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ () ] [ As type ] [ = defaultvalue ]
- Optional
- 可选 指示参数不是必需的。如果使用,arglist中后续的所有参数也必须是可选的并使用Optional关键字声明。如果使用ParamArray,则不能用于任何参数。
- ByVal
- 可选 指示参数按值传递。
- ByRef
- 可选 指示参数按引用传递。与Visual Basic .NET不同,ByRef是默认的。
- ParamArray
- 可选 仅用作arglist中的最后一个参数,指示最后一个参数是Variant元素的Optional数组。ParamArray关键字允许传递任意数量的参数。不能与ByVal、ByRef或Optional一起使用。
- varname
- 表示参数的变量名称;遵循标准变量命名约定。
- type
- 可选 传递给过程的参数的数据类型;可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal、Date、String(仅变长)、Object、Variant、特定对象类型或泛型类型参数的名称。如果参数不是Optional,也可以指定用户自定义类型。
如果使用泛型类型参数的名称,它将绑定到传递给过程的参数的具体类型。名称绑定的作用域为过程主体。 - defaultvalue
- 可选 任何常量或常量表达式。仅对Optional参数有效。如果类型为Object,则显式默认值只能为Nothing。
如果未使用Public、Private或Friend显式指定,Sub过程默认为公共的。
如果未使用Static,局部变量的值在调用之间不保留。
Friend关键字只能在类模块中使用。但是,Friend过程可被项目中任何模块的过程访问。Friend过程不出现在其父类的类型库中,也不能被后期绑定。
Sub过程可以是递归的;即它们可以调用自身来执行给定任务。但是,递归可能导致堆栈溢出。Static关键字通常不与递归Sub过程一起使用。
所有可执行代码必须在过程中。Sub过程不能在另一个**Sub、Function或Property**过程内部定义。
Exit Sub语句导致从Sub过程立即退出。程序执行继续到调用Sub过程的语句之后的语句。任何数量的Exit Sub语句可以出现在Sub过程中的任何位置。
与Function过程类似,Sub过程是一个独立的过程,可以接受参数、执行一系列语句并更改其参数的值。但是,与返回值的Function过程不同,Sub过程不能用于表达式中。
Sub过程通过使用过程名称后跟参数列表来调用。有关如何调用Sub过程的具体信息,请参见**Call**语句。
Sub过程中使用的变量分为两类:在过程中显式声明的和未显式声明的。在过程中显式声明的变量(使用Dim或等效语句)始终是过程的局部变量。在过程中使用但未显式声明的变量也是局部变量,除非它们在过程外部的更高级别显式声明。
过程可以使用未在过程中显式声明的变量,但如果模块级定义的任何内容具有相同名称,则可能发生命名冲突。当过程引用与另一个过程、常量或变量同名的未声明变量时,假定过程引用的是该模块级名称。为避免此类冲突,请显式声明变量。使用**Option Explicit**语句强制显式声明变量。
INFO
GoSub、GoTo和Return不能进入或退出Sub过程。使用Exit Sub提前离开Sub。
示例
本示例使用Sub语句定义构成Sub过程主体的名称、参数和代码。
' Sub procedure definition.
' Sub procedure with two arguments.
Sub SubComputeArea(Length As Double, TheWidth As Double)
Dim Area As Double ' Declare local variable.
If Length = 0 Or TheWidth = 0 Then
' If either argument = 0.
Exit Sub ' Exit Sub immediately.
End If
Area = Length * TheWidth ' Calculate area of rectangle.
Debug.Print Area ' Print Area to Debug window.
End Sub