第7学时循环代码
如果需要进行相同的操作1 5次,你希望编写同样的代码行1 5次吗?显然答案是否定的,用不着这样做。实际上,用循环语句可用轻而易举地实现:循环运行多次重复相同的代码。在本学时中,将学习D o循环和F o r语句。
本学时的重点包括:
? 实现F o r语句
? 使用D o循环
7.1 For...Next语句
当编写代码时,你会发现经常需要多次重复进行某种操作。在需要重复执行一组语句的次数一定时,可以使用F o r…N e x t循环。F o r…N e x t语句的语法如下:
For c o u n t e r= s t a r t To e n d[Step s t e p]
[s t a t e m e n t s]
[Exit For]
[s t a t e m e n t s]
Next [c o u n t e r]
F o r…N e x t语句执行一定的次数,这取决于s t a r t和e n d参数的设置。c o u n t e r是一个整数变量,每次循环增加1,除非设置了可选参数s t e p,此时c o u n t e r每次以s t e p的数值变化。每次循环都要执行N e x t语句。当c o u n t e r的值大于e n d的数值时,循环结束执行。可选的Exit For语句通常放置在一条I f语句或者Select Case语句中。为了练习使用F o r…N e x t语句,请打开一个新的工作簿,将该工作簿保存为“H o u r7”。按下A l t+F11键打开Visual Basic编辑器。现在完成如下步骤,你将看到一个简单的F o r…N e x t语句例子。
1 )在工程资源管理器中的“T h i s W o r k b o o k”上单击鼠标右键,并选择“插入”、“模块”。
2)插入一个新的名为“B e e p M e”的子程序。这是一个使计算机发出一定次数蜂鸣声的简单过程。
3)为B e e p M e过程输入如下代码:
Dim iCounter As Integer
For iCounter = 1 To 15
B e e p
N e x t
4)按下F 5键运行过程,应当听到很长的蜂鸣声。
如果希望练习使用F o r语句,可以改变语句的执行时间,例如将参数 1 5改为2 5或者5来观察变化。如果查看F o r语句的语法,你会注意到一个可选从句S t e p。这个从句可以控制F o r语句如何计数。例如,可以设定让F o r语句每次计数为5、1 0或者任何你希望的单位。可以通过将s t e p设置为- 1使计数每次递减。按照如下步骤创建一个递减计数的F o r语句:1)插入一个新的名为C o u n t d o w n的子程序,这个过程将显示一系列的消息框以说明F o r语
句和可选的S t e p 从句的用法。
2)为C o u n t d o w n 过程输入如下代码:
Dim iCounter As Integer
For iCounter = 1 To 3
MsgBox"CountUp: "& iCounter
N e x t
For iCounter = 3 To 1 Step - 1
M s g B o x "CountDown: "& iCounter
N e x t
3)运行该过程,将看到第一个消息框,如图7 -1所示。从消息框中可以看到,i C o u n t e r 变量的当前值为1。
4)单击消息框上的“确定”按钮,直到看到如图7
-2所示的消息框,此时i C o
u n t e r 的数值为3。5)单击“确定”按钮,注意计数器的值开始递减。
6)继续单击“确定”按钮对消息框做出响应,直到过程运行完毕。
现在,你对F o r 语句已经有了一定的了解,接下来将创建一个过程用 F o r 语句来计算。如果将钱存放在利息为1 0%的银行,你可以得到多少钱。完成如下步骤:
1)插入一个新的名为“H o w M u c h M o n e y ”的过程。
2)为该过程输入如下代码:
Dim iNumberOfYears As Integer
Dim cSavings As Currency
Dim iCounter As Integer
cSavings = InputBox("Enter amount you are placing in the account: ")
i N u m b e r O f Y ears = InputBox("Enter number of years you are saving the money: ")
For iCounter = 1 To iNumberOfYe a r s
cSavings = cSavings * 1.1
N e x t
MsgBox "In" & iNumberOfYears & "years you 'll have"&_
Format(cSavings, "0.00") & "dollars. "
第7学时循环代码61
图7-1 观察本消息框的文本,可
以看到计数器的数值是1图7-2 在每个消息框显示之前,
计数器不断递增
62中文Excel 2000编程2 4学时教程
3)运行H o w M u c h M o n e y过程。
4)输入1 000作为存钱的数额。
5)输入1 0作为存钱的年数。此时显示一个消息框,消息框中包括了1 0年后你将得到的钱的数额。令人难以置信的是,1 0年后你将获得2 593.74元钱。
6)单击“确定”按钮,退出消息框。
使用变量i N u m b e r O f Y e a r s可控制循环执行的次数,最后的计算结果保存在变量c S a v i n g s中。你可能已经注意到,在H o w M u c h M o n e y过程中F o r m a t语句的用法。语句F o r m a t(c S a v i n g s,"0.00")指定将保存在c S a v i n g中的结果显示两位小数。
在第9学时中,将看到H o w M u c h M o n e y过程被转变为可以在工作表上使用的函数。
7.2 Do循环
只有当需要执行一系列语句的确定次数时,F o r语句才便于使用。为了克服这种局限性,V B A为F o r语句提供了另一种称为D o循环的语句。D o循环是条件循环。共有两种D o循环语句:Do While和Do Until。Do While语句在某个特定的条件为Tr u e时重复执行一组语句,而D o U n t i l则重复执行一组语句直到某个特定的条件变为Tr u e为止。D o循环语句的语法如下:语法1:
Do [{While Until} c o n d i t i o n]
[s t a t e m e n t s]
[Exit Do]
[s t a t e m e n t s]
L o o p
语法2:
Do
[s t a t e m e n t s]
[Exit Do]
[s t a t e m e n t s]
Loop [{While Until} condition]
在D o循环语句的两种语法之间有一个细微的区别。语法1将测试条件放在循环的开始部分,这意味着,如果条件不满足,D o循环中的语句一次都不会执行。而语法2将测试条件放在循环的结束部分,这意味着,D o循环中的语句至少执行一次。在两种语句中,都可以用可选的Exit Do语句在必要的时候退出循环。和Exit For从句一样,通常将Exit Do语句放置在I f或者S e l e c t语句中。
请完成如下步骤,创建一个使用D o循环的过程:
1)插入一个新的名为“E n t e r N a m e”的子程序。该过程将提示用户输入名字,直到用户输入了名字或者选择退出才结束执行。
2)为E n t e r N a m e过程输入如下代码:
Dim sName As String
Dim iResponse As Integer
第7学时循环代码63 SName = " "
Do While sName = " "
sName = InputBox("Please enter your name: ")
If sName = " " Then
iResponse = MsgBox("Do you wish to quit? ", vbYe s N o)
If iResponse = vbYes Then
Exit Do
End If
End If
L o o p
值得提醒的是,当对用I n p u t B o x函数创建的输入框单击“取消”按钮进行响应时,返回值为空字符串。如果对用A p p l i c a t i o n.I n p u t B o x方法创建
的输入框单击“取消”按钮进行响应时,返回值为F a l s e。
3)运行该过程。
4)为了响应消息框,按下空格键或者不在输入框中输入任何字符就单击“取消”按钮,显示一个询问是否希望退出的消息框。
5)单击“否”按钮,再次显示输入框,输入你的名字,过程结束。
在第4学时中,你已经学习了数组的概念。在当时的讨论中,谈到了动态数组。动态数组是大小可变的数组。将动态数组和D o循环结合起来使用非常有用。完成如下步骤,创建一个和D o循环结合使用的动态数组:
1)插入一个新的名为“L i s t O f N a m e s”的过程。该过程将让用户输入名字,直到用户选择不再继续为止。每次用户输入一个新的名字,动态数组都增加一个元素来保存这个名字。
2)为L i s t O f N a m e s过程输入如下代码:
Dim iCount As Integer
Dim sNames () As String
Dim iResponse As Integer
Dim i As Integer
iResponse = vbYe s
Do While iResponse = vbYe s
iCount = iCount + 1
ReDim Preserve sNames(iCount) As String
sNames(iCount) = InputBox("Please enter a name: ")
If sNames (iCount) = " " Then
iResponse = MsgBox("Do you wish to continue?",vbYe s N o)
If iResponse = vbYes Then
sNames(iCount) = InputBox("Please enter a name: ")
End If
End If
L o o p
For i= 1 To iCount-1
MsgBox("Name #" & i & "is" sNames(i))
N e x t
3)运行该过程,显示的第一个消息框如图7 -3所示。
4)输入“B o b ”作为第一个名字并按回车键。
5)输入“M a r y ”作为第二个名字并按回车键。
6)输入“To m ”作为第三个名字并按回车键。
7)单击“取消”按钮,显示一个消息框询问是否希望继续。
8)单击“否”,显示一个包含第一个名字B o b 在内的消息框。
9)单击“确定”按钮,显示名字M a r y 。
1 0)单击“确定”按钮,显示名字To m 。
11)单击“确定”按钮,过程结束。
过程L i s t O f N a m e s 的强大之处在于,在过程开始运行之前,不用知道将要输入多少个名字。完成的过程如程序清单7 -1所示。
程序清单7-1 ListOfNames 过程
1: Sub ListOfNames ()
2: Dim iCount As Integer
3: Dim sNames () As String
4: Dim iResponse As Integer
5: Dim i As Integer
6 :
7: iResponse = vbYe s
8 :
9: Do while iResponse = vbYe s
10: iCount = iCount + 1
11: ReDim Preserve sNames(iCount) As String
12: sNames(iCount) = InputBox("Please enter a name: ")
13: If sNames(iCount) = " "Then
14: iResponse = MsgBox("Do you wish to continue?",vbYe s N o )
15: If iResponse = vbYes Then
16: sNames(iCount) = InputBox("Please enter a name: ")
64中文Excel 2000编程2 4学时教程
图7-3 本输入框将一直显
示,直到选择“取消”
按钮为止
第7学时循环代码65 17: End If
18: End If
19: Loop
2 0:
21: For i = 1 To iCount - 1
22: MsgBox "Name # " & i & "is " & sNames(i)
23: Next
24: End Sub
本过程中首先需要查看的是变量的声明:
Dim iCount As Integer
Dim sNames () As String
Dim iResponse As Integer
Dim i As Integer
变量i C o u n t在D o循环的开始部分不断递增,并且用来控制数组的大小和对数组元素的选择。s N a m e数组是一个动态数组,每次执行D o循环数组大小都会改变。i R e s p o n s e变量跟踪用户是否希望继续输入名字。i R e s p o n s e同时也用来控制循环是否继续执行。整数i用来控制显示名字的F o r语句。声明变量之后,首先应当对i R e s p o n s e变量进行初始化:
iResponse = vbYe s
现在,该变量已经初始化了,接下来开始执行循环语句:
Do While iResponse = vbYe s
因为i R e s p o n s e已经初始化为v b Ye s,所以循环开始执行。循环所做的第一件事是将
i C o u n t加1。循环第一次运行时,i C o u n t的值变为1;第二次运行时,i C o u n t的值变为2;等等。i C o u n t增加后,就可用来重新设置数组s N a m e s的大小。新增加的元素用于保存新的名字:
iCount = iCount +1
ReDim Preserve sNames(iCount) As String
sNames(iCount) = InputBox("Please enter a name: ")
接下来,需要做的是测试用户是否选择了“取消”按钮或者是否忘记了输入一个新的名字:
If sNames(iCount) =" " Then
iResponse = MsgBox("Do you wish to continue? ", vbYe s N o)
If iResponse = vbYes Then
sNames(iCount) = InputBox("Please enter a name: ")
End If
End If
当循环执行完毕后,可以用F o r语句显示用户输入的名字。在F o r语句中,可用语句的计数器使用数组中相应的元素:
For i = 1 To iCount -1
MsgBox "Name # " & i & "is" & sNames(i)
N e x t
注意,F o r语句中的计数器是从i =1到i C o u n t-1,需要将i C o u n t减1,以补偿变量在D o循环顶部的加1。如果希望看到不减1的结果,可以从该语句中删除- 1,并再次运行,你将看到一个多余的显示空名字的消息框。现在你不仅明白了 D o循环的作用,同时也看到了动态数组的作用。
66中文Excel 2000编程2 4学时教程
7.3 学时小结
在本学时中,你学到了V B A中的循环机制。通过使用F o r语句,掌握了如何多次执行相同的语句。通过使用D o循环,掌握了如何有条件地多次执行相同的语句。本学时也扩展了你的有关数组,特别是动态数组的知识。将动态数组和循环结合起来是一种非常有效的创建动态变量的方式。
7.4 专家答疑
问题:使用循环的目的是什么?
解答:是为了多次执行一组语句。
问题:什么时候应该将条件放在D o循环的开始部分,而不是将条件放在 D o循环的结束部分?
解答:通过询问自己循环需要执行的最少次数就可以知道。如果答案是1,那么将条件放在循环的结束部分;如果答案是0,那么将条件放在循环的开始部分。
7.5 课外作业
思考题和练习题是为了使你能够进一步地理解所学内容,答案请参考附录。
7.5.1 思考题
1)V B A中两种主要的循环类型是什么?
2)从循环中跳出来的语句是什么?
3)D o循环的两种类型是什么?
4)判断题:D o循环的条件必须放在循环的开始部分。
7.5.2 练习题
首先,创建一个名为E n t e r H o u r s的过程,用F o r语句让用户输入雇员每周五天的工作时间,并计算出总的工作时间,用消息框显示总的工作时间。
接下来,创建另一个名为S a l a r y的过程。提示用户输入雇员每小时的工资。该公司每小时的最低工资为6元。用D o循环不断显示输入框,直到用户输入了所需的数据。用这些数据根据E n t e r H o u r s计算出来的工作时间算出总的工资,并用消息框显示。
提示:将保存总的工作时间的变量声明为公共变量,先运行E n t e r H o u r s,再运行S a l a r y。