条件判断语句.docx
《条件判断语句.docx》由会员分享,可在线阅读,更多相关《条件判断语句.docx(13页珍藏版)》请在冰豆网上搜索。
条件判断语句
条件判断语句
一、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根据月份判断季度()
DimMonthsAsByte'声明变量
Star:
'设置一个标签
'弹出对话框让用户录入月份,默认为当前月份
Months=Application.InputBox("请输入月份,只能是数字","月份",Month(Date),,,,,1)
'如果录入的数值小于1或者大于12则返回标签Star处继续执行
IfMonths<1OrMonths>12ThenMsgBox"只能在1到12之间":
GoToStar
'四个IIF嵌套运用,其中每个IIF的第一参数使用双条件,在双条件时需要用And连接
MsgBoxIIf(Months>1AndMonths<4,"一季度",IIf(Months>3AndMonths<7,"二季度",IIf(Months>6_
AndMonths<10,"三季度",IIf(Months>9AndMonths<1,"四季度","录入错误"))))
EndSub
二、单行形式If...Then
在单行形式中,按照If...Then判断的结果也可以执行多条语句。
所有语句必须在同一行上并且以冒号分开,如下面语句所示:
例1:
IfA>10ThenA=A+1:
B=B+A:
C=C+B
例2:
'声明工作簿打印事件
PrivateSubWorkbook_BeforePrint(CancelAsBoolean)
'如果工作表名不等于“总表”就禁止打印
IfActiveSheet.Name<>"总表"ThenMsgBox"禁止打印":
Cancel=True’参数Cancel用于控制是否可以打印
EndSub
例3:
'声明工作簿开启事件
PrivateSubWorkbook_Open()
'如果现在的小时数大于等于8,而且小于等于18则退出过程
IfHour(Now)>=8AndHour(Now)<=18ThenExitSub
'退出Excel程序
Application.Quit
EndSub
例4:
Sub工作簿另存()
'如果A1是数字,而且非空,那么工作簿保存为A1的值
'IsNumeric判断单元格值是否为数值
'SaveAs另存为
'FileFormat文件类型
'xlOpenXMLWorkbookMacroEnabled启动宏的工作簿
IfVBA.IsNumeric([a1])AndLen([a1])>0ThenThisWorkbook.SaveAs"C:
\"&[a1],FileFormat:
=xlOpenXMLWorkbookMacroEnabled
EndSub
三、If...Then...Else语句
语法有两种格式,一种是语句在同一行中,其不需要EndIf作为结束语;另一种是多行,则EndIf必须要成结出现。
IfconditionThen[statements][Elseelsestatements]
或者,可以使用块形式的语法:
IfconditionThen
[statements]
[ElseIfcondition-nThen
[elseifstatements]...
[Else
[elsestatements]]
EndIf
部分
描述
condition
必要参数。
一个或多个具有下面两种类型的表达式:
数值表达式或字符串表达式,其运算结果为True或False。
如果condition为Null,则condition会视为False。
TypeOfobjectnameIsobjecttype形式的表达式。
其中的objectname是任何对象的引用,而objecttype则是任何有效的对象类型。
如果objectname是objecttype所指定的一种对象类型,则表达式为True,否则为False。
statements
在块形式中是可选参数;但是在单行形式中,且没有Else子句时,则为必要参数。
一条或多条以冒号分开的语句,它们在condition为True时执行。
condition-n
可选参数。
与condition同。
elseifstatements
可选参数。
一条或多条语句,它们在相关的condition-n为True时执行。
elsestatements
可选参数。
一条或多条语句,它们在前面的condition或condition-n都不为True时执行。
注意在单行形式中,按照If...Then判断的结果也可以执行多条语句。
所有语句必须在同一行上并且以冒号分开,如下面语句所示:
IfA>10ThenA=A+1:
B=B+A:
C=C+B
在块形式中,If语句必须是第一行语句。
其中的Else、ElseIf,和EndIf部分可以只在之前加上行号或行标签。
If块必须以一个EndIf语句结束。
要决定某个语句是否为一个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之后的语句后,会从EndIf之后的语句继续执行。
提示根据单一表达式来执行多种可能的动作时,SelectCase更为有用。
不过,TypeOfobjectnameIsobjecttype子句不能在SelectCase语句中使用。
注意TypeOf不能与诸如Long、Integer以及其他不是Object的固定数据类型一起使用。
四、If...Then...Else语句嵌套
IfconditionThen
[statements]
[ElseIfcondition-nThen
[elseifstatements]
[ElseIfcondition-nThen
[elseifstatements]...(省略号代表可以添加更多的条件和更多的语句)
[Else
[elsestatements]]
EndIf
或
IfconditionThen
Ifcondition-nThen
[elseifstatements]
Else
[elsestatements]
EndIf
Else
[elsestatements]
EndIf
四、SelectCase语句
根据表达式的值,来决定执行几组语句中的其中之一。
语法:
SelectCasetestexpression
[Caseexpressionlist-n
[statements-n]]...
[CaseElse
[elsestatements]]
EndSelect
部分
描述
testexpression
必要参数。
任何数值表达式或字符串表达式。
expressionlist-n
如果有Case出现,则为必要参数。
其形式为expression,expressionToexpression,Iscomparisonoperatorexpression的一个或多个组成的分界列表。
To关键字可用来指定一个数值范围。
如果使用To关键字,则较小的数值要出现在To之前。
使用Is关键字时,则可以配合比较运算符(除Is和Like之外)来指定一个数值范围。
如果没有提供,则Is关键字会被自动插入。
statements-n
可选参数。
一条或多条语句,当testexpression匹配expressionlist-n中的任何部分时执行。
elsestatements
可选参数。
一条或多条语句,当testexpression不匹配Case子句的任何部分时执行。
说明
如果testexpression匹配某个Caseexpressionlist表达式,则在Case子句之后,直到下一个Case子句的statements会被执行;如果是最后一个子句,则会执行到EndSelect。
然后控制权会转移到EndSelect之后的语句。
如果testexpression匹配一个以上的Case子句中的expressionlist表达式,则只有第一个匹配后面的语句会被执行。
CaseElse子句用于指明elsestatements,当testexpression和所有的Case子句中的expressionlist都不匹配时,则会执行这些语句。
虽然不是必要的,但是在SelectCase区块中,最好还是加上CaseElse语句来处理不可预见的testexpression值。
如果没有Caseexpressionlist匹配testexpression,而且也没有CaseElse语句,则程序会从EndSelect之后的语句继续执行。
可以在每个Case子句中使用多重表达式或使用范围,例如,下面的语句是正确的:
Case1To4,7To9,11,13,Is>MaxNumber
注意Is比较运算符和使用在SelectCase语句中的Is关键字并不相同。
也可以针对字符串指定范围和多重表达式。
在下面的例子中,Case所匹配的字符串为:
等于everything、按英文字母顺序落入从nuts到soup之间的字符串、以及TestItem所代表的当前值。
Case"everything","nuts"To"soup",TestItem
SelectCase语句也可以是嵌套的。
但每个嵌套的SelectCase语句必须要有相应的EndSelect语句。
例:
Function成绩划分等级(rngAsRange)
SelectCaserng
CaseIs<0,Is>100'is关键词可以同行中使用两次,中间用逗号隔开,表示两个条件
成绩="输入错误"
CaseIs<60
成绩="不及格"
Case60
成绩="及格"
Case60To80
成绩="良"
Case81To99
成绩="优"
CaseElse'如果不符合前面的条件,则执行本语句
成绩="满分"
EndSelect
EndFunction
嵌套例:
Sub嵌套case()
DimTimAsByte,msgAsString
Tim=Hour(Now)
SelectCaseTim
CaseIs>7,Is<=24
SelectCaseTim
Case7To11
msg="上午"
CaseIs<12
msg="上午"
Case12
msg="中午"
CaseIs<13
msg="下午"
Case13To17
msg="下午"
CaseIs<18
msg="下午"
Case18To23
msg="晚上"
CaseIs<24
msg="晚上"
CaseIs=24
msg="午夜"
EndSelect
CaseElse
msg="凌晨"
EndSelect
MsgBoxmsg
EndSub
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颜色AsByte
颜色=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)
EndSub
Sub设置单元格颜色2()'IIF法
Dim颜色AsByte
颜色=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)))))
EndSub
Sub设置单元格颜色3()'IF...Then...Else法
Dim颜色AsByte
颜色=Application.InputBox("请选择颜色:
"&Chr(10)&"1:
红色"&"2:
蓝色"&Chr(10)&_
"3:
灰色"&"4:
棕色"&Chr(10)&"5:
绿色","指定颜色",1,,,,,1)
If颜色=1Then
Range("A1").Interior.ColorIndex=7
ElseIf颜色=2Then
Range("A1").Interior.ColorIndex=5
ElseIf颜色=3Then
Range("A1").Interior.ColorIndex=15
ElseIf颜色=4Then
Range("A1").Interior.ColorIndex=40
ElseIf颜色=5Then
Range("A1").Interior.ColorIndex=4
EndIf
EndSub
Sub设置单元格颜色4()'SelectCase法
Dim颜色AsByte
颜色=Application.InputBox("请选择颜色:
"&Chr(10)&"1:
红色"&"2:
蓝色"&Chr(10)&_
"3:
灰色"&"4:
棕色"&Chr(10)&"5:
绿色","指定颜色",1,,,,,1)
SelectCase颜色
Case1
Range("A1").Interior.ColorIndex=7
Case2
Range("A1").Interior.ColorIndex=5
Case3
Range("A1").Interior.ColorIndex=15
Case4
Range("A1").Interior.ColorIndex=40
Case5
Range("A1").Interior.ColorIndex=4
EndSelect
EndSub