循环结构.docx
- 文档编号:14421381
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:33
- 大小:36.55KB
循环结构.docx
《循环结构.docx》由会员分享,可在线阅读,更多相关《循环结构.docx(33页珍藏版)》请在冰点文库上搜索。
循环结构
3.3 循环结构
在实际开发的应用系统中,经常需要重复执行一条或多条语句。
这种结构称为循环结构。
循环结构的思想是利用计算机高速处理运算的特性,重复执行某一部分代码,以完成大量有规则的重复性运算。
VBA提供了多个循环结构控制语句:
Do…Loop结构、While…Wend结构、For…Next结构、ForEach…Next结构。
例024 密码验证
1.案例说明
在信息管理系统中,很多时候都需要用户进行登录操作。
在登录操作时要求用户输入密码,一般都要给用户三次机会,每次的输入过程和判断过程都相同。
本例使用Do…Loop循环完成密码验证过程。
2.关键技术
在VBA中,最常用的循环语句是Do…Loop循环。
循环结构DoWhile…Loop的语法格式如下:
DoWhile逻辑表达式
语句序列1
[ExitDo]
[语句序列2]
Loop
其中DoWhile和Loop为关键字,在DoWhile和Loop之间的语句称为循环体。
当VBA执行这个Do循环时,首先判断“逻辑表达式”的值,如果为False(或零),则跳过所有语句,执行Loop的下一条语句,如果为True(或非零),则执行循环体,当执行到Loop语句后,又跳回到DoWhile语句再次判断条件。
在循环体中如果包含有ExitDo语句,当执行到ExitDo语句,马上跳出循环,执行Loop的下一条语句。
其流程图如图3-22所示。
图3-22 DoWhile…Loop流程图
VBA的Do…Loop循环有4种结构,分别如下:
— DoWhile…Loop循环:
先测试条件,如果条件成立则执行循环体。
— Do…LoopWhile循环:
先执行一遍循环体,再测试循环条件,如果条件成立则执行循环体。
— DoUntil…Loop循环:
先测试条件,如果条件不成立则执行循环体。
— Do…LoopUntil循环:
先执行一遍循环体,再测试循环条件,如果条件不成立则执行循环体。
3.编写代码
(1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE开发环境。
(2)单击菜单“插入/模块”命令向工程中插入一个模块。
(3)在模块中编写以下VBA代码:
Sublogin()
DimstrPasswordAsString '保存密码
DimiAsInteger '输入密码的次数
Do
strPassword=InputBox("请输入密码")'输入密码
IfstrPassword="test"Then '判断密码是否正确
ExitDo '退出循环
Else
MsgBox("请输入正确的密码!
")
EndIf
i=i+1
LoopWhilei<3
Ifi>=3Then '超过正常输入密码次数
MsgBox"非法用户,系统将退出!
"
Application.Quit
Else
MsgBox"欢迎你使用本系统!
"
EndIf
EndSub
(4)返回Excel操作界面,在工作表中插入一个按钮,设置提示文字为“密码验证”,并为该按钮指定执行的宏为“login”。
(5)单击“密码验证”按钮,弹出如图3-23所示对话框,输入密码后单击“确定”按钮进行密码的验证。
例025 求最小公倍数和最大公约数
1.案例说明
几个数公有的倍数叫做这几个数的公倍数,其中最小的一个叫做这几个数的最小公倍数。
如12、18、20这三个数的最小公倍数为180。
最大公约数是指某几个整数的共有公约数中最大的那个数。
如2、4、6这三个数的最大公约数为2。
本例使用辗转相除法求两个自然数m、n的最大公约数和最小公倍数。
2.关键技术
本例首先求出两数m、n的最大公约数,再将m、n数的乘积除以最大公约数,即可得到最小公倍数。
求最大公约数的算法流程图如图3-24所示。
图3-24 最大公约数算法流程图
本例使用Do…Loop循环,并且没有设置循环条件。
一般情况下,这种循环是一个死循环(也就是说程序将一直循环下去),因此,在这种循环结构中必须添加一个判断语句,当达到指定的条件时退出循环。
如本例中使用以下语句退出循环:
Ifr=0ThenExitDo
3.编写代码
(1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE环境。
(2)单击菜单“插入/模块”命令向工程中插入一个模块。
(3)在模块中编写以下子过程:
Sub最小公倍数和最大公约数()
DimmAsInteger,nAsInteger
Dimm1AsInteger,n1AsInteger
DimtAsInteger
m=InputBox("输入自然数m:
")
n=InputBox("输入自然数n:
")
m1=m
n1=n
Ifm1 m1=n n1=m'交换m和n的值 EndIf Do r=m1Modn1 Ifr=0ThenExitDo m1=n1 n1=r Loop str1=m&","&n&"的最大公约数="&n1&vbCrLf str1=str1&"最小公倍数="&m*n/n1 MsgBoxstr1 EndSub (4)返回Excel操作环境,向工作表中插入一个按钮,为按钮指定执行上步创建的宏。 (5)单击按钮,弹出如图3-25所示的输入提示框,分别输入两个数后,得到如图3-26所示的结果。 图3-25 输入数据 图3-26 最大公约数和最小公倍数 例026 输出ASCII码表 1.案例说明 目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码。 ASCII码由8位二进制组成,一共可包含256个符号。 本例使用循环语句输出ASCII中的可见字符,如图3-27所示。 图3-27 ASCII码表 2.关键技术 使用Do…Loop循环时,可以不知道循环的具体次数。 如果知道循环的次数,可以使用For…Next循环语句来执行循环。 For循环的语法如下: For循环变量=初始值To终值[Step步长值] 语句序列1 [ExitFor] [语句序列2] Next[循环变量] 在For循环中使用循环变量来控制循环,每重复一次循环之后,循环变量的值将与步长值相加。 步长值可正可负,如果步长值为正,则初始值必须小于等于终值,才执行循环体,否则退出循环。 如果步长值为负,则初始值必须大于等于终值,这样才能执行循环体。 如果没有设置Step,则步长值默认为1。 For…Next循环结构的流程图如图3-28所示。 For循环一般都可计算出循环体的执行次数,计算公式如下: 循环次数=[(终值-初值)/步长值]+1 这里用中括号表示取整。 在事先不知道循环体需要执行多少次时,应该用Do循环。 而在知道循环体要执行的次数时,最好使用For…Next循环。 图3-28 For…Next流程图 3.编写代码 (1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE环境。 (2)单击菜单“插入/模块”命令向工程中插入一个模块。 (3)在模块中编写以下子过程: Subascii() DimaAsInteger,iAsInteger i=3 Fora=32To126 Sheets (1).Cells(i,1)=a Sheets (1).Cells(i,2)=Chr(a) i=i+1 Next EndSub (4)返回Excel操作环境,向工作表中插入一个按钮,为按钮指定执行上步创建的宏。 (5)单击按钮,得到如图3-27所示的结果。 例027 计算选中区域数值之和 1.案例说明 在某些情况下,需要统计工作表中选定区域数值单元格的数值之和(例如,临时查看应发奖金之和),在Excel的状态栏就可查看选中单元格的数值之和。 本例编写VBA代码,使用循环结构来完成该项功能。 2.关键技术 用户在Excel工作表中选定单元格的数量是不固定的,若需统计所选单元格数值之和,这时可使用ForEach循环来进行处理,对选中区域的每个单元格进行判断,然后再累加数值单元格的值。 ForEach…Next循环语句的语法格式如下: ForEach元素In对象集合 [语句序列1] [ExitFor] [语句序列2] Next 使用ForEach循环结构,可在对象集合每个元素中执行一次循环体。 如果集合中至少有一个元素,就会进入ForEach循环体执行。 一旦进入循环,便先针对“对象集合”中第一个元素执行循环中的所有语句。 如果“对象集合”中还有其他的元素,则会针对它们执行循环中的语句,当“对象集合”中的所有元素都执行完了,便会退出循环,然后从Next语句之后的语句继续执行。 在循环体中可以放置任意多个ExitFor语句,随时退出循环。 ExitFor经常在条件判断之后使用,例如If…Then,并将控制权转移到紧接在Next之后的语句。 3.编写代码 (1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE环境。 (2)单击菜单“插入/模块”命令向工程中插入一个模块。 (3)在模块中编写以下子过程: Sub求和() Dimr DimtAsLong ForEachrInSelection IfIsNumeric(r.Value)Then t=t+r.Value EndIf Next MsgBox"所选区域数值之和为: "&t EndSub (4)返回Excel操作环境,向工作表中插入一个按钮,修改按钮的提示字符为“求和”,为按钮指定执行上步创建的宏“求和”。 (5)在工作表“Sheet1”中输入数据,如图3-29左图所示。 (6)拖动鼠标选中如图3-29左图所示数据区域,单击“求和”按钮,求和结果将显示在如图3-29右图所示对话框中。 图3-29 计算选中区域数值之和 例028 换零钱法(多重循环) 1.案例说明 将十元钱换成1角、2角、5角、1元、2元、5元的零钱若干,求出一共有多少种方法进行计算? 2.关键技术 在VBA中,循环结构内的循环体又可以是循环结构,这种情况称为循环的嵌套。 VBA允许在同一过程里嵌套多种类型的循环。 在编写嵌套循环程序的代码时,一定要注意每个循环语句的配对情况。 如图3-30所示,其中左图是正确的嵌套关系,第一个Next关闭了内层的For循环,而最后一个Loop关闭了外层的Do循环。 同样,在嵌套的If语句中,EndIf语句自动与最靠近的前一个If语句配对。 嵌套的Do…Loop结构的工作方式也是一样的,最内圈的Loop语句与最内圈的Do语句匹配。 图3-30右图则是错误的嵌套关系。 语句序列2 图3-30 正确的嵌套(左)与错误的嵌套(右) 3.编写代码 (1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE环境。 (2)单击菜单“插入/模块”命令向工程中插入一个模块。 (3)零钱换法最简单的算法是: 使用多重循环,将10元钱能换成的各种可能都考虑进去(如10可换为100个1角,可换为50个2角,等等)。 根据这种算法在模块中编写以下子过程: Sub换零钱1() DimtAsInteger Fori=0To100 '1角 Forj=0To50 '2角 Fork=0To20 '5角 Forl=0To10 '1元 Form=0To5 '2元 Forn=0To2 '5元 Ifi+2*j+5*k+10*l+20*m+50*n=100Then t=t+1 Sheets (1).Cells(t+1,1)=i Sheets (1).Cells(t+1,2)=j Sheets (1).Cells(t+1,3)=k Sheets (1).Cells(t+1,4)=l Sheets (1).Cells(t+1,5)=m Sheets (1).Cells(t+1,6)=n EndIf Next Next Next Next Next Next MsgBox"10元换为零钱共有"&t&"种方法! " EndSub (4)运行该子过程,Excel工作表中每一行将填写一种可能的换法,如图3-31所示。 (5)因为换零钱的方法很多,根据计算机的速度不同该程序的运行速度也不同,最后将通过对话框显示出总的换法次数,如图3-32所示。 图3-31 零钱换法 图3-32 换法总数 (6)在循环嵌套中,内层循环体执行的次数等各外层循环数数之积,如本例代码内循环执行次数为: 101×51×21×11×6×3=21417858次 (7)对于嵌套循环,一般都可以对代码进行一定的优化,使程序的执行效率更高。 本例最简单的优化代码如下: Sub换零钱2() DimtAsLong Forj=0To50 '2角 Fork=0To20 '5角 Forl=0To10 '1元 Form=0To5 '2元 Forn=0To2 '5元 t2=2*j+5*k+10*l+20*m+50*n Ift2<=100Then t=t+1 i=100-t2 Sheets (1).Cells(t+1,1)=i Sheets (1).Cells(t+1,2)=j Sheets (1).Cells(t+1,3)=k Sheets (1).Cells(t+1,4)=l Sheets (1).Cells(t+1,5)=m Sheets (1).Cells(t+1,6)=n EndIf Next Next Next Next Next MsgBox"10元换为零钱共有"&t&"种方法! " EndSub (8)以上程序中内循环的执行数数如下: 51×21×11×6×3=212058次 可以看出减少最外层循环的101次,可使用内循环体提高100倍的执行效率。 本例程序还有很多优化方法,这里就不再介绍。 3.4 使用数组 在程序中,如果要处理大量的数据,为每个数据定义一个变量将使程序变得很难阅读,并且代码很烦琐。 对于大量有序的数据,可以使用数组对其进行存储和处理。 在其他程序设计语言中,数组中的所有元素都必须为同样的数据类型,在VBA中,数组中各元素可以是相同的数据类型,也可以是不同的数据类型。 例029 数据排序 1.案例说明 在Excel中可以方便地对单元格区域中的数据进行排序。 本例使用VBA程序首先让用户输入10个数据,然后使用冒泡排序法对这10个数进行排序。 2.关键技术 在程序中处理大量数据时,使用数组来保存是比较好的方法。 数组使用之前可以使用Dim、Static、Private或Public语句来声明。 在VBA中,数组最大可以达到60维,最常用的是一维数组和二维数组。 定义一维数组的语法格式如下: Dim数组名([下界To]上界) As数据类型 其中“下界”可以省略,只给出数组的上界(即可以使用的最大下标值),这时默认值为0,即数组的下标从0开始至定义的上界,如: DimMyArray(10)AsString 定义了一个名为MyArray的数组,共有11个元素,分别为MyArray(0)、MyArray (1)、…、MyArray(10)。 如果希望下标从1开始,可以通过OptionBase语句来设置,其语法格式如下: OptionBase1 使用该语句指定数组下标的默认下界,只能设为0或1。 — 该语句只能出现在用户窗体或模块的声明部分,不能出现在过程中,且必须放在数组定义之前。 3.编写代码 (1)新建Excel工作簿,按快捷键“Alt+F11”进入VBE环境。 (2)单击菜单“插入/模块”命令向工程中插入一个模块。 (3)在模块中编写以下代码: OptionBase1 Sub数据排序() DimiAsInteger,jAsInteger Dimk Dims(10)AsInteger Fori=1To10 s(i)=Application.InputBox("输入第"&i&"个数据: ","输入数组",,,,,,1) Next Fori=1To9 Forj=i+1To10 Ifs(i) t=s(i) s(i)=s(j) s(j)=t EndIf Next Next ForEachkIns Debug.Printk Next EndSub 在VBA中使用Inputbox函数接受用户输入数据时,返回的值为文本型。 以上代码中使用了Application对象的InputBox方法来接受用户输入数据,该方法的语法格式如下: Application.InputBox(Prompt,Title,Default,Left,Top,HelpFile,HelpContextID,Type) 设置Type参数可指定返回的数据类型,如本例设置其值为2,则返回的值为数值型。 (4)运行上面的宏,弹出如图3-33所示的对话框,提示用户输入数据。 循环程序要求用户输入10个数据。 (5)最后在“立即窗口”输出排序的结果,如图3-34所示。 图3-33 输入数据 图3-34 排序结果 例030 彩票幸运号码 1.案例说明 本例结合数组和随机函数的知识,生成指定数量的彩票幸运号码。 本例生成的彩票号码每注由7位数构成,首先让用户输入产生的注数,再使用循环语句生成指定注数的号码。 2.关键技术 本例代码中使用了两个关键技术: 动态数组和随机函数。 (1)动态数组 本例使用二维数组保存所有的彩票号码,二维数组的定义格式如下: Dim数组名(第1维上界,第2维上界) As数据类型 或 Dim数组名(第1维下界To第1维上界,第2维下界To第2维上界) As数据类型 在本例中,因为生成的彩票数量是由用户输入的数据决定的。 因此这里使用动态数组。 动态数组是指在程序运行时大小可以改变的数组,定义动态数组一般分两个步骤: 首先在用户窗体、模块或过程中使用Dim或Public声明一个没有下标的数组(不能省略括号),然后在过程中用ReDim语句重定义该数组的大小。 ReDim语句在过程级别中使用,用于为动态数组变量重新分配存储空间。 其语法格式如下: ReDim[Preserve]数组名(下标)[As
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 结构