循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)允許重復(fù)執(zhí)行一行或數(shù)行代碼。Visual Basic 支持的循環(huán)結(jié)構(gòu)有:
1.Do...Loop
2.For...Next
3.For Each...Next
Do...Loop
用 Do 循環(huán)重復(fù)執(zhí)行一語(yǔ)句塊,且重復(fù)次數(shù)不定。Do...Loop 語(yǔ)句有幾種演變形式,但每種都計(jì)算數(shù)值條件以決定是否繼續(xù)執(zhí)行。如同 If...Thencondition 必須是一個(gè)數(shù)值或者值為 True(非零)或 False(零)的表達(dá)式。在下面的 Do...Loop 循環(huán)中,只要 condition 為 True 就執(zhí)行 statements。
Do While condition
statements
Loop
當(dāng) Visual Basic 執(zhí)行這個(gè) Do 循環(huán)時(shí)會(huì)首先測(cè)試 condition。如果 condition為 False(零),則跳過(guò)所有語(yǔ)句。如果 condition 為 True(非零),則 VisualBasic 執(zhí)行語(yǔ)句,然后退回到 Do While 語(yǔ)句再測(cè)試條件。
因此,只要 condition 為 True 或非零,循環(huán)可以隨意執(zhí)行多少次。如果condition 一開始便為 False,則不會(huì)執(zhí)行語(yǔ)句。例如,以下過(guò)程將計(jì)算某一目標(biāo)字符串在另一字符串中出現(xiàn)的次數(shù),只要發(fā)現(xiàn)目標(biāo)串就執(zhí)行循環(huán):
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
如果目標(biāo)字符串未出現(xiàn)在另一個(gè)字符串中,則 InStr 返回 0,而且不再執(zhí)行循環(huán)。
Do...Loop 語(yǔ)句的另一種演變形式是先執(zhí)行語(yǔ)句,然后在每次執(zhí)行后測(cè)試condition。這種形式保證 statements 至少執(zhí)行一次:
Do
statements
Loop While condition
其它兩種演變形式類似于前兩個(gè),所不同的是,只要 condition 為 False 而不是 True,它們就執(zhí)行循環(huán)。
For...Next000
在不知道循環(huán)內(nèi)需要執(zhí)行多少次語(yǔ)句時(shí),宜用 Do 循環(huán)。但是,在知道要執(zhí)行多少次時(shí),則使用 For...Next 循環(huán)。與 Do 循環(huán)不同, For 循環(huán)使用一個(gè)叫做計(jì)數(shù)器的變量,每重復(fù)一次循環(huán)之后,計(jì)數(shù)器變量的值就會(huì)增加或者減少。For 循環(huán)的語(yǔ)法如下:
For counter = start To end [Step increment]
statements
Next [counter]
參數(shù) Counter、Start、end 和 increment 都是數(shù)值型的。
注意 increment 參數(shù)可正可負(fù)。如果 increment 為正,則 Start 必須小于等于end,否則不能執(zhí)行循環(huán)內(nèi)的語(yǔ)句。如果 increment 為負(fù),則 Start 必須大于等于 end,這樣才能執(zhí)行循環(huán)體。如果沒有設(shè)置 Step,則 increment 缺省值為 1。
在執(zhí)行 For 循環(huán)時(shí),Visual Basic
1. 設(shè)置 counter 等于 start。
2. 測(cè)試 counter 是否大于 end。若是的話,則 Visual Basic 退出循環(huán)。 (若 increment 為負(fù),則 Visual Basic 測(cè)試 counter 是否小于 end。)
3. 執(zhí)行語(yǔ)句。
4. counter 增加一,或者增加 increment(如果已指定的話)。
5. 重復(fù)步驟 2 到步驟 4。
以下代碼打印出所有有效的屏幕字體名:
Private Sub Form_Click ()
Dim I As Integer
For i = 0 To Screen.FontCount
Print Screen.Fonts (i)
Next
End Sub
在 VCR 示例應(yīng)用程序中,HighlightButton 過(guò)程使用 For...Next 循環(huán),一步步經(jīng)過(guò) VCR 窗體的控件集合,并顯示適當(dāng)?shù)?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 循環(huán)與 For...Next 循環(huán)類似,但它對(duì)數(shù)組或?qū)ο蠹现械拿恳粋€(gè)元素重復(fù)一組語(yǔ)句,而不是重復(fù)語(yǔ)句一定的次數(shù)。如果不知道一個(gè)集合有多少元素, For Each...Next 循環(huán)非常有用。
For Each...Next 循環(huán)的語(yǔ)法如下:
For Each element In group
statements
Next elementt
例如,下面的子過(guò)程打開 Biblio.mdb,把每一個(gè)表的名字加到列表框中。
Sub ListTableDefs ()
Dim objDb As Database
Dim MyTableDef as TableDef
循環(huán)結(jié)構(gòu)允許重復(fù)執(zhí)行一行或數(shù)行代碼。Visual Basic 支持的循環(huán)結(jié)構(gòu)有:
1.Do...Loop
2.For...Next
3.For Each...Next
Do...Loop
用 Do 循環(huán)重復(fù)執(zhí)行一語(yǔ)句塊,且重復(fù)次數(shù)不定。Do...Loop 語(yǔ)句有幾種演變形式,但每種都計(jì)算數(shù)值條件以決定是否繼續(xù)執(zhí)行。如同 If...Thencondition 必須是一個(gè)數(shù)值或者值為 True(非零)或 False(零)的表達(dá)式。在下面的 Do...Loop 循環(huán)中,只要 condition 為 True 就執(zhí)行 statements。
Do While condition
statements
Loop
當(dāng) Visual Basic 執(zhí)行這個(gè) Do 循環(huán)時(shí)會(huì)首先測(cè)試 condition。如果 condition為 False(零),則跳過(guò)所有語(yǔ)句。如果 condition 為 True(非零),則 VisualBasic 執(zhí)行語(yǔ)句,然后退回到 Do While 語(yǔ)句再測(cè)試條件。
因此,只要 condition 為 True 或非零,循環(huán)可以隨意執(zhí)行多少次。如果condition 一開始便為 False,則不會(huì)執(zhí)行語(yǔ)句。例如,以下過(guò)程將計(jì)算某一目標(biāo)字符串在另一字符串中出現(xiàn)的次數(shù),只要發(fā)現(xiàn)目標(biāo)串就執(zhí)行循環(huán):
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
如果目標(biāo)字符串未出現(xiàn)在另一個(gè)字符串中,則 InStr 返回 0,而且不再執(zhí)行循環(huán)。
Do...Loop 語(yǔ)句的另一種演變形式是先執(zhí)行語(yǔ)句,然后在每次執(zhí)行后測(cè)試condition。這種形式保證 statements 至少執(zhí)行一次:
Do
statements
Loop While condition
其它兩種演變形式類似于前兩個(gè),所不同的是,只要 condition 為 False 而不是 True,它們就執(zhí)行循環(huán)。
For...Next000
在不知道循環(huán)內(nèi)需要執(zhí)行多少次語(yǔ)句時(shí),宜用 Do 循環(huán)。但是,在知道要執(zhí)行多少次時(shí),則使用 For...Next 循環(huán)。與 Do 循環(huán)不同, For 循環(huán)使用一個(gè)叫做計(jì)數(shù)器的變量,每重復(fù)一次循環(huán)之后,計(jì)數(shù)器變量的值就會(huì)增加或者減少。For 循環(huán)的語(yǔ)法如下:
For counter = start To end [Step increment]
statements
Next [counter]
參數(shù) Counter、Start、end 和 increment 都是數(shù)值型的。
注意 increment 參數(shù)可正可負(fù)。如果 increment 為正,則 Start 必須小于等于end,否則不能執(zhí)行循環(huán)內(nèi)的語(yǔ)句。如果 increment 為負(fù),則 Start 必須大于等于 end,這樣才能執(zhí)行循環(huán)體。如果沒有設(shè)置 Step,則 increment 缺省值為 1。
在執(zhí)行 For 循環(huán)時(shí),Visual Basic
1. 設(shè)置 counter 等于 start。
2. 測(cè)試 counter 是否大于 end。若是的話,則 Visual Basic 退出循環(huán)。 (若 increment 為負(fù),則 Visual Basic 測(cè)試 counter 是否小于 end。)
3. 執(zhí)行語(yǔ)句。
4. counter 增加一,或者增加 increment(如果已指定的話)。
5. 重復(fù)步驟 2 到步驟 4。
以下代碼打印出所有有效的屏幕字體名:
Private Sub Form_Click ()
Dim I As Integer
For i = 0 To Screen.FontCount
Print Screen.Fonts (i)
Next
End Sub
在 VCR 示例應(yīng)用程序中,HighlightButton 過(guò)程使用 For...Next 循環(huán),一步步經(jīng)過(guò) VCR 窗體的控件集合,并顯示適當(dāng)?shù)?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 循環(huán)與 For...Next 循環(huán)類似,但它對(duì)數(shù)組或?qū)ο蠹现械拿恳粋€(gè)元素重復(fù)一組語(yǔ)句,而不是重復(fù)語(yǔ)句一定的次數(shù)。如果不知道一個(gè)集合有多少元素, For Each...Next 循環(huán)非常有用。
For Each...Next 循環(huán)的語(yǔ)法如下:
For Each element In group
statements
Next elementt
例如,下面的子過(guò)程打開 Biblio.mdb,把每一個(gè)表的名字加到列表框中。
Sub ListTableDefs ()
Dim objDb As Database
Dim MyTableDef as TableDef

