For Each element In group
[ statements ]
[ Exit For ]
[ statements ]
Next [ element ]
element 必填。 用于循环访问集合或数组的变量。 对于集合, 元素 只能是 Variant 变量、泛型对象变量或任何特定对象变量。 对于数组,元素 仅可是 Variant 变量。
组 必填。 对象集合或数组(用户定义类型的数组除外)的名称。
group 必填。 对象集合或数组(用户定义类型的数组除外)的名称。
statements 可选。 在组 中的每个项目上执行的一个或多个语句。
如果组 中有至少一个元素,则进入“For…Each”块。 输入循环后,将针对 组中的第一个元素执行循环中的所有语句。 如果组 中有多个元素,则继续为每个元素执行循环中的语句。 组 中不再有元素时,退出循环并继续执行“Next”语句后的语句。
任意数量的 Exit For 语句可以放置在循环中的任意位置,作为退出的替代方法。 计算某些条件后,通常使用 Exit For,例如
If…然后,在“下一步”之后立即将控制权转移到 语句。可通过将“For…Each…Next”循环放置在另一个该循环内来嵌套“For…Each…Next”循环。
但是,每个,每个循环元素 必须是唯一的。
此示例使用“For Each…Next”语句搜索集合中所有元素的“文本”属性,以搜索是否存在字符串“Hello”。 在该示例中,MyObject 是文本相关对象并且使集合 MyCollection的元素。 二者皆是仅用于说明目的的通用名称。
Dim Found, MyObject, MyCollection
Found = False ' Initialize variable.
For Each MyObject In MyCollection ' Iterate through each element.
If MyObject.Text = "Hello" Then ' If Text equals "Hello".
Found = True ' Set Found to True.
Exit For ' Exit loop.
End If
Next
For counter = start To end [ Step step ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
counter 必填。 用作循环计数器的数值变量。 该变量不能是布尔值或数组元素。
start 必填。 counter 的初始值。
end 必填。 counter 的最终值。
step 可选。 counter 每次通过循环时更改的量。 如果不指定,step 默认为 1。
statements 可选。 For 和 Next 之间执行指定次数的一个或多个语句。
循环中的所有语句均执行完毕后,counter 将会增加 step。 此时,要么再次执行循环中的语句(基于导致循环最初执行的同一测试),要么退出循环并继续执行 Next 语句后面的语句。
[ Private | Public | Friend ] [ Static ] Sub name [ ( arglist ) ]
[ statements ]
[ Exit Sub ]
[ statements ]
End Sub
Public 可选。 指示 Sub 过程对所有模块中的过程是可访问的。 如果在包括 Option Private 语句的模块中使用,则此过程在项目外部不可用。
Private 可选。 指示 Sub 过程仅对声明此过程的模块中的其他过程是可访问的。
Friend 可选。 仅在类模块中使用。 指示 Sub 过程在整个项目中是可见的,但对对象的实例的控制器不可见。
Static 可选。 指示在调用之间保留 Sub 过程的局部变量。 Static 属性不会影响在 Sub 外部声明的变量(即使在此过程中使用这些变量)。
name 必填。 Sub 的名称;遵循标准的变量命名约定。
arglist 可选。 表示在调用 Sub 过程时传递给它的参数的变量列表。 多个变量之间使用逗号分隔。
statements 可选。 任意一组可在 Sub 过程中执行的语句。
arglist 参数包含以下语法和部分:
[ 可选 ][ ByVal | ByRef ][ ParamArray ] varname [ ( ) ] [ Astype ] [ =defaultvalue ]
Optional 可选。 一个指示参数是非必需的关键字。 如果使用, arglist 中的所有后续参数也必须是可选的,并使用 Optional 关键字声明。 如果使用了 ParamArray,则不能将 Optional 用于任何参数。
ByVal 可选。 指示按值传递参数。
ByRef 可选。 指示按引用传递参数。 在 Visual Basic 中,ByRef 为默认值。
ParamArray 可选。 仅用作 arglist 中的最后一个参数,以指示最终参数是 Variant 元素的 Optional数组。 ParamArray 关键字允许您提供任意数目的参数。 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 过程既不会显示在其父类的类型库中,也不会成为稍后可绑定的 Friend 过程。
Sub 过程可能是递归的;即,它们可调用自身来执行给定任务。 但是,递归可能导致堆栈溢出。 Static 关键字通常不与递归 Sub 过程一起使用。
所有可执行代码必须在过程中。 不能在另一个 Sub、Function 或 Property 过程中定义 Sub 过程。
Exit Sub 关键字可导致立即退出 Sub 过程。 程序将继续执行调用 Sub 过程的语句后面的语句。 任意数目的 Exit Sub 语句可出现在 Sub 过程中的任意位置。
与 Function 过程一样,Sub 过程是一个单独的过程,可接受参数、执行一系列语句以及更改参数的值。 但是,与可以返回值的 Function 过程不同的是,Sub 过程不能在表达式中使用。
通过使用过程名称后跟参数列表来调用 Sub 过程。 有关如何调用 Sub 过程的具体信息,请参阅 Call 语句。
在 Sub 过程中使用的变量可分为两类:在过程中显式声明的变量和未显式声明的变量。 在过程中显式声明的变量(使用 Dim 或等同项)始终是过程内的局部变量。 在过程中使用但未显式声明的变量依然是局部变量,除非在过程外某些更高级别显式声明这些变量。
过程可使用未在过程中显式声明的变量,但如果您在模块级别定义了使用相同名称的变量,则会发生命名冲突。 如果您的过程引用使用与其他过程、常量或变量名称相同的未声明变量,则假定您的过程引用的是该模块级别的名称。 为了避免此类冲突,请显式声明变量。 使用 Option Explicit 语句强制显式声明变量。
Private Sub getAverage(ByRef result As Double, ParamArray nums())
Dim count As Integer
For Each num In nums
If num > 0 Then
result = result + num
count = count + 1
End If
Next
If count > 0 Then
result = result / count
End If
End Sub
Sub learn1()
Dim result As Double
Call getAverage(result, -12.43, 1)
MsgBox "The average is " & result
End Sub
可以声明一个数组以处理一组相同数据类型的值。 数组是具有多个可存储值的隔离舱的单个变量,而典型的变量只有一个存储隔离舱,其中只能存储一个值。 您可以在需要引用数组中包含的所有值时将数组作为整体引用,也可以引用其中的单个元素。
Dim curExpense(364) As Currency
若要设置单个元素的值,您可以指定该元素的索引。
curExpense(11) = 20
使用模块顶部的 Option Base 语句将第一个元素的默认索引从 0 更改为 1。
Option Base 1
Dim curExpense(365) As Currency
可以通过使用 To 子句明确设置数组的下限
Dim curExpense(1 To 365) As Currency
Dim strWeekday(7 To 13) As String
调用 Sub 或 Function 过程时,可以按过程定义中出现的顺序按位置提供 参数 ,也可以按名称提供参数,而不考虑位置。
命名参数由参数名称后跟一个冒号和一个等号 (:=) 然后是参数值组成。
当您调用具有可选参数的过程时,命名参数尤其有用。 如果使用命名参数,则不必包括逗号来指示缺失位置的参数。 使用命名参数更便于跟踪传递的参数和省略的参数。
在过程定义中,可选参数的前面是 Optional关键字。 您也可以在过程定义中为可选参数指定一个默认值。
使用 Me 关键字可引用运行代码的 对象的当前实例。
与当前对象关联的所有过程可以访问称为 Me 的对象。
比如
Me.ForeColor = System.Drawing.Color.Crimson
Me.Close()
尽管 Me 的行为与对象变量类似,但不能声明它或为其分配任何内容。 Me 始终引用当前实例。
对象的当前实例是当前在其中执行代码的实例。 由于所有代码都在一个过程中执行,因此当前实例就是调用该过程的那个实例。
Me 关键字充当引用当前实例的对象变量。 如果过程不是共享的,则它可以使用 Me 关键字来获取指向当前实例的指针。 共享过程不能与类的特定实例相关联。
使用 Me 对于将当前实例传递到另一个模块中的过程特别有用。 例如,假设你有多个 XML 文档,并且希望向所有文档添加一些标准文本。 下面的示例定义了执行此操作的过程。
Sub addStandardText(XmlDoc As System.Xml.XmlDocument)
XmlDoc.CreateTextNode("This text goes into every XML document.")
End Sub
每个 XML 文档对象都可以调用该过程,并将其当前实例作为参数进行传递。 下面的示例演示这一操作。
addStandardText(Me)