codecamp

VB的Do…Until和While…Wend循环语句

除了Do...while以外,还有另外一种方便的循环语句Do…Until,也可以让你重复一条或多条语句,直到条件为真。换句话说,Do…Until语句是只要当某个条件为假的时候重复一块代码。这是它的语法:

Do Until 条件
语句1
语句2
语句N
Loop
使用上面的语法,你可以将前面的过程ApplyBold重新写成下面的方式:

Sub ApplyBold2()
Do Until IsEmpty(ActiveCell)
ActiveCell.Font.Bold = True
ActiveCell.Offset(1, 0).Select
Loop
End Sub
该过程的第一条语句意思是执行下列语句,直到遇到第一个空单元格。结果上,如果当前单元格不为空,VB就执行循环内部的那两条语句。只要条件IsEmpty(ActiveCell)测试为假,这个过程就反复继续着。因为过程ApplyBold2在循环的前面就测试条件,如果第一个单元格就为空的话,循环内部的语句就不会运行。


和Do…While循环类似,Do…Until循环也有第二种语法让你在循环的底部测试条件:

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

如果你想要程序至少执行一次,那么就将条件放置于Loop语句一行,无论条件的值是什么。我们来试验一下下面的例子,该例子将工作簿里的空工作表删除。


1.  在你前面创建的DoLoop模块里输入下面的过程DeleteBlankSheets:

Sub DeleteBlankSheets()
Dim myRange As Range
Dim shcount As Integer
shcount = Worksheets.Count
Do
Worksheets(shcount).Select
Set myRange = ActiveSheet.UsedRange
If myRange.Address = "$A$1" And _
Range("A1").Value = "" Then
Application.DisplayAlerts = False
Worksheets(shcount).Delete
Application.DisplayAlerts = True
End If
shcount = shcount - 1
Loop Until shcount = 1
End Sub
2.  手动在当前工作簿里面插入一些工作表。在一个工作表里输入一些数据与单元格A1;另一个工作表的单元格B2和C10里输入一些数据;第三个工作表里不要输入任何数据。


3.  运行过程DeleteBlankSheets。当你运行该过程时,无论何时,只要两个条件都为真——属性UsedRange返回单元格A1并且A1为空,VB就会删除所选的工作表。属性UsedRange应用于对象Worksheet,包含工作表中的每个非空单元格以及他们之间的空单元格。


例如,如果你在单元格B2和C10里输入里东西(包括格式),使用了的区域为$B$2:$C$10。如果你后面又在A1里输入了数据,那么UsedRange将会是$A$1:$C$10。已使用区域是一个从左上角最远的地方到右下角最远的地方包围起来的区域。因为工作簿至少要保留一个工作表,所以代码执行到变量shcount等于1时就停止了。语句shcount = shcount-1确保变量shcount在循环里面的代码每执行一次就减少1。变量shcount的值在过程的开始处用下列语句:Worksheets.Count初始化了。


注意,当删除工作表的时候,Excel通常会显示一个确认对话框,如果你不想看到这个确认提示框的话,就是要下列语句:

Application.DisplayAlerts = False
当你完成任务时,使用下列语句,再打开系统信息。
Application.DisplayAlerts = True

技巧:计数器

计数器是个数字变量,用来追踪已进行的项目次数。上面的过程DeleteBlankSheets声明了变量shcount来追踪检查的工作表个数。计数器变量必须在程序的开始就被初始化(赋值),这可以确保你总能在开始使用之前知道计数器的确切值。计数器可以按照确定的值增加或减少。


观察过程执行
当你使用循环结构运行过程时,有时很难看到该过程会按预期地执行。有时,你很想观察程序慢慢地运行,这样你就能够检查该程序的逻辑。我们来看看VB如何让你一行接一行地执行程序。


1.  在单元格区域A1:A5里面输入任何数据
2.  选择单元格A1
3.在Excel窗口,选择“工具”-“宏”-“运行宏”
4.  在宏对话框里,选择ApplyBold2并点击“单步执行”按钮。VB编辑屏幕将出现,过程的名称被黄色加亮(参加图6-1)。注意代码窗口左边的黄色箭头。



图6-1 观察程序一行接一行地执行


5.  使VB窗口缩小一些,可以点击VB标题栏的“还原”按钮缩小窗口
6.按下F8,黄色加亮区将跳到DoUntil IsEmpty(ActiveCell)行
7.继续按F8,同时观察代码和工作表窗口


While…Wend 循环

While…Wend循环功能上和Do…While循环一样,它是从Microsoft Basic的早期版本遗留下来的并且VBA保留它也是为了支持兼容性。该循环以关键字While开始以关键字Wend结束。这是它的语法:
While 条件
语句1
语句2
语句N
Wend
条件在循环的上面就被测试,只要提供的条件为真,这些语句就会被执行。一旦条件为假,VB就将退出该循环。我们来看一个使用While…Wend循环结构的过程:


1.  在当前工程里插入一新模块,重命名为WhileLoop
2.  输入下述过程:

Sub ChangeRHeight()
While ActiveCell <>""
ActiveCell.RowHeight = 28
ActiveCell.Offset(1, 0).Select
Wend
End Sub
3.  在单元格区域B1:B4里输入一些数据
4.  选择单元格B1并且运行过程ChangeRHeight。当当前单元格不为空时,上面的过程ChangeRHeight将设置行高位28。


VB的Do…While循环语句
VB的For…Next循环语句
温馨提示
下载编程狮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; }