判断结构测试一个条件表达式,然后根据测试结果执行不同的操作。Excel VBA和Python支持多种不同形式的判断结构。
单分支判断结构
【Excel VBA】
Excel VBA中单分支判断结构的语法格式为:
If 判断条件 Then 执行语句
其中判断条件常常是一个关系表达式或逻辑表达式,条件满足时执行Then后面的语句。
【Python】
Python中单分支判断结构的语法格式为:
if 判断条件:执行语句
其中判断条件常常是一个关系表达式或逻辑表达式,条件满足时执行冒号后面的语句。
下面用一个例子演示单分支判断结构。要求运行时给出一个字符串,然后用单分支判断结构判断该字符串是否是大谦Excel的网址。如果是,则输出“大谦Excel的网址是dqexcel.com”。
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\判断结构.xlsm。
Sub Test1()
Dim intA As Integer
intA = InputBox("请输入大谦Excel的网址:")
If intA = "dqexcel.com" Then Debug.Print("大谦Excel的网址是dqexcel.com")
End Sub
运行程序,弹出输入框,在文本框中输入dqexcel.com,立即窗口中输出“大谦Excel的网址是dqexcel.com”。
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-001.py。
a=input('请输入大谦Excel的网址:')
if(int(a)== 'dqexcel.com'): print('大谦Excel的网址是dqexcel.com')
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口提示"请输入大谦Excel的网址:",输入dqexcel.com,回车,显示下面的结果。
>>> = RESTART: …\Samples\ch05\Python\sam05-001.py
请输入大谦Excel的网址:dqexcel.com
大谦Excel的网址是dqexcel.com
二分支判断结构
二分支判断结构可以根据判断条件结果的不同改变程序执行的流程,如果判断条件为真,执行指定语句;如果判断条件为假,执行另外的语句。
【Excel VBA】
Excel VBA中语法格式为:
If 判断条件 Then
执行语句…
Else
执行语句…
End If
【Python】
Python中语法格式为:
if 判断条件:
执行语句…
else:
执行语句…
下面用一个例子演示二分支判断结构的应用。示例首先要求输入一个数字,然后判断数字是否大于0。数字如果大于0,输出字符串"成功。";否则输出字符串"失败。"。
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\判断结构.xlsm。
Sub Test2()
Dim intPassed As Integer
intPassed = InputBox("请输入一个数字:")
If intPassed > 0 Then
Debug.Print "成功。"
Else
Debug.Print "失败。"
End If
End Sub
运行程序,弹出输入框,在文本框中输入5,立即窗口中输出“成功。”。
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-002.py。
passed=int(input("请输入一个数字:")) #提示输入数字
if(passed>0): #根据输入的数字进行判断,如果数字大于0
print("成功。") #
else: #如果数字小于等于0
print("失败。")
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口提示"请输入一个数字:",输入5,回车,显示下面的结果。
>>> = RESTART: …\Samples\ch05\Python\sam05-002.py
请输入一个数字:5
成功。
多分支判断结构
多分支判断结构在二分支判断结构的基础上进行了扩展,在第1个判断条件不满足时给出第2个判断条件,第2个不满足时给出第3个,如此类推。当前条件满足时执行相应的语句,最后都不满足时执行最后的语句。
【Excel VBA】
Excel VBA中多分支判断结构的语法格式为:
If 判断条件1 Then
执行语句1……
Else If 判断条件2 Then
执行语句2……
Else If 判断条件3 Then
执行语句3……
…
Else
执行语句n……
End If
【Python】
Python中多分支判断结构的语法格式为:
if 判断条件1:
执行语句1……
elif 判断条件2:
执行语句2……
elif 判断条件3:
执行语句3……
…
else:
执行语句n……
下面的代码用一个多分支判断结构判断给定的成绩分数属于哪个等级。成绩如果大于等于90分,为优秀;否则如果大于等于80分,为良好;否则如果大于等于70分,为中等;否则如果大于等于60分,为及格;以上都不满足为不及格。
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\判断结构.xlsm。
Sub Test3()
Dim intSC As Integer
intSC = InputBox("请输入一个数字:")
If intSC >= 90 Then
Debug.Print "优秀"
ElseIf intSC >= 80 Then
Debug.Print "良好"
ElseIf intSC >= 70 Then
Debug.Print "中等"
ElseIf intSC >= 60 Then
Debug.Print "及格"
Else
Debug.Print "不及格"
End If
End Sub
运行程序,弹出输入框,在文本框中输入85,立即窗口中输出“良好”。
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-003.py。
sc= int(input("请输入一个数字:"))
if(sc>=90):
print("优秀")
elif(sc>=80):
print("良好")
elif(sc>=70):
print("中等")
elif(sc>=60):
print("及格")
else:
print("不及格")
第1行用input函数实现一个输入提示,提示输入一个数字;第2行至第11行为多分支判断结构,判断输入的成绩分数属于哪个等级。
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口提示"请输入一个数字:",输入88,回车,显示下面的结果。
>>> = RESTART: …\Samples\ch05\Python\sam05-003.py
请输入一个数字:88
良好
有嵌套的判断结构
如果一个判断结构的If(if)块、ElseIf(elif)块或Else(else)块中又包含有新的判断结构,则称这个判断结构为有嵌套的判断结构。
【Excel VBA】
Excel VBA中嵌套结构的形式具有类似下面的语法格式:
If 判断条件1 Then
执行语句……
If 判断条件2 Then
执行语句……
Else If 判断条件3 Then
执行语句……
Else
执行语句……
End If
Else If 判断条件4 Then
执行语句……
Else
执行语句……
End If
【Python】
Python中嵌套结构的形式具有类似下面的语法格式:
if 判断条件1:
执行语句……
if 判断条件2:
执行语句……
elif 判断条件3:
执行语句……
else
执行语句……
elif 判断条件4:
执行语句……
else:
执行语句……
下面将前一小节中对成绩分等级的示例改写成嵌套的判断结构。首先判断成绩是否大于等于60分,如果不是,直接判断为不及格;如果是,嵌套一个多分支判断结构继续判断成绩等级。
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\判断结构.xlsm。
Sub Test4()
Dim intSC As Integer
intSC = InputBox("请输入一个数字:")
If intSC >= 60 Then
If intSC >= 90 Then
Debug.Print "优秀"
ElseIf intSC >= 80 Then
Debug.Print "良好"
ElseIf intSC >= 70 Then
Debug.Print "中等"
Else
Debug.Print "及格"
End If
Else
Debug.Print "不及格"
End If
End Sub
运行程序,弹出输入框,在文本框中输入85,立即窗口中输出“良好”。
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-004.py。
sc= int(input("请输入一个数字:"))
if sc>=60:
if sc>=90:
print("优秀")
elif sc>=80:
print("良好")
elif sc>=70:
print("中等")
else:
print("及格")
else:
print("不及格")
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口提示"请输入一个数字:",输入88,回车,显示下面的结果。
>>> = RESTART: …\Samples\ch05\Python\sam05-004.py
请输入一个数字:88
良好
5.1.5三元操作表达式
三元操作表达式在一行语句中实现一个二分支判断结构。下面在Excel VBA和Python中分别实现三元操作表达式的效果。
【Excel VBA】
Excel VBA 中引用IIF 函数实现三元操作。IIF函数根据表达式的值,返回两个结果中的一个。
IIF(expr, truepart, falsepart)
其中,函数参数expr为必要参数,是用来判断真伪的表达式;参数truepart为必要参数,如果expr的值为True,则返回这部分的值或表达式;参数falsepart为必要参数,如果expr为False,则返回这部分的值或表达式。
【Python】
Python中用下面的语法格式实现三元操作。
b if 判断条件 else a
如果判断条件满足,结果为b,否则结果为a。
下面用三元操作表达式判断给定的数是否大于等于500。
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\判断结构.xlsm。
Sub Test5()
Dim intA As Integer
intA = InputBox("请输入一个数字:")
Debug.Print IIf(intA > 500, ">500", "<=500")
End Sub
运行程序,弹出输入框,在文本框中输入300,立即窗口中输出"<=500"。
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-005.py。
a= int(input("请输入一个数字:"))
print(">500" if a>500 else "<=500")
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口提示"请输入一个数字:",输入300,回车,显示下面的结果。
>>> = RESTART: …\Samples\ch05\Python\sam05-005.py
请输入一个数字:300
<=500
下面用三元操作表达式求给定的三个数中的最小值。
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\判断结构.xlsm。
Sub Test6()
Dim intX As Integer
Dim intY As Integer
Dim intZ As Integer
Dim intS As Integer
intX = 10: intY = 20: intZ = 30
intS = IIf(intX < intY, intX, intY) 'intX和intY的小值赋给intS
intS = IIf(intS < intZ, intSmall, intZ) '得到intS和intZ的小值
Debug.Print intS
End Sub
运行程序,在立即窗口中输出最小值10。
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-006.py。
x,y,z = 10,30,20
small = (x if x < y else y) #返回前两个数的小值
small = (z if small > z else small) #返回小值和第3个数的小值
print(small)
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示下面的结果。
>>> = RESTART: …\Samples\ch05\Python\sam05-006.py
10
判断结构示例-判断是否闰年
闰年包括世纪闰年和普通闰年。世纪闰年可以被400整除,普通闰年能被4整除,不能被100整除。下面判断图5-1所示工作表中第1列指定年份是否为闰年,结果显示在第2列对应行的单元格。
图5-1 判断给定年份是否为闰年
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\判断是否闰年.xlsm。
Sub Test()
Dim intI As Integer
Dim intY As Integer
Dim bolYN As Boolean '值为真时表示是闰年,否则不是
For intI = 2 To 7
intY = ActiveSheet.Cells(intI, 1).Value '获取年份
If(intY Mod 400) = 0 Then '判断是否为世纪闰年
bolYN = True
ElseIf(intY Mod 4) = 0 Then '继续判断是否为普通闰年
If(intY Mod 100) > 0 Then '能被4整除,不能被100整除,是普通闰年
bolYN = True
Else '能被4整除,也能被100整除,不是普通闰年
bolYN = False
End If
Else '不能被4整除时,不是闰年
bolYN = False
End If
If bolYN Then '根据bolYN的值在第2列对应位置输出结果
ActiveSheet.Cells(intI, 2).Value = "是"
Else
ActiveSheet.Cells(intI, 2).Value = "不是"
End If
Next
End Sub
运行程序,输出判别结果如图5-1中第2列所示。
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-01.py。
import xlwings as xw #导入xlwings包
#从constants类中导入Direction
from xlwings.constants import Direction
import os #导入os包
#获取本py文件的当前路径
root = os.getcwd()
#创建Excel应用,可见,没有工作簿
app=xw.App(visible=True, add_book=False)
#打开数据文件,可写
bk=app.books.open(fullname=root+r'\判断是否闰年.xlsx',read_only=False)
sht=bk.sheets(1) #获取第1个工作表
#工作表中第1列数据最大行号
rows=sht.api.Range('A1').End(Direction.xlDown).Row
n=1 #记录当前第几行数据
#遍历数据区域的单元格
for rng in sht.range('A2:A'+str(rows)):
n+=1 #每循环一次,工作表中下移一行,即行数加1
yr=int(rng.value) #获取年份
#如果年份能被400整除,是闰年
if yr%400==0:
yn=True
elif yr%4==0: #否则判断是否能被4整除
if yr%100>0: #继续判断能否被100整除,如果不能,是闰年
yn=True
else: #如果能被100整除,不是闰年
yn=False
else: #如果不能被4整除,不是闰年
yn=False
#根据yn的值在第2列输出是或不是
if yn:
sht.cells(n,2).value='是'
else:
sht.cells(n,2).value='不是'
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,打开数据文件并进行计算,结果显示在工作表第2列中,如图5-1所示。