codecamp

VB的Do…While循环语句

VB有两种Do循环语句,只要或者直到某个条件为真,它们就会重复一系列的语句。只要条件为真,Do…While循环就允许你重复某个操作。这个循环的语法如下:

Do While 条件
语句1
语句2
语句N
Loop

当VB遇到这个循环时,它首先条件的真假,如果条件为假,循环内部的语句就不会被执行,VB将继续执行关键字Loop后面的第一条语句。如果条件为真,循环里面的语句则会被一条一条地执行,直到遇到Loop语句。Loop语句告诉VB重复这个过程,只要Do While语句里的条件为真的话。

现在,我们来看看如何在Excel里面好好利用Do…While循环语句。在前面的章节里,你学习了如何根据一个单元格的内容来作决定。让我们再进一步,看看如何在一系列单元格上作同样的决定。该决定是给一列中的非空单元格设置粗体格式。


1.打开一个空工作簿,并且命名为Chap06.xls
2.切换到VB编辑屏幕,并且将新工程改名为Repetition (Chap06.xls)
3.在工程Repetition里插入一新模块,并重命名为DoLoops
4.  输入如下过程:

Sub ApplyBold()
Do While ActiveCell.Value <>""
ActiveCell.Font.Bold = True
ActiveCell.Offset(1, 0).Select
Loop
End Sub

5.  在单元格A1:A7里输入任意数据(文本或数字)


6.  选择单元格A1


7.  选择“工具”-“宏”-“运行宏”。在宏对话框里,双击过程ApplyBold(或者选中该过程然后点击运行)



当运行过程ApplyBold时,VB首先评估Do While语句里的条件——ActiveCell.Value<>””,该条件意思是:只要当前单元格的值不是一个空字符串(””),就执行下列语句。因为你已经在单元格A1里输入了数据并且激活了该单元格(见第六步),第一个测试返回真,所以VB执行语句ActiveCell.Font.Bold = True,它的意思是给当前单元格设置粗体格式。接下来,VB选择了下一行的单元格(参见第二章里的Offset属性)。因为该语句之后就是关键字Loop,VB返回到Do While语句,并且再次检查条件。如果新选中的单元格(当前激活的单元格)不为空,那么VB就会重复循环内部的语句。该过程会继续,直到检查到单元格A8的内容为空,测试条件的结果为假,因此,VB就跳过循环内部的语句。并且在关键字Loop后面没有其它的语句了,所以该过程就结束了。


我们来看看另外一个Do…While循环的例子。是不是很想知道如何在Excel的状态栏里显示今天的日期和时间?这里有个例子,如何让它显示十秒钟:

Sub TenSeconds()
Dim stopme
stopme = Now + TimeValue("00:00:10")
Do While Now < stopme
Application.DisplayStatusBar = True
Application.StatusBar = Now
Loop
Application.StatusBar = False
End Sub

在上面的程序里,只要函数Now返回的时间小于变量stopme的值,Do…While循环里的语句就会被执行。变量stopme储存值为当前时间加上十秒(参见在线帮助里的另外一个使用内置函数TimeValue的例子)。


语句Application.DisplayStatusBar告诉VB打开状态栏的显示,下条语句则是将当前日期和时间放在状态栏上。当显示时间时(只显示10秒)用户无法使用系统(光标变成了沙漏)。十秒钟后(也就是,当条件Now < stopme为真),VB跳出循环并且执行关键字Loop后面的语句,该语句将状态栏返回到默认信息“就绪”。

技巧:什么是循环?
循环是一种导致一部分程序代码重复执行的编程结构。VBA提供了多种结构在你的过程里执行循环:

Do…While, Do…Until, For…Next, For…Each, and While…Wend

Do…While循环还有另外一种语法,你可以在循环的底部测试条件,例如:


Do
语句1
语句2
语句N
Loop While 条件

当你在循环的底部测试条件时,意味着循环里面的语句至少运行了一次。看一下这个例子:


Sub SignIn()
Dim secretCode As String
Do secretCode = InputBox("Enter your secret code:")
If secretCode = "sp1045" Then Exit Do
Loop While secretCode <> "sp1045"
End Sub

注意,在条件被测试之时,VB至少已经执行了一次循环里的语句。除了将条件放在循环之后外,过程SignIn示范如何使用条件跳出循环。当Exit Do语句执行时,循环便立即停止。



技巧:避免无限循环

如果你没有正确地设计你的循环,你将导致一无限循环——永无休止的循环。你将无法使用Esc键来停止该循环。在下面的过程里,因为用户忘了放置测试条件而导致了永无休止的循环:

Sub SayHello()
Do
MsgBox "Hello."
Loop
End Sub
你必须按下Ctrl+Break键(现在,有些电脑使用别的组合键来中断程序。例如手提电脑有的就是Fn+Break)才能终止该无限循环,当VB显示信息“代码执行被中断”时,点击结束以退出过程。


和Case子句一起使用Is的方法
VB的Do…Until和While…Wend循环语句
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }