循環結構
循環結構允許重復執行一行或數行代碼。Visual Basic支持的循環結構有:
1.Do...Loop
2.For...Next
3.For Each...Next
Do...Loop
用Do 循環重復執行一語句塊,且重復次數不定。Do...Loop 語句有幾種演變形式,但每種都計算數值條件以決定是否繼續執行。如同 If...Thencondition 必須是一個數值或者值為 True(非零)或 False(零)的表達式。在下面的Do...Loop 循環中,只要condition 為True就執行statements。
Do While condition
statements
Loop
當Visual Basic 執行這個Do循環時會首先測試condition。如果condition為False(零),則跳過所有語句。如果condition 為True(非零),則 VisualBasic執行語句,然後退回到Do While語句再測試條件。
因此,只要condition為True 或非零,循環可以隨意執行多少次。如果condition 一開始便為False,則不會執行語句。例如,以下過程將計算某一目標字符串在另一字符串中出現的次數,只要發現目標串就執行循環:
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,它們就執行循環。
For...Next000
在不知道循環內需要執行多少次語句時,宜用 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
1. 設置 counter 等於 start。
2. 測試 counter 是否大於 end。若是的話,則 Visual Basic 退出循環。 (若 increment 為負,則 Visual Basic 測試 counter 是否小於 end。)
3. 執行語句。
4. counter 增加一,或者增加 increment(如果已指定的話)。
5. 重復步驟 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 時的幾點限制:
1.對集合,element 只能是 Variant 變量,或一般的 Object 變量,或“對象浏覽器”中列出的對象。
2.對數組,element 只能是 Variant 變量。
3.For Each...Next 不能與用戶自定義類型的數組一起使用,因為 Variant 不可能包含用戶自定義類型。
使用控制結構
嵌套控制結構可以把控制結構放入另一個控制結構之內(例如在 For...Next 循環中的If...Then 塊)。一個控制結構內部包含另一個控制結構叫做 nest(嵌套)。在 Visual Basic 中,控制結構的嵌套層數沒有限制。按一般習慣,為了使判定結構和循環結構更具可讀性,總是用縮排方式書寫判定結構或循環的正文部分。
例如,下面的過程要把打印機和屏幕共有的字體名全部打印出來:
Private Sub Form_Click ()
Dim SFont, PFont
For Each SFont In Screen.Fonts ()
For Each PFont In Printer.Fonts ()
If SFont = PFont Then
Print SFont
End If
Next PFont
Next SFont
End Sub
注意,第一個 Next 關閉了內層的 For 循環,而最後一個 For 關閉了外層的 For 循環。同樣,在嵌套的 If 語句中,End If 語句自動與最靠近的前一個 If 語句配對。嵌套的 Do...Loop 結構的工作方式也是一樣的,最內圈的 Loop 語句與最內圈的 Do 語句匹配。
退出控制結構
用 Exit 語句可以直接退出 For 循環、Do 循環、子過程或函數過程。Exit 語句的語法很簡單:Exit For 在 For 循環中出現的次數沒有限制,Exit Do 在Do 循環中出現的次數也沒有限制。
For counter = start To end
[Step increment]
[statementblock]
[Exit For]
[statementblock]
Next [counter[, counter] [,...]]
Do [{While | Until} condition]
[statementblock]
[Exit Do]
[statementblock]
Loop
Exit Do 語句可以在 Do 循環語法的所有版本中使用。
Exit For 和 Exit Do 非常有用,因為它有時適於立即退出循環,而且不再執行循環中的任何進一步迭代或者語句。例如,在前面的打印屏幕和打印機共有字體的例子中,程序不斷將打印機字體和給定的屏幕字體作比較,甚至在已經找到了一個相符的打字機字體後還在繼續尋找。對這個函數有一個效率更高的改進版,在此,只要找到相匹配的字體後就立即退出循環:
Private Sub Form_Click ()
Dim SFont, PFont
For Each SFont In Screen.Fonts ()
For Each PFont In Printer.Fonts ()
If SFont = PFont Then
Print Sfont
Exit For '退出內圈循環。
End If
Next PFont
Next SFont
End Sub
正如此例所表明的, Exit 語句幾乎總是出現在 If 語句或 Select Case 語句內部,而 If 語句或 Select Case 語句在循環內嵌套。
用 Exit 語句中斷循環時,計數器變量的值會因退出循環的方式而不同:
1.在完成循環時,計數器的值等於上限值加上步進值。
2.在提前退出循環時,計數器變量保持其值,並遵從有關取值范圍的一般規則。
3.在集合之外疊代時,如果計數器變量為 Object 類型,則其值為Nothing;如果計數器變量為 Variant 類型,則其值為 Empty。
退出子過程或函數過程
也可從控制結構內部退出過程。Exit Sub 和 Exit Function 的語法,和上一節“退出控制結構”中的 Exit For 和 Exit Do 相似。Exit Sub 可以出現在子過程主體內的任何地方,出現的次數隨需要而定。
當過程已完成每個任務並可直接返回時,Exit Sub 和 Exit Function 是非常有用的。例如,如果想改動前面的例子,使得對查找到的打印機和屏幕的共有字體,只打印其中的第一個,則可用 Exit Sub :
Private Sub Form_Click ()
Dim SFont, PFont
For Each SFont In Screen.Fonts ()
For Each PFont In Printer.Fonts ()
If SFont = PFont Then
Print Sfont
Exit Sub '退出過程。
End If
Next PFont
Next SFont
End Sub