当前位置:文档之家› VBA编程24学时教程007

VBA编程24学时教程007

第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。

相关主题
文本预览
相关文档 最新文档