Function CountStrings (longstring, target) Dim position, count position = 1 Do While InStr (position, longstring, target) position = InStr(position, longstring, target)_ + 1 count = count + 1 Loop CountStrings = count End Function
如果目标字符串未出现在另一个字符串中,则 InStr 返回 0,而且不再执行循环。
Do...Loop 语句的另一种演变形式是先执行语句,然后在每次执行后测试 condition。这种形式保证 statements 至少执行一次: Do statements Loop While condition 其它两种演变形式类似于前两个,所不同的是,只要 condition 为 False 而不是 True,它们就执行循环。 循环零次或多次 至少循环一次 Do Until condition statements Loop Do statements Loop Until condition
.For...Next 在不知道循环内需要执行多少次语句时,宜用 Do 循环。但是,在知道要执行多少次时,则最好使用 For...Next 循环。与 Do 循环不同, For 循环使用一个叫做计数器的变量,每重复一次循环之后,计数器变量的值就会增加或者减少。For 循环的语法如下: For counter = start To end [Step increment] statements Next [counter] 参数 Counter、Start、end 和 increment 都是数值型的。 注意 increment 参数可正可负。如果 increment 为正,则 Start 必须小于等于 end,否则不能执行循环内的语句。如果 increment 为负,则 Start 必须大于等于 end,这样才能执行循环体。如果没有设置 Step,则 increment 缺省值为 1。 在执行 For 循环时,Visual Basic 设置 counter 等于 start。 测试 counter 是否大于 end。若是的话,则 Visual Basic 退出循环。 (若 increment 为负,则 Visual Basic 测试 counter 是否小于 end。) 执行语句。 counter 增加一,或者增加 increment(如果已指定的话)。 重复步骤 2 到步骤 4。 以下代码打印出所有有效的屏幕字体名: Private Sub Form_Click () Dim I As Integer For i = 0 To Screen.FontCount Print Screen.Fonts (i) Next End Sub 在 VCR 示例应用程序中,HighlightButton 过程使用 For...Next 循环,一步步经过 VCR 窗体的控件集合,并显示适当的 Shape 控件: Sub HighlightButton (MyControl As Variant) Dim i As Integer For i = 0 To frmVCR.Controls.Count - 1 If TypeOf frmVCR.Controls (i) Is Shape Then If frmVCR.Controls (i).Name = MyControl Then frmVCR.Controls (i).Visible = True Else frmVCR.Controls (i).Visible = False End If End If Next End Sub For Each...Next For Each...Next 循环与 For...Next 循环类似,但它对数组或对象集合中的每一个元素重复一组语句,而不是重复语句一定的次数。如果不知道一个集合有多少元素, For Each...Next 循环非常有用。 For Each...Next 循环的语法如下: For Each element In group statements Next elementt 例如,下面的子过程打开 Biblio.mdb,把每一个表的名字加到列表框中。 Sub ListTableDefs () Dim objDb As Database Dim MyTableDef as TableDef Set objDb = OpenDatabase("c:\vb\biblio.mdb", _ True, False) For Each MyTableDef In objDb.TableDefs () List1.AddItem MyTableDef.Name Next MyTableDef End Sub 请记住使用 For Each...Next 时的几点限制: 对集合,element 只能是 Variant 变量,或一般的 Object 变量,或“对象浏览器”中列出的对象。 对数组,element 只能是 Variant 变量。 For Each...Next 不能与用户自定义类型的数组一起使用,因为 Variant 不可能包含用户自定义类型。
Private Sub mnuCut_Click (Index As Integer) If Index = 0 Then '“剪切”命令。 CopyActiveControl '调用通用过程。 ClearActiveControl ElseIf Index = 1 Then '“复制”命令。 CopyActiveControl ElseIf Index = 2 Then '“清除”命令。 ClearActiveControl Else '“粘贴”命令。 PasteActiveControl End If End Sub
注意,总是可以添加更多的 ElseIf 块到 If...Then 结构中去。但是,当每个 ElseIf 都将相同的表达式比作不同的数值时,这个结构编写起来很乏味。在这种情况下可以使用 Select Case 判定结构。
详细信息 请参阅语言参考中的“If...Then...Else 语句”。
Select Case Visual Basic 提供 Select Case 结构替代 If...Then...Else,从而可在多个语句块中有选择地执行其中一个。Select Case 语句的能力与 If...Then...Else 语句类似,但对多重选择的情况,Select Case 语句使代码更加易读。
Select Case 在结构的上方处理一个测试表达式并只计算一次。然后,Visual Basic 将表达式的值与结构中的每个 Case 的值进行比较。如果相等,就执行与该 Case 相关联的语句块。
每一个 expressionlist 是一个或几个值的列表。如果在一个列表中有多个值,就用逗号把值隔开。每一个 statementblock 中含有零个或多个语句。如果不止一个 Case与测试表达式相匹配,则只对第一个匹配的 Case 执行与之相关联的语句块。如果在表达式列表中没有一个值与测试表达式相匹配,则 Visual Basic 执行 Case Else 子句(此项是可选的)中的语句。
例如,假定在 If...Then...Else 的例子中要向“编辑”菜单添加命令。为此可以另加一个 ElseIf 子句,或用 Select Case 来写函数:
Private Sub mnuCut_Click (Index As Integer) Select Case Index Case 0 '“剪切”命令。 CopyActiveControl '调用通用过程。 ClearActiveControl Case 1 '“复制”命令。 CopyActiveControl Case 2 '“清除”命令。 ClearActiveControl Case 3 '“粘贴”命令。 PasteActiveControl Case Else frmFind.Show '显示找到的对话框。 End Select End Sub
注意 Select Case 结构每次都要在开始处计算表达式的值。而 If...Then...Else 结构为每个 ElseIf 语句计算不同的表达式。只有在 If 语句和每一个 ElseIf 语句计算相同表达式时,才能用 Select Case 结构替换 If...Then...Else 结构。
将表达式的值赋给变量或属性。
语法
[Let] varname = expression
Let 语句的语法包含下面部分:
部分 描述 Let 可选的。显式使用 Let 关键字也是一种格式,但通常都省略该关键字。 varname 必需的。变量或属性的名称;遵循标准变量命名约定。 expression 必需的。赋给变量或属性的值。