End Select
Select Case结构流程图如图8.14所示。
Select Case结构运行时,首先计算“表达式”的值,它可以是字符串或者数值变量或表达式。然后会依次计算测试每个Case表达式的值,直到值匹配成功,程序会转入相应Case结构内执行语句。Cese表达式可以是下列4种格式之一:
(1)单一数值或一行并列的数值,用来与“表达式”的值相比较。成员间以逗号隔开。
(2)由关键字To分隔开的两个数值或表达式之间的范围。前一个值必须比后一个值要小,否则没有符合条件的情况。字符串的比较是从它们的第一个字符的ASCII码值开始比较的,直到分出大小为止。 (3)关键字Is接关系运算符,如<>、<、<=、=、>=或>,后面再接变量或精确的值。 (4)关键字Case Else后的表达式,是在前面的Case条件都不满足时执行的。
Case语句是依次测试的,并执行第一个符合Case条件的相关的程序代码,即使再有其他符合条件的分支也不会再执行。
如果没有找到符合的,且有Case Else语句的话,就会执行接在该语句后的程序代码。然后程序从接在End Select终止语句的下一行程序代码继续执行下去。 例8.8 使用Select Case-End Select语句,完成例8.6的功能。 Sub Procedure3()
Select Case Hour(Time()) Case 8 To 11
Debug.Print\上午好!\ Case 12 To 17
Debug.Print\下午好!\ Case Else
Debug.Print\欢迎下次光临!\ End Select End Sub
例8.9 采用Select Case结构对字符进行分类。 Select Case a$
Case \ '大写字母 str$=\
Case \ '小写字母 Str$=\
Case \ '数字 Str$=\
Case \ '分隔符 Case \ '空串 Str$=\
Case Is<32 '特殊字符 Str$=\
Case Else '其他字符 Str$=\ End Select 5.条件函数
除上述条件语句结构外,VBA还提供3个函数来完成相应选择操作: (1)IIf函数:IIf(条件式,表达式1,表达式2) 该函数是根据“条件式”的值来决定函数返回值。“条件式”值为“真(True)”,函数返回“表达式1”的值;“条件式”值为“假(False)”,函数返回“表达式2”的值。 例如:将变量a和b中,值大的量存放在变量Max中。 Max = IIf(a>b,a,b)
(2)Switch函数:Switch(条件式,表达式1,[,条件式2,表达式2[,条件式n,表达式n]]) 该函数是根据“条件式1”、“条件式2”直至“条件式n”的值来决定函数返回值。条件式是由左至右进行计算判断的,而表达式则会在第一个相关的条件式为True时作为函数返回值返回。如果其中有部分不成对,则会产生一个运行错误。
例如:根据变量x的值来为变量y赋值。 y=Switch(x>0,1,x=0,0,x<0,-1)
(3)Choose函数:Choose(索引式,选项1[,选项2,?[,选项n]]) 该函数是根据“索引式”的值来返回选项列表中的某个值。“索引式”值为1,函数返回“选项1”值;“索引式”值为2,函数返回“选项2”值;依此类推。这里,只有在“索引式”的值界于1和可选择的项目之间,函数才返回其后的选项值;当“索引式”的值小于1或大于列出的选择项数目时,函数返回无效值(Null)。
例如:根据变量x的值来为变量y赋值。 y=Choose(x,5,m+1,n)
上述3个函数由于具有选择特性而被广泛用于查询、宏及计算控件的设计中。 8.4.3 循环语句
循环语句可以实现重复执行一行或几行程序代码。VBA支持以下循环语句结构:For-Next、Do-Loop和While-Wend。 1.For-Next语句
For-Next语句能够重复执行程序代码区域特定次数,使用格式如下: For 循环变量=初值 To 终值[Step步长] 循环体 [条件语句序列
Exit For
结束条件语句序列] Next[循环变置] 其执行步骤(a-d)为: a.循环变量取初值;
b.循环变量与终值比较,确定循环是否进行: 步长>0时
若循环变量值<=终值,循环继续,执行步骤c;若循环变量值>终值,循环结束,退出循环。 步长=0时
若循环变量值<=终值,死循环;若循环变量值>终值,一次也不执行循环。 步长>0时
若循环变量值>=终值,循环继续,执行步骤c;若循环变量值<终值,循环结束,退出循环。 c.执行循环体;
d.循环变量值增加步长不(循环变量=循环变量+步长),程序跳转至b。
循环变量的值如果在循环体内不被更改,则循环执行次数可以使用公式“循环次数=(终值-初值+1)/步长”计算。例如,如果初值=5,终值=10,且步长=2,则循环体的执行重复(10-5+1)/2=3次。但如果循环变量的值在循环体内被更改,则不能适用上述公式来计算循环次数。For语句的流程如图8.18所示。
例8.12 分析下列程序段的循环结构: For K=5 to 10 Step 2 K=2*K Next K
按照公式计算,循环次数为:(10-5+1)/2=3次。但这是错误的。实际上,该循环的循环次数为只有1次(循环变置先后取值5和12,循环执行一次后,循环变置值为12,超过终值10,循环结束)。 步长为1时,关键字Step可以省略。步长一般是整数取值,用实数也可以,但不常见。 如果终值小于初值,步长要取负值;否则,For-Next语句会被忽略,循环体一次也不执行。 如果在For-Next循环中,步长为0,该循环便会重复执行无数次,造成“死循环”。 选择性的Exit For语句可以组织在循环体中的If-Then-End If条件语句结构中,用来提前中断并退出循
环。
For-Next循环结束,则程序从Nect的下一行语句继续执行。 在实际应用中,For-Next循环还经常与数组配合操作数组元素。 例8.13 将A到Z的大写字母赋予字符数组str$()。 For I=1 To 26
str$(I)=Chr$(I+64) '大写字母“A”的ASII码值为65 Next I
例8.14 在立即窗口中显示有星号(*)组成的5×5的正方形。 Sub Procedure5() Const MAX=5 Dim Str As String Str=\
For n=1 To MAX Str=Str+\ Next n
For n=1 To MAX Debug.Print str Next n End Sub
2.Do While-Loop语句 使用格式如下: Do While<条件式> 循环体
[条件语句序列 Exit Do
结束条件语句序列] Loop
这个循环结构是在条件式结果为真时,执行循环体,并持续到条件式结果为假或执行到选择性Exit Do语句而退出循环,循环流程如图8.19所示。
例8.15 用Do While-Loop语句,完成例8.12大写英文26个字母向数组元素赋值的功能。代码如下: I=1
Do While I<=26 Str$(I)=Chr$(I+64) I=I+1 Loop
例8.16 已知斐波那契序列的定义如下: f(0)=0,f(1)=1
f(n)=f(n-1)+f(n-2) 当n>=2时
编写程序,在立即窗口中显示n为2到10时对应的序列值。代码如下: Sub Procedure6() n=1 f1=0 f2=1
Do While n<10
f=f1+f2
Debug.Print f f1=f2 f2=f n=n+1 Loop End Sub
3.Do Until-Loop语句
与Do While-Loop结构相对应,还有另一个Do循环结构,Do Until-Loop结构。该结构是条件式值为假时,重复执行循环,直至条件式值为真,结束循环。 循环流程如图8.20所示。
使用格式如下: Do Until<条件式> 循环体 [条件语句序列 Exit Do
结束条件语句序列] Loop
例8.17 将例8.15用Do Until-Loop循环结构语句必定程序: I=1
Do Until I>26 '与While I<=26条件不同,Until要判断直到I>26结束循环 Str$(I)=Chr$(I+64) I=I+1 Loop
上面两个Do循环的条件式均安排在结构的起始位置。实际上,条件式也可以安排在结构的末尾。 4.Do-Loop While语句 Do 循环体 [条件语句序列 Exit Do