《excel_vba_编程教程(完整版)》

下载本书

添加书签

excel_vba_编程教程(完整版)- 第41节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
  Case Else   
       MsgBox 〃The number is between 12 and 99。〃   
End Select   
假设变量myNumber为120,那么第三个Case子句为真,并且只有Case Is 》=100和Case Else之间的 
语句会被执行。  

                                           112 

… 页面 129…

9。确定 Case 子句里数值的范围  

在前面的例子里,你看到了在每个Case子句里使用一个简单表达式。然而,很多时候,你可能需要 
在Case子句里确定一个数值范围。可以通过关键字To用于表达式的数值之间来实现它,如下所示:  
Select Case unitsSold   
  Case 1 to 100   
       Discount = 0。05   
  Case Is 1000   
       Discount = 0。2   
End Select   
我们来分析一下上面的Select Case代码块,假设变量unitsSold当前值为99。VB将变量unitsSold 
的值与Case子句的条件表达式进行比较。第一和第三条Case子句示范如何通过使用关键字To在条件 
表达式里使用数值范围。因为unitsSold=99,第一个Case子句里的条件表达式为真,因此,VB将0。05 
赋给变量Discount。第二个Case子句如何呢?它也为真。尽管,很明显99小于等于500,VB不会执 
行相关的语句Discount=0。1。原因是,一旦VB找到了一个真条件的Case子句,它就不会去管其它的 
Case子句,它将跳过那些代码,继续执行End Select语句后面可能有的语句。  
我们来练练使用Select Case语句,在函数过程里使用它。回想在第四章里,函数过程允许你将结 
果返回给一个子过程。假设该子过程必须根据销售的套数来显示一个折扣,你可以从用户那里获得 
销售套数,然后允许一个函数来确定需要的折扣:  
1。  在模块SelectCase里输入下列子过程:  
Sub DisplayDiscount()   
  Dim unitsSold As Integer   
  Dim myDiscount As Single   
  unitsSold = InputBox(〃Enter the number of sold units:〃)   
  myDiscount = GetDiscount(unitsSold)   
  MsgBox myDiscount   
End Sub   
2。  输入下列函数过程:  
Function GetDiscount(unitsSold As Integer)   
  Select Case unitsSold   
     Case 1 To 200   
       GetDiscount = 0。05   
     Case Is 1000   
       GetDiscount = 0。2   
  End Select   
End Function   
3。  将光标放在过程DisplayDiscount的任意地方并且按下F5来运行它。  
过程DisplayDiscount将储存于变量unitsSold的值传递给函数GetDiscount。当VB遇到Select Case 
语句时,它检查第一个Case子句里的值是否合储存于unitsSold里面的值是否匹配。如果匹配,VB 
给函数名称赋值百分之五(0。05),并且跳到关键字End Select。因为,在函数过程里面没有更多需 
要运行的语句,VB就返回主调过程——DisplayDiscount,在这里,它将函数的结果赋予变量 
myDiscount。最后的语句用信息框来显示获得的折扣。  

                                           113 

… 页面 130…

10。在 Case 子句里确定多个表达式  

你可以使用逗号明确单一Case子句里的多个表达式:  
Select Case myMonth   
  Case 〃January〃; 〃February〃; 〃March〃   
       Debug。Print myMonth & 〃: 1st Qtr。〃   
  Case 〃April〃; 〃May〃; 〃June〃   
       Debug。Print myMonth & 〃: 2nd Qtr。〃   
  Case 〃July〃; 〃August〃; 〃September〃   
       Debug。Print myMonth & 〃: 3rd Qtr。〃   
  Case 〃October〃; 〃November〃; 〃December〃   
       Debug。Print myMonth & 〃: 4th Qtr。〃   
End Select   
技巧5…7 Case子句的多个条件  
用来分隔开Case子句里面多个条件的逗号,和用于If语句里的运算符OR意义一样。只要这些条件有 
一个为真,Case子句就为真。  

11。接下来…  

在本章介绍的条件语句,让你控制你的过程走向。通过测试条件的真假,你可以决定哪些语句需要 
执行,哪些要跳过。换句话说,不必从上到下,一行一行地运行你的过程,你可以只执行某些行, 
如果你犹豫应该使用哪种条件语句,这里是一些指南:  
    更灵活并且更容易理解。  
有些决定是需要重复的,例如,你可能需要在工作表里的每个单元格里或者一个工作簿里的每个表 
里重复同样的操作。下章将教你如何一次又一次地做同样的操作。  

                                第六章 在 VBA 中重复操作  

作者:Julitta Korol      翻译:Tiger Chen Feb 1’ 2005  
既然你已经学习了条件语句如何赋予你的VBA过程作决定的能力,是时候深入了。不是所有的决定 
都容易,有时候你将需要运行一些语句好几次才能达到某个条件。然而,另一方面,当你达到这个 
决定后,你可能需要一直运行某些语句,只要条件为真,或直到条件变为真。在编程中,重复地执 
行任务被称为循环。VBA有好些个循环结构,允许你多次重复一系列的语句。你将在本章里学习如 
何循环你的代码。  

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显示信息“代码执行
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架