友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
八万小说网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

excel_vba_编程教程(完整版)-第29部分

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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                                Lotto(3)  31  
           Cities(4)  Washington                            Lotto(4)  22  
           Cities(5)  New York                              Lotto(5)  11  
           Cities(6)  Trenton                               Lotto(6)  5  
  
正如你看到的,每个数组成员的内容和变量的数据类型是相匹配的。如果你想要在同一个数组里面 
储存不同数据类型的数据,那么你必须将数据声明为Variant。  
二维数组是由行和列代表的数据表。表中每个成员的位置是由它的行和列号码决定的。下面是一个 
空的二维数组的图解。  
  
     行号  1          2          3           列号  
        1  (1;1)      (1;2)       (1;3)        
        2  (2;1)      (2;2)      (2;3)         
        3  (3;1)      (3;2)      (3;3)         
        4  (4;1)      (4;2)      (4;3)        
        5  (5;1)      (5;2)      (5;3)         
  
注意,二维数组里的项目是如何有行和列索引指定的?在该图解里,数组里的第一个成员位于第一 
行和第一列里(1;1),而最后一个成员则位于第五行和第三列里的(5;3)。下面,我们来给该数组填 
充一些数据。下面显示的二维数组储存了国家名称,它的货币名称以及和美元的汇率。  
Japan         Japanese Yen       128。2  
(1;1)         (1;2)              (1;3)  
Mexico        Mexican Peso       9。423  
(2;1)         (2;2)              (2;3)  
Canada        Canadian Dollar    1。567  
(3;1)         (3;2)              (3;3)  
Norway        Norwegian Krone    8。351  
(4;1)         (4;2)              (4;3)  

                                          123 

… 页面 140…

Hungary       Hungarian Forint   266。7  
(5;1)         (5;2)              (5;3)  
尽管VBA数组最大可以拥有60维,但是,绝大多数人发现非常困难去想象超过三维的数组。三维的 
数组是一个具有相同行数和列数的表格的集合。在三维数组里的每个成员由下面三个数据决定:行 
号,列号和表格号。  
技巧7…1 数组变量是什么?  
数组是拥有共同名称的变量的集合。一个典型的变量只能储存一个数据,然而,一个数组变量却能 
够储存大量的变量。你可以使用变量名称和索引号来指向数组中某个确定的数据。  
技巧7…2 下标变量  
数组变量的括号里的数字成为下标,而每个单独的变量则称为下标变量或成员。例如,cities(6) 
是cities数组里的第六个下标变量(成员)。  

2。声明数组  

因为数组也是变量,所以,你必须用声明其它变量的类似方法声明数组——使用Dim语句。当你声 
明一个数组时,你便设定了该数组储存数据所需要的内存空间。  
我们来看看一个数组声明的例子:  
Dim cities(6) As String   
Dim daysOfWeek(7) As String   
Dim lotto(6) As Integer   
Dim exchange(5; 3) As Variant   
注意,变量名称后面带有括号以及括号里有数字。一维数组要求括号里带一个数字,这个数字决定 
了这个数组能够储存的最大成员数。二维数组后面总是带有两个数字——第一个数字是行索引号, 
而第二个数字是列索引号。在上面的例子里,数组exchange最多可以储存15个数据(5*3=15)。  
数组声明的最后一部份是定义数组将要储存数据的数据类型。数组可以储存下列任何一种数据类 
型:Integer; Long; Single; Double; Variant; Currency; String; Boolean; Byte; or Date。  
当你声明了一个数组,VB会自动占据足够的内存空间,分配的内存空间取决于该数组的大小和数据 
类型。当你声明一个名叫lotto的带有6个成员的一维数组时,VB将留出12个字节——数组的每个成 
员各占2个字节(回想整型数据类型为2个字节,因此2*6=12)。数组越大,储存数据需要的内存空 
间就越大。因为数组会吃掉很多内存,并因此影响你电脑的运行,因此,建议你仅仅根据你可能使 
用的成员数来声明数组。  

3。数组的上界和下界  

VBA默认将数组的第一个成员设置为0(译者:索引号),因此,数字1代表数组中的第二个成员,而 
数字2则代表第三个,等等。因为数字编号起始于0,所以,一维数组cities(6)包含从0到6的七个 
成员。如果你宁愿从1开始计数你数组里的成员,那么你可以使用Option Base 1语句来强制指定该 
数组的下界。该指令必须置于VBA模块任何Sub语句上面的声明部分。如果你不明确Option Base 1, 
那么VBA在使用数组是就会假定使用Option Base 0来从0开始编号你的数组成员。  
你也可以让数组从除0或1之外的数字开始编号,要达到该目的,你在声明数组变量时就必须明确该 
数组的边界。数组的边界是指它最小和最大的索引号。我们来看看下面的例子:  
Dim cities(3 To 6) As Integer   
上面的语句声明了一个带有四个成员的一维数组。数组名称后面括号里的数字明确了数组的下界 
 (3)和上界(6)。该数组的第一个成员编号为3,第二个为4,第三个为5,以及第四个为6。注意 
下界和上界之间的关键字To。  
技巧7…3 数组范围  
Dim语句明确的数组的下标区间就称为数组的范围,例如:Dim mktgCodes(5 To 15)  

4。在 VBA 过程里使用数组  

你声明了数组后,就必须给该数组的每个成员赋值,这也经常成为“填充数组”。我们来尝试使用 
一维数组有规划地显示六个美国城市的清单:  
1。  打开一个新工作簿,并保存为Chap07。xls  
2。  切换到VB编辑器窗口,并重新命名VBA工程为Tables  

                                          124 

… 页面 141…

3。  插入一新模块,重新命名为StaticArrays  
4。  输入下列过程FavoriteCities:  
' start indexing array elements at 1 从1开始给数组成员编号  
Option Base 1   
Sub FavoriteCities()   
'now declare the array   
Dim cities(6) As String   
'assign the values to array elements   
cities(1) = 〃Baltimore〃   
cities(2) = 〃Atlanta〃   
cities(3) = 〃Boston〃   
cities(4) = 〃Washington〃   
cities(5) = 〃New York〃   
cities(6) = 〃Trenton〃   
'display the list of cities   
MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _   
  & cities(3) & Chr(13) & cities(4)
返回目录 上一页 下一页 回到顶部 1 2
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!