说说VBA中的Select Case语句
Select Case语句也是条件语句之一,而且是功能最强大的条件语句。它主要用于多条件判断,而且其条件设置灵活、方便,在工作中使用频率极高。本节介绍Select Case语句的语法及应用案例.
Select Case语句的语法如下:
Select Case testexpression
[Case expressionlist-n
[statements-n]] ...
[Case Else
[elsestatements]]
End Select
Select Case语句包括四部分,每部分详细含义如表38-1所示。
表38-1 Select Case语句各部分含义
部 分 |
描 述 |
testexpression |
必要参数。任何数值表达式或字符串表达式 |
expressionlist-n |
如果有 Case 出现,则为必要参数。其形式为 expression,expression To expression,Is comparisonoperator。expression的一个或多个组成的分界列表。To 关键字可用来指定一个数值范围。如果使用 To 关键字,则较小的数值要出现在 To 之前。使用 Is 关键字时,则可以配合比较运算符(除 Is 和 Like 之外)来指定一个数值范围。如果没有提供,则 Is 关键字会被自动插入 |
statements-n |
可选参数。一条或多条语句,当testexpression匹配expressionlist-n中的任何部分时执行 |
elsestatements |
可选参数。一条或多条语句,当testexpression不匹配Case子句的任何部分时执行 |
在以上语法列表中,省略号代表可以使用多个条件。只要有一个Case就需要有一个statements-n,表示条件及符合条件时的执行条件。
其中elsestatements表示不符合指定条件时的执行语句,是可选参数。可以忽略elsestatements,也可以执行一条或者一组语句,为了让程序能够处理一些不可预见的情况,尽量使用elsestatements语句处理不符合条件时该如何回应。
在Select Case的多个参数中,最复杂的是expressionlist-n部分,它有多种表达形式,包括:
lExpression——直接声明一个条件值,例如5
lexpression To expression——声明一个条件的范围,例如5-10
lIs comparisonoperator——声明一种比较方式,例如is >5
下面的实例可以展示参数中expressionlist-n部分的多种表达形式。
实例1:多条件时间判断
根据当前的时间判断是上午、中午,还是下午、晚上、午夜。
要求中条件比较多,使IF…Then…需要多层嵌套,而Select Case语句会更简单。代码如下:
___________________________________________________
Sub 时间()
Dim Tim As Byte, msg As String
Tim = Hour(Now)
Select Case Tim
Case 1 To 11
msg = "上午"
Case 12
msg = "中午"
Case 13 To 16
msg = "下午"
Case 17 To 20
msg = "晚上"
Case 23, 24
msg = "午夜"
End Select
MsgBox "现在是:" & msg
End Sub
__________________________________________
以上代码中,“Case 1 To 11”表示当前时间在1点到11点,用于限定一个范围;“Case 12”是表示当前时间为12点时返回True,可用于限制一个具体的值,或者多个值。如果需要罗列多个具体的值,那么需要在每个值之间使用逗号分隔,例如“Case 23, 24”。
本例中不存在例外的情况,所以忽略“Case Else”语句。
实例2:根据成绩返回评语
如果成绩小于60则返回“不及格”,60到80之间则返回“良”,80到99则返回“优”,100分则返回“满分”,如果成绩大于100则是输入了错误值。利用一个Function过程来处理,其代码如下:
________________________________________
Function 成绩(rng As Range)
Select Case rng
Case Is < 0, Is > 100
成绩 = "输入错误"
Case Is < 60
成绩 = "不及格"
Case 60
成绩 = "及格"
Case 60 To 80
成绩 = "良"
Case 81 To 99
成绩 = "优"
Case Else
成绩 = "满分"
End Select
End Function
_____________________________________
以上代码中,Is关键词用于指定一种比较方式,后接Is和Like以外的比较运算符。本例中需要限制小于0和大于100两个条件,那么Is关键词可以同行中使用两次,中间用逗号分隔,表示罗列两个条件。
“Case Is < 60”语句在第一个条件“Case Is < 0, Is > 100”基础上再进行比较,那么成绩“-10”将不符合“<60”这个条件,因为 Select Case在处理多条件时,总是按从上到下的顺序处理。如果改变本例的条件顺序,可能产生不同的运算结果。
“Case Else”语句表示如果不符合前面的所有条件,则执行它后面的语句,本例中表示成绩为100时返回“满分”。
在工作表中使用该自定义函数后,结果如图38.1所示。
图38.1 利用Function返回成绩评语
实例3:以指定格式显示星期
现要求在状态栏显示今日星期,以三种方式供用户选择。具体代码如下:
Sub 在状态栏显示今日是星期几()
Dim str As String
star:
Select Case InputBox("请指定日期显示方式: " & Chr(10) & "1:周一样式" & Chr(10) _
& "2:星期一样式" & Chr(10) & "3:英文", "日期显示方式", 1)
Case 1
str = "AAA"
Case 2
str = "AAAA"
Case 3
str = "DDDD"
Case Else
MsgBox "录入错误,请重新录入"
GoTo star
End Select
Application.StatusBar = Format(Date, str)
End Sub
________________________________________
本例是“Select Case”对象不确定的实例,它在执行后由用户手动指定对象。
在Select Case语句中,利用Case限制了三个条件,分别为手动录入1、2和3时的日期显示格式。但用户可能会误输入1到3范围以外的数值,使程序产生错误,那么利用Case Else语句来限制,且返回到InputBox语句处让用户重新录入,直到数值处于要求的范围内为止,这是最理想的处理方式。
实例4:Select Case嵌套应用计算时间
和IF…Then…一样,Select Case也可以多层嵌套。本例根据现在的时间判断是白天还是晚上,如果是白天,再进行细分“上午”、“正午”和“下午”。详细代码如下:
________________________________________
Sub 时间2()
tim = Hour(Now) '获取现在的时间
Select Case tim '条件语句开始,第一层
Case 8 To 18
'如果是白天
Select Case tim '嵌套使用,第二层
Case Is < 12 '如果小于12
MsgBox "上午"
Case 12
'如果等于12
MsgBox "正午"
Case Else
'其他情况,表示13到18之间
MsgBox "下午"
End Select
'结束层条件语句
Case Else
'其他情况,外层
MsgBox "晚上"
'表示1到8之间或19到24之间
End Select
End Sub
_____________________________________
在Select Case语句第一个条件中嵌套了一个Select Case条件语句。根据需要,还可以嵌套多层条件语句。