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

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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里,数组一种特殊的变量,代表拥有相同数据类型(字符串,整型,货币,日期,等等)的一 
组相似的数值。两种最通常的数组是一维数组(清单)和二维数组(表格)。有时,一维数组被称 
为清单。一维�
返回目录 上一页 下一页 回到顶部 赞(0) 踩(0)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!