VBA声明和使用对象变量
你已经学习的变量是用于储存数据的,储存数据是你使用“普通的”变量的主要原因。除了储存数据从普通变量之外,还有引用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
.ColorIndex = 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)输入了54后,过程给你显示如何确定某个变量时对象类型。如果myRange是对象变量的话,指令Debug.Print IsObject(myRange)将在立即窗口里面输入True。IsObject是个VBA中指明某变量是否是对象变量的函数。
技巧:使用对象变量的好处
1、它们可以代替真实对象使用
2、它们比真实对象更短更容易记住
3、当过程运行时,你可以改变它们的意义
使用明确的对象变量
对象变量可以引用任意一种对象,因为VB有很多种对象,所以,要让你的程序可读性更强,运行更快,最好创建引用到具体对象类型的对象变量。例如,在过程UseObjVariable中,你可以将myRange对象变量声明为Range对象,而不是通常的对象变量(Object):
Dim myRange As Range
如果你要引用一个具体的工作表,你可以声明Worksheet对象:
Dim mySheet As Worksheet
Set mySheet = Worksheets("Marketing")
当对象变量不再需要时,你可以给它赋值Nothing,这将释放内存和系统资源:
Set mySheet = Nothing
查找变量定义
当你在VBA过程里看到一行给变量赋值的指令时,你可以通过选择该变量名称并且按下Shift+F2,快速地定位到该变量的定义(声明)。或者,你也可以选择“视图”-“定义”,VB将跳到变量的声明行。要回到刚才的位置,只要按下Ctrl+Shift+F2或选择“视图”-“最后位置”。我们来试试:
1. 定位到过程CostOfPurchase的代码里
2. 定位到语句purchCost = CSng(newPurchase)
3. 在变量名称上单击右键,并在快捷菜单上选择“定义”
4. 通过按Ctrl+Shift+F2返回刚才位置
5. 试试在其它过程的其它变量上查找定义,每次使用不同的方法跳到声明位置。
技巧:这个变量是什么类型?
你可以使用一个VB内置函数来查明变量的类型。参见第四章中使用函数VarType的例子。