按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
结束则表明循环应该执行多少次。
例如,你想要重复执行循环里的语句5次,使用下述For语句:
For counter = 1 To 5
你的语句
Next
当VB遇到关键字Next时,它将回到循环的开始处,并且再次执行循环里面的代码,直到计数器到达
结束值。一旦计数器的值大于关键字To后面的数值,VB就会跳出循环。因为计数器变量在每次执行
循环后会自动地变化,它早晚会超出结束的值。每次VB执行循环里的语句后,变量计数器的值会默
认地增加1,你可以使用Step语句来改变这个默认设置。例如,要使计数器每次增加3,就可以使用
以下语句:
For counter = 1 To 5 Step 3
你的代码
Next counter
当VB遇到上面的语句,它会执行循环里的语句两次。在第一次的循环里,counter等于1,第二次则
等于4(3+1)。在执行两次循环后,counter就等于7(4+3),这导致VB退出该循环。
注意,步长(Step)是可选的。可选语句总是显示则方括号里面(参加本段开头部分的语法)。步
长不需要明确,除非它不等于1。你可以在Step后面放个负值作为步长,那么VB每次遇到关键字Next
后都会将计数器减小。
关键字Next后面的变量名称(counter)也是可选的,然而,好的编程习惯是要强制在关键字Next
后面加上计数器。
如何将For…Next循环使用在Excel里面呢?假使你只想要在你的销售报告里面包括某几个特定月
份的产品销售,当你从Access导入数据时,你同样也会将那些销售额为0的数据行一起导入。你如
何快速取出数据为0的行呢?尽管,有很多种方法可以解决这个问题,但是,我们来看看如何使用
For…Next循环来处理这个问题吧。
1。 在VB窗口,在当前工程里插入一个模块并且命名为ForNextLoop
2。 在ForNextLoop模块里输入下列过程:
Sub DeleteZeroRows()
Dim totalR As Integer
Dim r As Integer
Range(〃A1〃)。CurrentRegion。Select
totalR = Selection。Rowsunt
Range(〃B2〃)。Select
For r = 1 To totalR…1
If ActiveCell = 0 Then
Selection。EntireRow。Delete
totalR = totalR – 1
Else
ActiveCell。Offset(1; 0)。Select
End If
Next r
End Sub
3。 切换到Excel界面,并且准备下述表格:
119
… 页面 136…
A B
1 Product Name Sales (in Pounds)
2 Apples 120
3 Pears 0
4 Bananas 100
5 Cherries 0
6 Blueberries 0
7 Strawberries 160
4。 运行过程DeleteZeroRows。
我们来一行接一行地检查一下过程DeleteZeroRows。开始两语句计算当前区域的总行数,并且将该
值储存于变量totalR,接下来,VB选择单元格B2然后遇到关键字For。因为电子表格的第一行包含
了列标题,所以要从总行数里减掉1(totalR…1)。VB将需要执行循环里面的指令6次。
嵌套在循环里面的条件语句(If…Then…Else)告诉VB根据当前活动单元格的值作出决定。如果该
值为0,VB就删除当前行,并且将总行数减掉1。否则,条件为假,因此,VB将选择下一行的单元格。
VB每完成一次循环,它就跳到关键字For来比较r的值和totalR…1的值。当过程结束后,销售表里就
不会包含没有销售的产品了。
技巧6…4 成对语句
For和Next必须是成对的,如果有一个漏掉了,VB就将产生一个错误信息“For没有Next”
5。For Each…Next 循环
当你的过程需要在一个集合的所有对象或者一个数组的所有元素(数组将在第七章里涉及)之间循
环时,应该使用For Each…Next循环。该循环不需要计数器变量,VB自己知道应该执行几次循环。
我们拿工作表集合作个例子,要删除工作簿里面的工作表,你首先不得不要选择它,再选择“编辑”
…“删除工作表”。如果要只留一个工作表在工作簿里面的话,你就不得不使用同样的命令,次数取
决于工作表的总数。因为每个工作表都是工作表集合里的一个对象,所以使用For Each…Next循环
来加速删除工作表。该循环的形式是:
For Each 元素 In 组合
语句1
语句2
语句N
Next '元素'
在上面的语法中,元素一个数组或者集合的所有元素都将被赋予的变量,如果是数组的话,该变量
必须为Variant数据类型;如果是集合的话,则必须是个对象数据类型。组合是集合的名称或者数
组的名称。
现在,我们来使用For Each…Next循环删除工作表。
1。 在当前工程里插入新模块并且重命名为ForEachNextLoop
2。 在模块ForEachNextLoop里输入下列过程:
Sub RemoveSheets()
Dim mySheet As Worksheet
Application。DisplayAlerts = False
Workbooks。Add
Worksheets(〃Sheet2〃)。Select
For Each mySheet In Worksheets
ActiveWindow。SelectedSheets。Delete
Next mySheet
End Sub
3。 运行过程RemoveSheets。
VB将会打开一个新工作簿并且删除除Sheet1之外的所有工作表。注意,变量mySheet代表工作表集
合里的所有对象。除了按通常的方法将对象变量声明为Object类型,你还可以将它声明为更具体的
120
… 页面 137…
对象类型,这样会更好。在这个具体的例子里,你可以使用下面的声明:
Dim mySheet As Worksheet
而不是:
Dim mySheet As Object
第一条指令Application。DisplayAlerts = False让Excel在过程运行的时候不要显示警告和信息。
如果你忽略了它,Excel将会要你确认是否删除所选的工作表。接下来,过程打开一个新工作簿并
且选择Sheet2。For Each…Next循环遍历每个工作表(从所选的Sheet2开始)并且删除它们。当过
程结束的时候,该工作簿只剩一个工作表Sheet1了。
这里是另外一个检查某个工作表是否存在于一工作簿中:
Sub IsSuchSheet()
Dim mySheet As Worksheet
Dim counter As Integer
counter = 0
For Each mySheet In Worksheets
If mySheet。name = 〃Sheet2〃 Then
counter =counter + 1
End If
Next mySheet
If counter = 1 Then
MsgBox 〃This workbook contains Sheet2。〃
Else
MsgBox 〃Sheet2 was not found。〃
End if
End Sub
7。提前跳出循环
有时候,你并不想等到循环自己结束,可能是用户输入了错误的数据,过程遇到了错误或者可能是
任务已经完成并且没有必要作更多的循环。你可以提前跳出循环,而不必等到条件正常结束。VB
有两种Exit语句:
下面的过程示范如何使用Exit For语句提前跳出For Each…Next循环:
1。 在当前模块里输入下列过程:
Sub EarlyExit()
Dim myCell As Range
For Each myCell in Range(〃A1:H10〃)
If myCell。Value = 〃〃 Then
myCell。Value = 〃empty〃
Else
Exit For
End If
Next myCell
End Sub
EarlyExit过程检查特定区域A1:H10里每个单元格的内容,如果当前单元格为空,VB就会在当前单
元格力输入文本“empty”。当VB遇到第一个非空单元格,它就会跳出循环。
2。 打开一个新工作簿并且在单元格区域A1:H10的任意单元格里输入数据
3。 运行过程EarlyExit
技巧6…5 退出过程
如果你想提前退出子过程,那么可以使用Exit Sub语句。如果该过程是一个函数的话,就使用Exit
Function语句代替就行。
121
… 页面 138…
8。循环嵌套
到目前为止,你已经在本章里尝试了很多种循环了,每种过程示范每个循环结构的使用。然而,在
编程中,一循环总是放在另外一循环中的。VB允许你将不同类型的循环(For和Do循环)“嵌套”在
同一个过程里。当你编写循环嵌套时,请确保每个内部的循环在外部循环里面已经完成。另外,每
个循环都必须有其自己独特的计数器变量。如果使用循环嵌套,你可以更有效地执行特定的任务。
下面显示的过程ColorLoop示范如何嵌套一个For…Next循环在另一个For…Next循环里面:
Sub ColorLoop()
Dim myRow As Integer
Dim myCol As Integer
Dim myColor As Integer
myColor = 0
For myRow = 1 To 8
For myCol = 1 To 7
Cells(myRow; myCol)。Select
myColor = myColor + 1
With Selection。Interior
lorIndex = myColor
。Pattern = xlSolid
End With
Next myCol
Next myRow
End Sub
上面的过程ColorLoop使用了两个For…Next循环来改变工作表中前面八行和七列里的每个单元格
的颜色。当外部的循环在追踪行号的时候,内部的循环在做更多的事情,它首先确定当前的列号,
基于当前的行号的列号选择适当的单元格,然后给所选的单元格设置颜色。
内部的For…Next循环给工作表的第一行的七个单元格(A1; B1; C1; D1; E1; F1和G1)设置不同
的颜色。当变量myCol大于7时,VB跳回外部循环并且变量myRow增加1,再回到内部循环去设置下一
行单元格的颜色。当过程结束时,56个单元格(8*7)被设置了当前调色板上可用的所有颜色。第
一个单元格,A1,被设置了黑色(颜色索引号为1),第二个单元格B1则被设置为白色了(颜色索引
号为2)。每次单元格地址变化——Cells(myRow; myCol)。Select——变量myColor的内容也会改变
——myColor = myColor + 1
9。接下来…
在本章里,你学习了如何在循环里重复一组代码。通过使用好几种类型的循环,你看到了每种循环
稍稍不同地进行重复。你有了经验后,你将更容易地选择合适的控制结构来执行你的任务。
在本书的后续章节中,将会有更多的使用循环的例子。例如,在下章里,你将看到如何使用数组合
嵌套的循环来创建一个VBA过程,该过程将帮你选择彩票号码。在下章里,你将学习如何处理大量
的数据,而不会迷失在变量的海洋里。
第七章 利用 VBA 数组管理数据清单和表格
作者:Julitta Korol 翻译:Tiger Chen Feb 1’ 2005
在前面的章节里,你在很多VBA过程里使用变量来储存特定的对象信息,属性或者数值。对于你想
要处理的单个数值,你可以声明变量,但是,对于一系列的数值呢?如果你不得不编写VBA过程来
处理大量的数据,你就得声明足够的变量来处理所有的数据。你能想象将世界上所有国家的货币交
换利率储存在你的程序的噩梦吗?要创建一个表格来储存这些必要的数据的话,你至少要给每个国
家创建三个变量:国家名称,货币名称和交换比率。幸运的是,VB有方法来解决该问题。将相关的
变量归为一类,你的VBA过程可以轻松处理大量的数据。在本章里,你将学习如何使用数组来操作
数据清单和数据表。
122
… 页面 139…
1。了解数组
在VB里,数组一种特殊的变量,代表拥有相同数据类型(字符串,整型,货币,日期,等等)的一
组相似的数值。两种最通常的数组是一维数组(清单)和二维数组(表格)。有时,一维数组被称
为清单。一维�