| 在VBScript 的流程控制中,一般通过循环语句和条件语句来实现。下面具体介绍。
2.3.1 条件语句
条件语句主要是用于控制流程,根据条件来判断,按判断结果来运行一条或多条语句。
在 VBScript 中可使用以下条件语句: If...Then...Else 语句和Select Case 语句。这两种条件语句执行的时候,先对条件进行判断,然后根据条件执行相应的脚本。If...Then...Else
语句只会形成两重分支,如果条件满足,执行其中的一个分支,如果条件不满足,则执行其中的另外一分支;Select Case语句会形成多重分支,根据条件的结果选择其中相应的分支执行。
1.If...Then...Else 语句
If...Then...Else 语句用于计算条件是否为 True 或 False,并且根据计算结果指定要运行的语句。通常,条件是使用比较运算符对值或变量进行比较的表达式。If...Then...Else
语句可以按照需要进行嵌套。有以下几种形式。
语法1如下:
If 条件语句 Then
执行语句
End If
说明:
如果条件语句为 True,则执行下面的执行语句,否则跳出该条件语句。
语法2如下:
If…Then…Else…End If
单条件时:
If 条件语句Then
执行语句1
Else
执行语句2
End If
说明:
如果条件语句为 True,则执行执行语句1,否则执行执行语句2。
范例2-4:
Sub AlertUser(value)
If value = 0 Then
AlertLabel.ForeColor = vbRed
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
End If
End Sub
多条件时:
If 条件语句1 Then
执行语句1
Else If 条件语句2 Then
执行语句2
…
Else
执行语句n+1
End If
说明:如果条件语句1为 True,则执行执行语句1,然后跳出If语句;如果条件语句
2为 True,则执行执行语句2,然后跳出If语句;与此类推,如果条件都不符合,则执行语句n+1。
我们来看几个范例。
范例2-5:
Sub FixDate()
Dim myDate
myDate = #2/13/2004#
If myDate < Now Then myDate = Now
End Sub
范例2-6:
Sub AlertUser(value)
If value = 0 Then
AlertLabel.ForeColor = vbRed
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
Else
AlertLabel.Forecolor = vbBlack
AlertLabel.Font.Bold = False
AlertLabel.Font.Italic = False
End If
End Sub
If...Then...Else 语句的一种变形允许你从多个条件中选择,即添加 ElseIf 子句以扩充If...Then...Else
语句的功能,使你可以控制基于多种可能的程序流程。例如:
范例2-7:
Sub ReportValue(value)
If value = 0 Then
MsgBox value
ElseIf value = 1 Then
MsgBox value
ElseIf value = 2 then
Msgbox value
Else
Msgbox "数值超出范围!"
End If
可以添加任意多个 ElseIf 子句以提供多种选择。使用多个 ElseIf 子句会使程序变得很累赘,所以在多个条件中进行选择的更好方法是使用
Select Case 语句。
2.Select Case 语句
如果需要实现多重分支选择,一般我们使用Select Case语句,而不使用If...Then...ElseIf 语句,Select
Case 结构提供了 If...Then...ElseIf 结构的一个变通形式,可以从多个语句块中选择执行其中的一个。Select
Case 语句提供的功能与 If...Then...Else 语句类似,但是可以使代码更加简练易读。
语法如下:
Select Case 表达式
Case 结果1
执行语句1
Case 结果2
执行语句2
…
Case 结果n
执行语句n+1
End Select
Select Case结构在语句块执行之前,对条件表达式语句进行计算,只计算一次,根据表达式的计算结果与结构中的每个Case的值进行比较,如果匹配,则执行与该Case关联的语句块。
范例2-8:
Select Case Document.Form1.CardType.Options(SelectedIndex).Text
Case "MasterCard"
DisplayMCLogo
ValidateMCAccount
Case "Visa"
DisplayVisaLogo
ValidateVisaAccount
Case "American Express"
DisplayAMEXCOLogo
ValidateAMEXCOAccount
Case Else
DisplayUnknownImage
PromptAgain
End Select
当然Select Case也可以通过If语句来实现,从上面的程序中可以注意到Select Case语句只在前端执行一个运算式。而与此相反的是,
If...Then...Else条件语句则可在每一个ElseIf 语句后面加上一个不同的运算式。对于这种格式的语句,只有在每一个ElseIf
语句使用的都是同一个运算式时,才能用Select Case语句来取代If...Then...Else语句。
2.3.2 循环语句
使用循环语句用于重复执行一组语句。循环可分为三类:一类在条件变为 False 之前重复执行语句,一类在条件变为 True 之前重复执行语句,另一类按照指定的次数重复执行语句。
在 VBScript 中可使用下列循环语句:
▲Do...Loop: 当(或直到)条件为 True 时循环。
▲ While...Wend: 当条件为 True 时循环。
▲ For...Next: 指定循环次数,使用计数器重复运行语句。
▲ For Each...Next: 对于集合中的每项或数组中的每个元素,重复执行一组语句。
1.Do...Loop 语句
可以使用 Do...Loop 语句多次(次数不定)运行语句块。当条件为 True 时或条件变为 True 之前,重复执行语句块。
语法如下:
Do While 条件1
执行语句
Loop
也可以使用下面的语法:
Do
执行语句
Loop While 条件2
While 关键字用于检查 Do...Loop 语句中的条件。有两种方式检查条件:在进入循环之前检查条件(如下面的实例2-9);或者在循环至少运行完一次之后检查条件(如下面的实例2-10)。在实例2-9中,如果
N 的初始值被设置为 9 而不是 20,则永远不会执行循环体中的语句。在实例2-10的过程中,循环体中的语句只会执行一次,因为条件在检查时已经为
False。
范例2-9:循环之前检查条件
Sub ChkFirstWhile()
Dim counter, N
counter = 0
N = 20
Do While N > 10
N= N - 1
counter = counter + 1
Loop
MsgBox "循环重复了" & counter & " 次。"
End Sub
范例2-10:循环至少运行完一次之后检查条件
Sub ChkLastWhile()
Dim counter, N
counter = 0
N= 9
Do
N = N - 1
counter = counter + 1
Loop While N> 10
MsgBox "循环重复了 " & counter & " 次。"
End Sub
可以用Until 关键字检查 Do...Loop 语句中的条件。有两种方式检查条件:在进入循环之前检查条件(如下面的实例2-11);或者在循环至少运行完一次之后检查条件(如下面的实例2-12)。只要条件为
False,就会进行循环。
范例2-11:进入循环之前检查条件
Sub ChkFirstUntil()
Dim counter, N
counter = 0
N = 20
Do Until N = 10
N = N - 1
counter = counter + 1
Loop
MsgBox "循环重复了 " & counter & " 次。"
End Sub
实例2-12:循环至少运行完一次之后检查条件
Sub ChkLastUntil()
Dim counter,N
counter = 0
N = 1
Do
N = N + 1
counter = counter + 1
Loop Until N = 10
MsgBox "循环重复了 " & counter & " 次。"
End Sub
Exit Do 语句用于退出 Do...Loop 循环。因为通常只是在某些特殊情况下要退出循环(例如要避免死循环),所以可在 If...Then...Else
语句的 True 语句块中使用 Exit Do 语句。如果条件为 False,循环将照常运行。
在下面的实例2-13中,N的初始值将导致死循环。用If...Then...Else 语句检查此条件,防止出现死循环。
范例2-13:防止出现死循环
Sub ExitExample()
Dim counter, N
counter = 0
N = 9
Do Until N= 10
N = N - 1
counter = counter + 1
If N < 10 Then Exit Do
Loop
MsgBox "循环重复了 " & counter & " 次。"
End Sub
2.While...Wend 语句
While...Wend 语句用于当指定的条件为 True 时,执行一系列的语句,直到条件为False时跳出循环。它是为那些熟悉其用法的用户提供的,但是由于
While...Wend 缺少灵活性,所以建议最好使用也能实现相同功能的 Do...Loop 语句。
语法如下:
While 条件
执行语句
Wend
3.For...Next 语句
For...Next 语句用于将语句块运行指定的次数。在循环中使用计数器变量,该变量的值随每一次循环增加或减少。
语法如下:
For counter = start To end [Step step]
执行语句
Next
说明:
▲ Counter:控制循环次数的计数器变量。
▲ Start:计数器的初始值。
▲ End:计数器的终值。
▲ Step:计数器的步长值,增加或减少。
For...Next 语句使用一个计数器变量(counter)来控制循环次数,每执行一次循环,这个计数器变量的值就增加或减少(step)。
例如,下面的实例2-14中,将过程 MyProc 重复执行 50 次。For 语句指定计数器变量 x 及其起始值与终止值。Next
语句使计数器变量每次加 1。
范例2-14:过程 MyProc 重复执行 50 次
Sub MyProc ()
Dim x
For x = 1 To 50
MyProc
Next
End Sub
关键字 Step 用于指定计数器变量每次增加或减少的值。在下面的实例2-15中,计数器变量 j 每次加 2。循环结束后,total
的值为 2、4、6、8 和 10 的总和。
范例2-15 :指定计数器变量每次增加的值
Sub TwosTotal()
Dim j, total
For j = 2 To 10 Step 2
total = total + j
Next
MsgBox "总和为 " & total & "。"
End Sub
要使计数器变量递减,可将 Step 设为负值。此时计数器变量的终止值必须小于起始值。在下面的实例2-16中,计数器变量 myNum
每次减 2。循环结束后,total 的值为 16、14、12、10、8、6、4 和 2 的总和。
范例2-16:指定计数器变量每次减少的值
Sub NewTotal()
Dim myNum, total
For myNum = 16 To 2 Step -2
total = total + myNum
Next
MsgBox "总和为 " & total & "。"
End Sub
Exit For 语句用于在计数器达到其终止值之前退出 For...Next 语句。因为通常只是在某些特殊情况下(例如在发生错误时)要退出循环,所以可以在
If...Then...Else 语句的 True 语句块中使用 Exit For 语句。如果条件为 False,循环将照常运行。
可以将一个 For...Next 循环放置在另一个 For...Next 循环中,组成嵌套循环。每个循环中的 counter 要使用不同的变量名。例如:
For I = 1 To 10
For J = 1 To 10
For K = 1 To 10
. . .
Next
Next
Next
4.For Each...Next 语句
For Each...Next 循环与 For...Next 循环类似。For Each...Next 不是将语句运行指定的次数,而是对于数组中的每个元素或对象集合中的每一项重复一组语句。这在不知道集合中元素的数目时非常有用。
语法如下:
For Each 元素In 集合
执行语句
Next
范例2-17 :For Each.循环
<html>
<head>
<title>for each循环范例</title>
<script language="vbscript">
sub Checkall()
set mform=document.forms(0)
for each obj in mform.elements
if obj.name<>"chkall" then obj.checked=mform.chkall.checked
next
end sub
</script>
</head>
<body>
<center>
<form name="frmform">
<input type="checkbox" name="choose" value="1">选项1
<input type="checkbox" name="choose" value="1">选项2
<input type="checkbox" name="choose" value="1">选项3
<input type="checkbox" name="choose" value="1">选项4
<p>
<input type="checkbox" name="chkall" onclick="CheckAll()">全选
</form>
</center>
</body>
</html>
说明:
使用for each…next 循环,单击“全选”框后,同时选中所有的复选框。
点击浏览范例2-17运行结果。
Exit For 只能用于 For Each...Next 或 For...Next 控制结构中,提供另一种退出循环的方法。可在循环的任意位置放置任意个
Exit For 语句。Exit For 经常和条件判断语句一起使用(例如 If...Then),并立即将控制权转移到 Next
之后的语句。
|