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

下载本书

添加书签

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


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
Range(〃B6〃)。Formula = Cost  
3。  将语句Range(〃B5〃)。Formula = slsPrice * slsTax改为下面指令:  
Range(〃B5〃)。Formula = Format((slsPrice * slsTax); 〃0。00〃)  
4。  重新运行修改后的程序  
试验过程CalcCost之后,你可能会困惑,为什么我们要为声明变量烦恼,如果VB自己可以处理未声 
明的变量的话?因为过程CalcCost是如此之短,因此你不必担心VB每次使用这些Variant变量时会 
占用多少内存。然而,在短的过程中,内存问题不重要,但是当你输入变量名称时,你很可能出现 
错误。当你第二次使用Cost变量时,你忽略了“o”而写成“Cst”,后果会如何呢?  
Range(〃B6〃)。Formula = Cst  
如果你使用了Tax在下面的公式中,而没有用slsTax,结果你将得到什么呢?  
Cost = Format(slsPrice + (slsPrice * Tax); 〃0。00〃)  
引入上面提及的错误后过程CalcCost的结果显示在图3-2。  

                                         
图3-2 变量名称错误导致结果错误  
注意,在图3-2里,单元格B6没有数值,因为VB没有找到变量Cst的任务语句。再因为VB不知道销 
售税,显示的计算器价格为总价(而没有加税金,见单元格A8)。VB不会猜测,它只是简单地做你 
告诉它的事情。这带我们到下一个部分,解释如何避免这类错误。在你继续之前,确保更正变量Cst 
和Tax为Cost和slsTax。  

8 强制声明变量  

VB使用Option Explicit语句自动提醒你正式地声明你的变量,这个语句必须放在每个模块的最上 
面。如果你试图运行一个含有未定义的变量的过程时,Option Explicit语句会让VB产生一个错误 
信息。  
1。  返回代码窗口你输入过程CalcCost的地方  
2。  在模块的最上面输入Option Explicit并回车,Excel将该语句显示为蓝色  
3。  运行过程CalcCost,VB显示错误信息“编译错误:变量未定义”  
4。  点击确定关闭信息框。  
    VB加亮变量名称slsPrice。现在你需要正式声明这个变量。当你声明了变量slsPrice并再次运 
    行该过程时,VB一旦遇到另外一个未声明的变量时,将再次产生同样的错误。  
5。  在CalcCost过程的开始部分输入下述声明:  
     'declaration of variables (声明变量)  
     Dim slsPrice as Currency   
     Dim slsTax as Single   

                                           75 

… 页面 92…

     Dim Cost as Currency   
     Dim strMsg as String  
6。  按下F5来运行该过程,修改后的程序显示如下“  
Option Explicit   
Sub CalcCost()   
'declaration of variables   
       Dim slsPrice As Currency   
       Dim slsTax As Single   
       Dim Cost As Currency   
       Dim strMsg As String   
       slsPrice = 35   
       slsTax = 0。085   
       Range(〃A1〃)。Formula = 〃The cost of calculator〃   
       Range(〃A4〃)。Formula = 〃Price〃   
       Range(〃B4〃)。Formula = slsPrice   
       Range(〃A5〃)。Formula = 〃Sales Tax〃   
       Range(〃A6〃)。Formula = 〃Cost〃   
       Range(〃B5〃)。Formula = Format((slsPrice * slsTax); 〃0。00〃)   
       Cost = Format(slsPrice + (slsPrice * slsTax); 〃0。00〃)   
       With Range(〃B6〃)。Formula = Cost   
       strMsg = 〃The calculator total is 〃 & 〃〃 & Cost & 〃。〃   
       Range(〃A8〃)。Formula = strMsg   
End Sub   
在模块上面输入的Option Explicit语句强迫你声明变量,因为如果你需要声明变量的话,你必须 
每次在添加新模块时输入Option Explicit语句,所以你可以让VB帮你输入它。按照下述步骤来自 
动在新模块里添加Option Explicit语句:  
1。  选择“工具”-“选项”  
2。  确保选项对话框(编辑器页)上的“要求变量声明”被勾选上了  
3。  点击确定关闭对话框  
从现在开始,每个新模块都会在第一行添加Option Explicit语句。如果你要在一起创建的模块里 
强制声明变量的话,你必须手动输入Option Explicit。  
技巧3-10 Option Explicit更多信息  
Option Explicit强迫正式(显式)声明模块里的所有变量。使用它的一个重大优点是,输入错误 
会在编译时(VB试图将源代码翻译为可执行代码)被检测到。Option Explicit语句必须在模块里 
的任何过程之前出现。  

9 了解变量范围  

不同的变量在VBA过程里有不同的影响范围。Scope(范围)这个术语定义某个特定的变量在同一个 
过程,其它过程,或者其它VBA工程里的可用性。变量在VBA里可以是下面三种级别的范围:  

10 过程级别(当地)变量  

从本章起,你已经知道如何通过关键字Dim来声明变量,在关键字Dim在模块中的位置决定了该变量 
的范围。在VBA过程中用Dim关键字声明的变量拥有过程级别的范围,过程级别的变量经常被称为当 
地变量。当地变量只能使用在声明它的过程里面。未声明的变量总是过程级别的变量。在它的范围 
内,变量的名称必须是唯一的,这意味着你不可以在同一个过程里使用同样的名称来声明两个变量。 
然而,你可以在不同的过程里面使用同样的变量名称。换句话说,过程CalcCost里可以有slsTax 
变量,同一个模块里的过程ExpenseRep里页可以有它自己的变量slsTax,两个变量相互独立。  

                                           76 

… 页面 93…

11 模块级别变量  

当地变量有助于节省电脑内存,一旦该过程结束,该变量便立即消失,并且电脑释放该变量占用的 
内存空间。然而,在编程中,你经常需要变量在本过程结束后仍然在其它过程里可用,这种情形需 
要你改变变量的范围。你可能就需要定义一个模块级别的变量,而不是过程级别的了。要定义模块 
级别的变量的话,你必须将关键字Dim放在模块表里任何过程的上面(紧接着在关键字Option  
Explicit的下面)。例如,将slsTax设置为任何Variables模块里的过程都可以使用,按照下述方法 
声明slsTax变量:  
Option Explicit   
Dim slsTax As Single   
Sub CalcCost( )   
          
End Sub   
在上面的例子里,关键字Dim在模块的上面,紧挨着Option Explicit语句。你需要另外一个过程来 
使用变量slsTax,这样你才能查看这是如何工作的。  
1。  在代码窗口里,将变量声明行Dim slsTax As Single从Variables模块的CalcCost过程里剪切, 
    并且粘贴到该模块的上面Option Explicit语句的下面  
2。  在CalcCost过程的同一个模块里输入ExpenseRep过程代码:  
Sub ExpenseRep()   
     Dim slsPrice As Currency   
     Dim Cost As Currency   
     slsPrice = 55。99   
     Cost = slsPrice + (slsPrice * slsTax)   
     MsgBox slsTax   
     MsgBox Cost   
End Sub  
ExpenseRep过程里声明了两个货币类型的变量:slsPrice和Cost。slsPrice变量随后赋值55。99, 
slsPrice和CalcCost过程里声明的变量slsPrice是独立工作的。ExpenseRep过程计算采购的费用, 
该费用包括销售税,因为销售税和CalcCost过程里使用的是一样的,所以将slsTax变量声明为模块 
级别的变量。VB执行CalcCost过程后,变量slsTax的内容等于0。085。如果slsTax是当地变量的话, 
随着CalcCost过程的终结,变量slsTax的内容将被清空。过程ExpenseRep结束时显示两个信息框来 
输出变量slsTax和Cost的值。当你运行CalcCost后,VB清空除了slsTax之外的所有变量的内容,因 
为slsTax以被定义为模块级别的变量。一旦你试图通过运行ExpenseRep来计算价格,VB就会找到 
slsTax的值,并且将它用到计算中。  
技巧3-11 私有变量  
当你在模块级别声明变量时,除了关键字Dim之外,你还可以使用关键字Private。例如,  
Private slsTax As Single  
私有变量仅仅在声明该变量的模块里的过程中可用。私有变量总是在模块的上面Option Explicit 
语句之后声明。  
技巧3-12 保持工程级别的变量为私有  
为了避免工程级别的变量内容被工程之外使用,你可以在Option Explicit语句下面,模块的上面 
输入Option Private Module,例如:  
Option Explicit   
Option Private Module   
Public slsTax As Single   
Sub CalcCost( )   
          
End Sub  

12 工程级别变量  

模块级别的变量用关键字Public(而不是Dim)声明时,拥有工程级别范围。这意味着它们可以在 

                                          77 

… 页面 94…

VBA任何模块里使用。当你想要在一个打开的VBA工程的所有过程里使用某个变量时,必须用Public 
关键字来声明它,例如:  
Option Explicit   
Public slsTax As Single   
Sub CalcCost( )   
          
End Sub   
注意,变量slsTax在模块上面以Public关键字声明的,它将会在该VBA工程里的任何过程里都可用。  

13 变量的存活期  

除了范围之外,变量还有存活期,变量的存活期决定了该变量能保存它的值有多久。一旦该工程打 
开,模块级别和工程级别的变量就会保留它们的值。然而,如果程序的逻辑需要,VB能够重新初始 
化这些变量。使用Dim语句声明的当地变量当过程结束时就会丢失值,当地变量的存活期是随着过 
程的运行的,并且它们在程序每次运行的时候可以被重新初始化。VB允许你通过改变声明方式延长 
当地变量的存活期。  

14 了解和使用静态变量  

用Static关键字声明的变量是特殊的当地变量,静态变量在过程级别声明。和那些用关键字Dim声 
明的当地变量相反,静态变量在程序已经不在它们的过程里时仍然不会丢失它们的内容。例如,当 
一个带有静态变量的VBA过程调用另外一个过程时,在VB执行完被调用的过程语句后返回主调过程 
时,静态变量仍然保留它原来的值。过程CostOfPurchase示范静态变量allPurchase的使用:  
Sub CostOfPurchase()   
     'declare variables   
     Static allPurchase   
     Dim newPurchase As String   
     Dim purchCost As Single   
     newPurchase = InputBox(〃Enter the cost of a purchase:〃)   
     purchCost = CSng(newPurchase)   
     allPurchase = allPurchase + purchCost   
     'display results   
     MsgBox 〃The cost of a new pu
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架