excel_vba_编程教程(完整版)-第37部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
何循环你的代码。
1。Do Loops: Do…While 和 Do…Until
VB有两种Do循环语句,只要或者直到某个条件为真,它们就会重复一系列的语句。只要条件为真,
Do…While循环就允许你重复某个操作。这个循环的语法如下:
Do While 条件
语句1
语句2
语句N
Loop
当VB遇到这个循环时,它首先条件的真假,如果条件为假,循环内部的语句就不会被执行,VB将继
续执行关键字Loop后面的第一条语句。如果条件为真,循环里面的语句则会被一条一条地执行,直
到遇到Loop语句。Loop语句告诉VB重复这个过程,只要Do While语句里的条件为真的话。
现在,我们来看看如何在Excel里面好好利用Do…While循环语句。在第四章里,你学习了如何根据
一个单元格的内容来作决定。让我们再进一步,看看如何在一系列单元格上作同样的决定。该决定
是给一列中的非空单元格设置粗体格式。
114
… 页面 131…
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后面的语句,该语句将状态栏
返回到默认信息“就绪”。
技巧6…1 什么是循环?
循环是一种导致一部分程序代码重复执行的编程结构。VBA提供了多种结构在你的过程里执行循环:
Do…While; Do…Until; For…Next; For…Each; and While…Wend
Do…While循环还有另外一种语法,你可以在循环的底部测试条件,例如:
Do
语句1
语句2
语句N
Loop While 条件
当你在循环的底部测试条件时,意味着循环里面的语句至少运行了一次。看一下这个例子:
115
… 页面 132…
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语句执行时,循环便立即停止。
技巧6…2 避免无限循环
如果你没有正确地设计你的循环,你将导致一无限循环——永无休止的循环。你将无法使用Esc键
来停止该循环。在下面的过程里,因为用户忘了放置测试条件而导致了永无休止的循环:
Sub SayHello()
Do
MsgBox 〃Hello。〃
Loop
End Sub
你必须按下Ctrl+Break键(译者:现在,有些电脑使用别的组合键来中断程序。例如我的手提电脑
就是Fn+Break)才能终止该无限循环,当VB显示信息“代码执行被中断”时,点击结束以退出过程。
另外一种方便的循环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 = Worksheetsunt
Do
116
… 页面 133…
Worksheets(shcount)。Select
Set myRange = ActiveSheet。UsedRange
If myRange。Address = 〃A1〃 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里输入里东西(译者:包括格式),使用了的区域为B2:C10。如果你后面又在A1
里输入了数据,那么UsedRange将会是A1:C10。已使用区域是一个从左上角最远的地方到
右下角最远的地方包围起来的区域。因为工作簿至少要保留一个工作表,所以代码执行到变量
shcount等于1时就停止了。语句shcount = shcount…1确保变量shcount在循环里面的代码每执
行一次就减少1。变量shcount的值在过程的开始处用下列语句:Worksheetsunt初始化了。
注意,当删除工作表的时候,Excel通常会显示一个确认对话框,如果你不想看到这个确认提
示框的话,就是要下列语句:
Application。DisplayAlerts = False
当你完成任务时,使用下列语句,再打开系统信息。
Application。DisplayAlerts = True
技巧6…3 计数器
计数器是个数字变量,用来追踪已进行的项目次数。上面的过程DeleteBlankSheets声明了变量
shcount来追踪检查的工作表个数。计数器变量必须在程序的开始就被初始化(赋值),这可以确保
你总能在开始使用之前知道计数器的确切值。计数器可以按照确定的值增加或减少。参见本章后面
的使用计数器的For…Next循环。
2。观察过程执行
当你使用循环结构运行过程时,有时很难看到该过程会按预期地执行。有时,你很想观察程序慢慢
地运行,这样你就能够检查该程序的逻辑。我们来看看VB如何让你一行接一行地执行程序。
1。 在单元格区域A1:A5里面输入任何数据
2。 选择单元格A1
3。 在Excel窗口,选择“工具”…“宏”…“运行宏”
4。 在宏对话框里,选择ApplyBold2并点击“单步执行”按钮。VB编辑屏幕将出现,过程的名称被
黄色加亮(参加图6…1)。注意代码窗口左边的黄色箭头。
117
… 页面 134…
图6…1 观察程序一行接一行地执行
5。 使VB窗口缩小一些,可以点击VB标题栏的“还原”按钮缩小窗口
6。 按下F8,黄色加亮区将跳到DoUntil IsEmpty(ActiveCell)行
7。 继续按F8,同时观察代码和工作表窗口
3。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。
118
… 页面 135…
4。For…Next 循环
当你知道你需要重复运行多少次某段语句时,可以使用For…Next语句。它的语法如下:
For 计数器 = 开始 To 结束 '步长'
语句1
语句2
语句N
Next '计数器'
括号里面的代码是可选的。计数器是个储存反复次数的数字型变量,开始是你期望的起始计数点,
结束则表明循环应该执行多少次。
例如,你想要重复执行循环里的语句5次,使用下述For语句:
For counter = 1 To 5