7.4.4 分支结构

7.4.4 分支结构

计算机程序只所以能够帮助人实现事务处理,是因为它能模拟人类的某些行为。如模拟人类的判断。人类在处理事务时,对要处理的事务一般有如下的判断:两种选择中选择做或不做、两种选择中做这个就不做那个、多种选择中选择一个来做等。VBA中有单分支、双分支和多分支3种结构可以模拟人类的这些判断行为。

1.单分支结构

单分支结构是最简单的分支结构,它有以下2种格式

格式1:

If <条件表达式> Then <语句>

功能:若<条件表达式>的值为真,则执行Then后面的语句;否则直接执行If … Then之后的语句。

格式2:

img390

功能:若<条件表达式>的值为真,则执行<语句序列>;否则直接执行End If之后的语句。格式1适合于当条件成立时,执行语句只有一条的情况,如果执行语句有多条,则最好选用格式2。当然,执行语句多条时,也可以使用格式1,但为了保持一行上写多条语句,必须在语句之间用“:”号隔开。

img391

图7-18 单分支结构流程图

单分支结构的流程图如图7-18所示。

例如:

If gz<1000 then gz=gz+100

或者:

If gz<1000 then gz=gz+100:msgbox "工资增加100"

或者:

img392

2.双分支结构

单分支结构只能对一种情况进行选择,双分支结构可以对两种情况进行选择。

格式:

img393

功能:若条件表达式为真,则执行<语句序列1>,然后结束分支结构,转到End If后执行语句,否则当条件表达式为假时,执行<语句序列2>,然后再执行End If后面的语句。

img394

图7-19 双分支结构流程图

双分支结构流程图如图7-19所示。

例如:

img395

3.多分支结构

双分支结构只能对两种条件进行判断,当出现多种条件需要进行判断时,就要使用多分支结构,多分支结构流程图如7-20所示。

img396

图7-20 多分支结构流程图

VBA提供了3种多分支结构语句。

1)嵌套If语句

无论是单行还是多行的IF结构,最多只能有两个分支,如果需要进行多个条件的判断,可以在多行IF语句的“语句序列”中再包含IF语句,从而形成IF语句的嵌套。该结构是在一个If … End If语句中包含另一个If … End If语句。

格式:

img397

img398

在以上结构中,…均为一个语句序列,在<条件表达式1>的Then部分,嵌套了另一条多行的IF语句,而在ELSE结构部分,也嵌套了一条单行的IF语句,这样,两个分支扩展到四个分支。这种嵌套需要注意如下几点:

①在每一嵌套层中,If … Then … End If必须一一对应;

②单分支结构和多分支结构可以自我嵌套或相互嵌套,并且可以出现在程序的任何位置,但不能有交叉;

③为使嵌套层次清晰,便于阅读和修改,最好采用缩进格式书写语句。

【例7-2】判断一个数为正数、负数还是零。

img399

2)ElseIf结构

嵌套结构虽然可以解决多分支问题,但嵌套层次过多,程序将显得杂乱,可读性差,也容易出错,利用ELSEIF结构可以很好地解决这个问题。其语法结构如下:

img400

这个结构从第一个条件开始判断,如果第一个条件满足就执行<语句序列1>,否则就进行<条件表达式2>的判断,如果满足就执行<语句序列2>,否则就依次判断下去,如果前面n个条件都不满足,则在Else部分存在的情况下执行<语句序列n+1>,不存在时什么都不做。

注意:

①无论有几个条件成立,只有最先成立的那个条件所对应的语句序列被执行。

②ElseIf出现在If语句中,仅作为If语句的一个结构成分,而不是一个独立的条件语句,ElseIf不需要有相应的End If。

③最后那个Else选项存在时,表明前面条件都不成立时,默认Else部分成立。

【例7-3】用ElseIf结构改写判断一个数为正数、负数还是零。

img401

3)Select Case结构

当要判断的条件是基于同一表达式,只是对其不同值进行区分,并且需要多次判断时,可以采用VBA提供的Select Case结构。其语法格式如下:

img402

将<被测试表达式>分别与每个Case表达式列表进行比较,若与某个表达式列表中的值匹配,则执行该Case语句中的语句序列,然后转向End Select后面的语句;若与所有的Case表达式都不匹配,则执行Case Else中的语句序列,然后转向End Select后面的语句。

说明:

①<被测试表达式>可以是任何VBA表达式。

②如果<被测试表达式>能够匹配一个以上的Case表达式,则只有第一个匹配的Case语句中的语句序列会被执行。

③如果<被测试表达式>与所有的Case表达式都不匹配,且没有Case Else语句,则该结构中没有一个语句序列被执行。在通常情况下,加上Case Else语句可以处理那些不可预见的判断结果。

④Select Case和End Select必须成对出现。

⑤Select Case语句可以自我嵌套,或与If语句相互嵌套,但不能相互交叉。

⑥Case语句中的表达式有多种写法:单值:如Case 1;多值:如Case 1,2,3;某个区间:如Case 1 to 3;使用Is关键字指定条件:如Case Is >0;前面几种形式的混合:如Case 1,5 to 8,Is >15,−2,−3,−4

【例7-4】用Select Case结构改写判断一个数为正数、负数还是零。

img403

4.条件函数

除上述分支语句结构外,VBA还提供3个函数来完成相应选择操作。

①Iif函数:

Iif(条件表达式,表达式1,表达式2)

当条件表达式为真时,返回表达式1的值,否则返回表达式2的值。如:

y=Iif(x>0,3,−3)

当x为正数时,返回3赋值给y,否则x为零或负数时,返回−3赋值给y。

②Switch函数:

Switch(条件式1,表达式1[,条件式2,表达式2[,… [条件式n,表达式n]]])

当条件式1为真时,选择表达式1的值,否则,条件式2为真时,返回表达式2的值。如:

y=Switch(x>0,1,x=0,0,x<0,−1)

当x值为正值时,返回值为1,x为零时,返回值为0,x为负数时,返回值为−1。

③Choose函数:

Choose(索引式,选项1[,选项2,…[,选项n]])

当索引值为1时,返回选项1;当索引值为2时,返回选项2;当索引值为n时返回选项n。如:

y=Choose(x,5,6,7)

当x等于1时,返回值5赋值于y;当x等于2时,返回值6赋值于y。