条件判断语句
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
条件判断语句
一、IIf函数(三个参数都为必选参数,这有别于IF函数)
语法:IIf(expr,truepart,falsepart)
部分描述
expr必要参数。
用来判断真伪的表达式。
truepart必要参数。
如果expr为True,则返回这部分的值或表达式。
falsepart必要参数。
如果expr为False,则返回这部分的值或表达式。
说明
由于 IIf 会计算truepart 和falsepart,虽然它只返回其中的一个。
因此要注意到这个副作用。
例如,如果falsepart 产生一个被零除错误,那么程序就会发生错误,即使expr为True。
例1:
Rem 如果A1单元格大于或等于60,则B1单元格显示“及格”,否则为“不及格”
[b1] = IIf([a1] >= 60, "及格", "不及格")
例2:
Sub 根据月份判断季度()
Dim Months As Byte '声明变量
Star: '设置一个标签
'弹出对话框让用户录入月份,默认为当前月份
Months = Application.InputBox("请输入月份,只能是数字", "月份", Month(Date), , , , , 1)
'如果录入的数值小于1或者大于12则返回标签Star 处继续执行
If Months < 1 Or Months > 12 Then MsgBox "只能在1到12之间": GoTo Star
'四个IIF嵌套运用,其中每个IIF的第一参数使用双条件,在双条件时需要用And连接
MsgBox IIf(Months > 1 And Months < 4, "一季度", IIf(Months > 3 And Months < 7, "二季度", IIf(Months > 6 _
And Months < 10, "三季度", IIf(Months > 9 And Months < 1, "四季度", "录入错误"))))
End Sub
二、单行形式If...Then
在单行形式中,按照If...Then 判断的结果也可以执行多条语句。
所有语句必须在同一行上并且以冒号分开,如下面语句所示:
例1:
If A > 10 Then A = A + 1 : B = B + A : C = C + B 例2:'声明工作簿打印事件
Private Sub Workbook_BeforePrint(Cancel As Boolean)
'如果工作表名不等于“总表”就禁止打印
If <> "总表" Then MsgBox "禁止打印": Cancel = True’参数Cancel用于控制是否可以打印
End Sub
例3:
'声明工作簿开启事件
Private Sub Workbook_Open()
'如果现在的小时数大于等于8,而且小于等于18则退出过程If Hour(Now) >= 8 And Hour(Now) <= 18 Then Exit Sub
'退出Excel程序
Application.Quit
End Sub
例4:
Sub 工作簿另存()
'如果A1是数字,而且非空,那么工作簿保存为A1的值
'IsNumeric判断单元格值是否为数值
'SaveAs另存为
'FileFormat文件类型
'xlOpenXMLWorkbookMacroEnabled启动宏的工作簿
If VBA.IsNumeric([a1]) And Len([a1]) > 0 Then
ThisWorkbook.SaveAs "C:\" & [a1],
FileFormat:=xlOpenXMLWorkbookMacroEnabled
End Sub
三、If...Then...Else 语句
语法有两种格式,一种是语句在同一行中,其不需要End If作为结束语;另一种是多行,则End If必须要成结出现。
If condition Then [statements][Else elsestatements]
或者,可以使用块形式的语法:
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements] ...
[Else
[elsestatements]]
End If
部分描述
condition必要参数。
一个或多个具有下面两种类型的表达式:
数值表达式或字符串表达式,其运算结果为True或
False。
如果condition为Null,则condition会视为
False。
TypeOf objectname Is objecttype形式的表达式。
其中
的objectname是任何对象的引用,而objecttype则是
任何有效的对象类型。
如果objectname是objecttype
所指定的一种对象类型,则表达式为True,否则为False。
statements在块形式中是可选参数;但是在单行形式中,且没有 Else
子句时,则为必要参数。
一条或多条以冒号分开的语句,
它们在condition 为True 时执行。
condition-n可选参数。
与condition同。
elseifstatements可选参数。
一条或多条语句,它们在相关的condition-n
为True 时执行。
elsestatements可选参数。
一条或多条语句,它们在前面的condition 或
condition-n 都不为True 时执行。
注意在单行形式中,按照If...Then 判断的结果也可以执行多条语句。
所有语句必须在同一行上并且以冒号分开,如下面语句所示:
If A > 10 Then A = A + 1 : B = B + A : C = C + B
在块形式中,If语句必须是第一行语句。
其中的Else、ElseIf,和End If部分可以只在之前加上行号或行标签。
If 块必须以一个End If语句结束。
要决定某个语句是否为一个If 块,可检查Then关键字之后是什么。
如果在Then 同一行之后,还有其它非注释的内容,则此语句就是单行形式的If语句。
Else和ElseIf 子句都是可选的。
在If块中,可以放置任意多个ElseIf子句,但是都必须在Else子句之前。
If 块也可以是嵌套的。
当程序运行到一个If块(第二种语法)时,condition 将被测试。
如果condition为True,则在Then之后的语句会被执行。
如果condition 为False,则每个ElseIf部分的条件式(如果有的话)会依次计算并加以测试。
如果找到某个为True 的条件时,则其紧接在相关的Then 之后的语句会被执行。
如果没有一个ElseIf条件式为True(或是根本就没有ElseIf子句),则程序会执行Else 部分的语句。
而在执行完Then 或Else 之后的语句后,会从End If之后的语句继续执行。
提示根据单一表达式来执行多种可能的动作时,Select Case 更为有用。
不过,TypeOf objectname Is objecttype 子句不能在 Select Case 语句中使用。
注意 TypeOf不能与诸如 Long、Integer 以及其他不是 Object 的固定数据类型一起使用。
四、If...Then...Else 语句嵌套
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements]
[ElseIf condition-n Then
[elseifstatements] ...(省略号代表可以添加更多的条件和更多的语句)
[Else
[elsestatements]]
End If
或
If condition Then
If condition-n Then
[elseifstatements]
Else
[elsestatements]
End If
Else
[elsestatements]
End If
四、Select Case 语句
根据表达式的值,来决定执行几组语句中的其中之一。
语法:
Select Case testexpression
[Case expressionlist-n
[statements-n]] ...
[Case Else
[elsestatements]]
End Select
部分描述
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子句的任何部分时执行。
说明
如果testexpression匹配某个Case expressionlist表达式,则在Case子句之后,直到下一个Case子句的statements 会被执行;如果是最后一个子句,则会执行到End Select。
然后控制权会转移到End Select之后的语句。
如果testexpression 匹配一个以上的Case子句中的expressionlist表达式,则只有第一个匹配后面的语句会被执行。
Case Else子句用于指明elsestatements,当testexpression 和所有的Case 子句中的expressionlist都不匹配时,则会执行这些语句。
虽然不是必要的,但是在 Select Case 区块中,最好还是加上Case Else语句来处理不可预见的testexpression值。
如果没有Case expressionlist匹配testexpression,而且也没有Case Else语句,则程序会从End Select之后的语句继续执行。
可以在每个Case子句中使用多重表达式或使用范围,例如,下面的语句是正确的:
Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber
注意Is比较运算符和使用在Select Case语句中的Is关键字并不相同。
也可以针对字符串指定范围和多重表达式。
在下面的例子中,Case所匹配的字符串为:等于everything、按英文字母顺序落入从nuts到soup之间的字符串、以及TestItem所代表的当前值。
Case "everything", "nuts" To "soup", TestItem Select Case 语句也可以是嵌套的。
但每个嵌套的Select Case语句必须要有相应的End Select 语句。
例:
Function 成绩划分等级(rng As Range)
Select Case rng
Case Is < 0, Is > 100 ' is关键词可以同行中使用两次,中间用逗号隔开,表示两个条件
成绩 = "输入错误"
Case Is < 60
成绩 = "不及格"
Case 60
成绩 = "及格"
Case 60 To 80
成绩 = "良"
Case 81 To 99
成绩 = "优"
Case Else '如果不符合前面的条件,则执行本语句成绩 = "满分"
End Select
End Function
嵌套例:
Sub 嵌套case()
Dim Tim As Byte, msg As String
Tim = Hour(Now)
Select Case Tim
Case Is > 7, Is <= 24
Select Case Tim
Case 7 To 11
msg = "上午"
Case Is < 12
msg = "上午"
Case 12
msg = "中午"
Case Is < 13
msg = "下午"
Case 13 To 17
msg = "下午"
Case Is < 18
msg = "下午"
Case 18 To 23
msg = "晚上"
Case Is < 24
msg = "晚上"
Case Is = 24
msg = "午夜"
End Select
Case Else
msg = "凌晨"
End Select
MsgBox msg
End Sub
IF与Select比较
两者可以实现多条件判断,各有优势。
IF的优势在于条件中可以随时使用and和or运算符设置条件。
Select的优势在于速度快于IF。
五、Choose 函数
从参数列表中选择并返回一个值。
语法
Choose(index, choice-1[, choice-2, ... [, choice-n]])
Choose函数的语法具有以下几个部分:
部分描述
index必要参数,数值表达式或字段,它的运算结果是一个数值,且界于 1 和可选择的项目数之间。
choice必要参数,Variant 表达式,包含可选择项目的其中之一。
说明
Choose 会根据index 的值来返回选择项列表中的某个值。
如果index 是 1,则Choose会返回列表中的第 1 个选择项。
如果index 是 2,则会返回列表中的第 2 个选择项,以此类推。
可以使用Choose 来查阅一个列表中的项目。
例如,如果index 所指定的值为 3,而choice-1= "one"、choice-2= "two"、且choice-3= "three",那么Choose将返回"three"。
当index 代表一选项组中的值时,则这项功能将会特别有用。
即使它只返回一个选项值,Choose 仍然会计算列表中的每个选择项。
所以应该注意到这项副作用。
例如,当在每个选择项表达式中使用了MsgBox函数作为其中的一部分时,每
计算一个选择项,就会显示一次消息框。
当index小于 1 或大于列出的选择项数目时,Choose 函数返回Null。
如果index不是整数,则会先四舍五入为与其最接近的整数。
例:
Sub 设置单元格颜色1() 'Choose法
Dim 颜色 As Byte
颜色= Application.InputBox("请选择颜色:" & Chr(10) & "1:红色" & " 2:蓝色" & Chr(10) & _
"3:灰色" & " 4:棕色" & Chr(10) & "5:绿色", "指定颜色", 1, , , , , 1)
Range("A1").Interior.ColorIndex = Choose(颜色, 7, 5, 15, 40, 4)
End Sub
Sub 设置单元格颜色2() 'IIF法
Dim 颜色 As Byte
颜色= Application.InputBox("请选择颜色:" & Chr(10) & "1:红色" & " 2:蓝色" & Chr(10) & _
"3:灰色" & " 4:棕色" & Chr(10) & "5:绿色", "指定颜色", 1, , , , , 1)
Range("A1").Interior.ColorIndex = IIf(颜色 = 1, 7, IIf(颜色 = 2, 5, IIf(颜色 = 3, 15, IIf(颜色 = 4, 40, IIf(颜色 = 5, 4, xlNone)))))
End Sub
Sub 设置单元格颜色3() 'IF...Then...Else法
Dim 颜色 As Byte
颜色= Application.InputBox("请选择颜色:" & Chr(10) & "1:红色" & " 2:蓝色" & Chr(10) & _
"3:灰色" & " 4:棕色" & Chr(10) & "5:绿色", "指定颜色", 1, , , , , 1)
If 颜色 = 1 Then
Range("A1").Interior.ColorIndex = 7
ElseIf 颜色 = 2 Then
Range("A1").Interior.ColorIndex = 5
ElseIf 颜色 = 3 Then
Range("A1").Interior.ColorIndex = 15
ElseIf 颜色 = 4 Then
Range("A1").Interior.ColorIndex = 40
ElseIf 颜色 = 5 Then
Range("A1").Interior.ColorIndex = 4
End If
End Sub
Sub 设置单元格颜色4() 'Select Case法
Dim 颜色 As Byte
颜色= Application.InputBox("请选择颜色:" & Chr(10) & "1:红色" & " 2:蓝色" & Chr(10) & _
"3:灰色" & " 4:棕色" & Chr(10) & "5:绿色", "指定颜色", 1, , , , , 1)
Select Case 颜色
Case 1
Range("A1").Interior.ColorIndex = 7
Case 2
Range("A1").Interior.ColorIndex = 5
Case 3
Range("A1").Interior.ColorIndex = 15
Case 4
Range("A1").Interior.ColorIndex = 40
Case 5
Range("A1").Interior.ColorIndex = 4
End Select
End Sub。