按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
当你的过程需要在一个集合的所有对象或者一个数组的所有元素(数组将在第七章里涉及)之间循
环时,应该使用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里,数组一种特殊的变量,代表拥有相同数据类型(字符串,整型,货币,日期,等等)的一
组相似的数值。两种最通常的数组是一维数组(清单)和二维数组(表格)。有时,一维数组被称
为清单。一维数组或编号清单的例子有:购物清单,星期名称的清单或员工清单。清单里面的每个
值都有一个索引。下面是一个含有六个成员的清单的图解:
项目(1)
项目(2)
项目(3)
项目(4)
项目(5)
项目(6)
注意,列代表一维的当前为空的数组。如果你想用数据填充这个数组,只要使用一个变量名称,附
带括符编号就行,而不需要使用六个不同的标签。在上面的图解里,“项目”一变量名称,括号里
的数字明确数组里的每个成员。
数组的所有成员都必须具有相同的数据类型,换句话说,一个数组不能同时储存字符串和整型数据。
接下来的图解是一维数组的两个例子:第一个叫做cities的一维数组由文本组成(字符串数据类型
——),第二个叫做lotto的一维数组则包含六个抽奖号码(整数数据类型——%)。
一维数组cities (字符串数据类型) 一维数组lotto% (整数数据类型)
Cities(1) Baltimore Lotto(1) 25
Cities(2) Atlanta Lotto(2) 4
Cities(3) Boston