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

下载本书

添加书签

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


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
     'display results   
     MsgBox 〃The cost of a new purchase is: 〃 & newPurchase   
     MsgBox 〃The running cost is: 〃 & allPurchase   
End Sub   
上面的过程以一个名为allPurchase的静态变量和两个当地变量newPurchase和purchCost的声明开 
始。该过程中使用的InputBox函数显示一个对话框并且等着用户输入数值,一旦用户输入数值并且 
点击确定后,VB就会将该数值赋给变量newPurchase。在第四章中有InputBox函数的讨论。因为 
InputBox函数的结果总是字符串,变量newOurchase被声明为字符串数据类型了。然而,你不能在 
数学计算中使用字符串,这就是为什么需要在下一指令中使用一个类型转换函数(CSng)来将字符 
串值转换为单精度浮点类型的数字。函数CSng只需要一个自变量——你要转换的数值。函数CSng 
转换的数字结果保存在变量purchCost上。  
技巧3-13 类型转换函数  
在CSng上的任意地方按下F1,可以查看更多关于函数CSng的信息(也可以查看其它类型转换函数信 
息)  
下一行指令:allPurchase = allPurchase + purchCost,将InputBox函数提供的新数值加和到目 
前的采购数值上。当你第一次运行这个过程的时候,变量allPurchase和变量purchCost的内容是一 
样的;当你第二次运行它的时候,这个静态变量的值由对话框提供的值增加了。你可以随意多次运 
行过程CostOfPurchase,只要该工程是开着的,变量allPurchase就会不断的变化。依照下述步骤 
来试验该过程:  
1。  将光标放在过程CostOfPurchase里的任意地方并且按下F5  
2。  当对话框出现时,输入一个数字,例如,输入100然后回车。VB显示信息““The cost of a new  
    purchase is: 100。”  
                                           78 

… 页面 95…

3。  点击确定,VB显示第二个信息“The running cost is: 100。”  
4。  重新运行该程序,当对话框出现时,输入另外一个数字,例如输入50再回车。VB显示信息“The  
    cost of a new purchase is 50。”  
5。  点击确定,VB显示第二个信息“The running cost is: 150。”  
6。  多次运行该程序,看看VB是如何追踪运行的总量的。  

15 声明和使用对象变量  

你已经学习的变量是用于储存数据的,储存数据是你使用“普通的”变量的主要原因。除了储存数 
据从普通变量之外,还有引用VB对象的特殊变量,这些变量称为对象变量。你在第二章中已经学习 
了多种对象,现在,你开始学习如何用对象变量来代表对象。对象变量不储存数据,它们告诉数据 
在哪儿。例如,你可以用对象变量告诉VB数据在当前工作表的单元格E10,对象变量使定位数据更 
容易。编写VB程序时,你经常需要写一些很长的指令,例如:  
Worksheets(〃Sheet1〃)。Range(Cells(1;1); Cells(10; 5)。Select  
你可以声明一个对象变量来告诉VB数据在哪儿,而不必使用很长的指令来指向该对象。对象变量的 
声明和你已经学习的变量声明类似,唯一的不同是在关键字As后面,你输入词语Object作为数据类 
型,例如:  
Dim myRange As Object   
上面的语句声明了一个叫做myRange的对象变量。然而,实际上只声明对象变量是不够的,在使用 
这个变量于程序里之前,你还给这个对象变量赋上确定的值。使用关键字Set来给对象变量赋值, 
关键字Set后面是等号,再后面是该变量指向的值,例如:  
Set myRange = Worksheets(〃Sheet1〃)。Range(Cells(1;1); Cells(10; 5))   
上面的语句给对象变量myRange赋值,这个值指向工作表Sheet1的单元格区域A1:E10。如果你忽略 
了关键字Set,VB将会显示一个错误信息——“运行时间错误91:对象变量或With块变量未设置”。  
现在,又是来看看实例的时候了,下面的过程UseObjVariable示范一个叫myRange的对象变量的使 
用:  
Sub UseObjVariable()   
       Dim myRange As Object   
       Set myRange = Worksheets(〃Sheet1〃)。 _   
              Range(Cells(1; 1); Cells(10; 5))   
       myRange。BorderAround Weight:=xlMedium   
       With myRange。Interior   
              lorIndex = 6   
              。Pattern = xlSolid   
       End With   
       Set myRange = Worksheets(〃Sheet1〃)。 _   
              Range(Cells(12; 5); Cells(12; 10))   
       myRange。Value = 54   
       Debug。Print IsObject(myRange)   
End Sub   
我们来逐行分析一下过程UseObjVariable里的代码。过程开始的时候是对象变量myRange的声明, 
下一行将对象变量设置未Sheet1的区域A1:E10。从现在开始,你每次要引用这个区域时,你不需要 
写下整个地址,而只要使用这个捷径——该对象变量名称就可以了。这个过程的目的是在区域 
A1:E10外围设置边框,你不必使用下面这样冗长的指令:  
Worksheets(〃Sheet1〃)。Range(Cells(1; 1); _   
       Cells(10; 5))。BorderAround Weight:=xlMedium  
而可以使用一个捷径,使用对象变量名称:  
myRange。BorderAround Weight:=xlMedium   
下一节语句是将选区A1:E10设置底色。同样,你不需要使用你要操作的对象的冗长地址,你可以使 
用简单的对象变量名称myRange。下一句代码是给对象变量myRange分配一个新的引用区域,VB将忘 
记老的引用,你下次使用myRange时,它会引用另一个区域E12:J12。在新区域(E12:J12)输入了 

                                           79 

… 页面 96…

54后,过程给你显示如何确定某个变量时对象类型。如果myRange是对象变量的话,指令Debug。Print  
IsObject(myRange)将在立即窗口里面输入True。IsObject是个VBA中指明某变量是否是对象变量的 
函数。  
技巧3-14 使用对象变量的好处  
使用对象变量的好处有:  

16 使用明确的对象变量  

对象变量可以引用任意一种对象,因为VB有很多种对象,所以,要让你的程序可读性更强,运行更 
快,最好创建引用到具体对象类型的对象变量。例如,在过程UseObjVariable中,你可以将myRange 
对象变量声明为Range对象,而不是通常的对象变量(Object):  
Dim myRange As Range  
如果你要引用一个具体的工作表,你可以声明Worksheet对象:  
Dim mySheet As Worksheet   
Set mySheet = Worksheets(〃Marketing〃)   
当对象变量不再需要时,你可以给它赋值Nothing,这将释放内存和系统资源:  
Set mySheet = Nothing   
你将在第九章里看到更多的使用对象变量的例子。  

17 查找变量定义  

当你在VBA过程里看到一行给变量赋值的指令时,你可以通过选择该变量名称并且按下Shift+F2, 
快速地定位到该变量的定义(声明)。或者,你也可以选择“视图”-“定义”,VB将跳到变量的声 
明行。要回到刚才的位置,只要按下Ctrl+Shift+F2或选择“视图”-“最后位置”。我们来试试:  
1。  定位到过程CostOfPurchase的代码里  
2。  定位到语句purchCost = CSng(newPurchase)  
3。  在变量名称上单击右键,并在快捷菜单上选择“定义”  
4。  通过按Ctrl+Shift+F2返回刚才位置  
5。  试试在其它过程的其它变量上查找定义,每次使用不同的方法跳到声明位置。  
技巧3-15 这个变量是什么类型?  
你可以使用一个VB内置函数来查明变量的类型。参见第四章中使用函数VarType的例子。  

18 在 VB 过程里面使用常量  

当你的程序运行,变量的内容是可以变化的,如果你想要一次又一次地引用不变的值,那么你应该 
使用常量。常量就像一个指定的变量一样,总是引用这个相同的值。VB要求你在使用前要声明常量。 
正如下述例子,使用Const语句来声明常量:  
Const dialogName = 〃Enter Data〃 As String   
Const slsTax = 8。5   
Const ColorIdx = 3  
常量,象变量一样拥有范围。要让常量仅在一个过程里可用,将它声明为过程级别即可,例如:  
Sub WedAnniv( )   
     Const Age As Integer = 25   
        
End Sub  
如果你想要某个常量在一个模块的所有过程中都可用,则在Const语句前加上关键字Private就可 
 (译者:写在所有过程之上),例如:  
Private Const dsk = 〃B:〃 As String  
私有常量必须在模块的上面,第一个Sub语句之上声明。  
如果你要创建一个该工作簿所有模块都可用的常量时,在Const语句之前加上Public关键字就可以 
了,例如:  

                                            80 

… 页面 97…

Public Const NumOfChar = 255 As Integer  
公共常量必须在模块的上面,第一个Sub语句之上声明。  
声明常量的时候,你可以使用下列数据类型之一:Boolean,Byte,Integer,Long,Currency,Single, 
Double,Date,String或者Variant。  
象变量一样,多个常量也可以在一行里声明,例如:  
Const Age As Integer = 25; City As String = 〃Denver〃; PayCheck As Currency = 350  
使用常量可以使你的VBA过程可读性强,容易维护。例如,你在程序里多次引用某个特定值,就可 
以使用常量,而不是这个值本身。这样,如果以后这个值变了(例如销售税率上升了),你只要简 
单地在Const语句里改变这个常量的声明就可以了,而不必追踪该值所有发生的地方。  

19 内置常量  

Excel和VBA都有一长列的预先定义的常量,并且不需要声明,这些内置常量可以通过对象浏览器查 
找,我们已经在第二章里详细讨论了对象浏览器。我们来打开对象浏览器并查找Excel常量清单:  
1。  在VB编辑器窗口,选择“视图”-“对象浏览器”  
2。  在“工程/库”下拉列表里选择Excel  
3。  在搜索文本框里输入“Constants”并回车,VB显示搜索结果在“搜索结果”区域  
4。  在“类”列表框拉下滚动条,选择“Constants”(参见图3-3)。对象浏览器右边区域显示所 
    有Excel对象库里可用的内置常量。注意,所有常量的名称以前缀“xl”开头。  

                                                                     
图3-3 使用对象浏览器查找内置常量  
5。  要查找VBA常量,在工程/库文本框里输入VBA。注意,所有VBA的内置常量以前缀“vb”开头。  
学习内置常量的最好方法是使用宏录制器,我们来花上几分钟来录制最小化当前窗口的过程:  
1。  在Excel窗口,选择“
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架