按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
当你在模块级别声明变量时,除了关键字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 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
你将在第