循环结构允许重复执行一行或数行代码,主要有for循环和while循环等几种形式。for循环的循环次数是确定的,而while循环的次数不确定,在满足要求时一直循环或在满足要求前一直循环。本节介绍for循环。
for循环
【Excel VBA】
利用该结构按给定的次数重复操作。语法格式为:
For Num = First To Last [Step Inc]
执行语句
Next [Num]
当Num位于First到Last之间时运行语句。其中,Num为迭代变量,First为Num的初值,Last为Num的终值,Step为相邻循环的步长间隔。当First比Last小时,步长为正;当First比Last大时,步长取负值。
【Python】
利用for循环按给定的次数重复操作。该循环结构的语法格式为:
for 迭代变量 in 可迭代对象
执行语句
使用for循环遍历指定的可迭代对象,即针对可迭代对象中的每个元素执行相同的操作。可迭代对象包括字符串、列表、元组、字典等,这些对象将在后面的章节中进行介绍。
下面的例子以100为间隔,在立即窗口中输出1到500的值。
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\For循环.xlsm。
Sub Test1()
Dim intA As Integer
For intA = 1 To 500 Step 100
Debug.Print intA
Next
End Sub
执行程序,在立即窗口中输出结果:
1
101
201
301
401
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-007.py。其中range函数在1到500范围内每隔100取一个数,组成一个可迭代的range对象。
for num in range(1,500,100):
print(num)
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示下面的结果。
>>> = RESTART: …\Samples\ch05\Python\sam05-007.py
1
101
201
301
401
下面用for循环对1到10的整数进行累加。
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\For循环.xlsm。
Sub Test2()
Dim intI As Integer
Dim intSum As Integer '保存累加和
intSum = 0
For intI = 1 To 10
intSum = intSum + intI '累加
Next
Debug.Print intSum
End Sub
执行程序,在立即窗口中输出1到10的累加和55。
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-008.py。
sum=0 #初值0
num=0
for num in range(11): #num在1到10范围内逐个取值
sum+=num #累加
print(sum)
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示下面的结果。
>>> = RESTART: …\Samples\ ch05\Python\sam05-008.py
55
嵌套for循环
嵌套循环结构在循环结构的内部又包含有新的循环结构,可以有两层或多层循环。下面用嵌套for循环生成九九乘法表。
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\For循环.xlsm。
Sub Test3()
Dim intI As Integer
Dim intJ As Integer
For intI = 1 To 9
For intJ = 1 To intI
'Trim函数去掉字符串两端的空格
Debug.Print CStr(intJ) & "*" & CStr(intI); "="; Trim(CStr(intJ * intI)); " ";
Next intJ
Debug.Print
Next intI
End Sub
执行程序,在立即窗口中输出九九乘法表。
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
【Python】
本示例的py文件存放路径为Samples\ch05\Python\sam05-009.py。
for i in range(1,10):
s=''
for j in range(1,i+1):
s+=str.format('{1}*{0}={2} ',i,j,i*j)
print(s)
第1行用for循环的迭代变量i在1至9中逐个取值,给出各乘式的第1个因子;第2行对变量s初始化为空字符串,该变量记录一行乘式;第3行用内层for循环的迭代变量在1至i之间逐个取值,作为各乘式的第2个因子,因为在1至i之间取值,最后得到的乘法表是一个下三角的形状;第4行用字符串对象的format函数格式化组装乘式,各乘式之间用空格间隔;第5行输出当前行所有乘式。最后,九九表的所有乘式就是这样一行一行生成的。
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示与Excel VBA代码运行结果相同的九九乘法表。
Python的for…else用法
for循环还提供了一种for…else用法,else中的语句在循环正常执行完时执行。下面判断整数7是不是质数。判断一个整数是否质数的算法是用2到这个整数的区间内的每个数去作为除数去除该整数,如果该整数能被至少一个数整除,那么它不是质数,否则是质数。
本示例的py文件存放路径为Samples\ch05\Python\sam05-010.py。
n= int(input("请输入一个数字:"))
for i in range(2,n):
if n%i==0:
print(str(n)+"不是质数")
break
else:
print(str(n)+"是质数")
第1行用input函数输入一个整数;第2至7行用一个for…else结构判断给定的整数是不是质数。只要出现n能被2至n中的某个数整除的情况就中断循环,输出它不是质数,遍历完后没有出现这种情况,输出它是质数。
在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口提示"请输入一个数字:",输入5,回车,显示下面的结果:
>>> = RESTART: …\Samples\ch05\Python\sam05-010.py
请输入一个数字:5
5是质数
再次运行,输入9,回车,显示下面的结果:
>>> = RESTART: …\Samples\ch05\Python\sam05-010.py
请输入一个数字:9
9不是质数
for循环示例-求给定数据的最大值和最小值
图5-2所示工作表中第1列给定了一组数据,现在计算该组数据的最大值和最小值。
图5-2 求给定数据的最大值和最小值
【Excel VBA】
示例文件的存放路径为Samples\ch05\Excel VBA\求最大值和最小值-For循环.xlsm。
Sub MaxMin()
Dim intI As Integer
Dim sngMax As Single '记录最大值
Dim sngMin As Single '记录最小值
Dim sngT As Single
Dim intRows As Integer
sngMax = ActiveSheet.Cells(1, 1).Value '用第1个值初始化最大值
sngMin = ActiveSheet.Cells(1, 1).Value '用第1个值初始化最小值
'工作表中第1列数据最大行号
intRows = ActiveSheet.Range("A1").End(xlDown).Row
For intI = 2 To intRows '遍历第2到最后一个值
sngT = ActiveSheet.Cells(intI, 1).Value '取第intI个值
If sngT > sngMax Then sngMax = sngT '通过比较,计算当前最大值
If sngT < sngMin Then sngMin = sngT '通过比较,计算当前最小值
Next
ActiveSheet.Cells(2, 4).Value = sngMax '输出结果
ActiveSheet.Cells(3, 4).Value = sngMin
End Sub
执行程序,在工作表中输出给定数据的最大值和最小值,如图5-2所示。
【Python】
本示例的数据文件存放路径为Samples\ch05\Python\求最大值和最小值-For循环.xlsx,py文件保存在相同目录下,文件名为sam05-02.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'\求最大值和最小值-For循环.xlsx',read_only=False)
sht=bk.sheets(1) #获取第1个工作表
#工作表中第1列数据最大行号
rows=sht.api.Range('A1').End(Direction.xlDown).Row
max_v=sht.range('A1').value
min_v=sht.range('A1').value
#遍历数据区域的单元格
for rng in sht.range('A1:A'+str(rows)):
tp=rng.value #获取数据
#如果当前值比最大值大,最大值取当前值
if tp>max_v:max_v=tp
#如果当前值比最小值小,最小值取当前值
if tp<min_v:min_v=tp
#输出结果
sht.cells(2,4).value=max_v
sht.cells(3,4).value=min_v
运行脚本,在工作表中输出给定数据的最大值和最小值,如图5-2所示。