你可以通过一个专门的命令来声明变量从而产生一个变量,或者也可以直接在语句里使用变量(而不需要声明)。当你声明变量时,你实际上让VB知道该变量的名称和数据类型,这叫做“强制显式声明变量”。
如果你在使用变量前不告诉VB关于该变量的任何信息,你这是在含蓄地告诉VBA你想要创建这个变量。没有明确声明的变量会自动地分配为Variant数据类型(参见表3-1)。虽然不声明变量很方便(你可以随意创建变量,并且不用事先知道被赋值的数值的数据类型就可以赋值给该变量),但是,它会导致很多问题。
技巧:强制显式声明变量的好处
1、强制显式声明变量加速过程的执行。因为VB知道数据类型,它只会占用实际储存数据需要的内
存
2、强制显式声明变量使你的代码可读性和可理解性增加,因为所有的变量都已列在过程的最前面
3、强制显式声明变量帮助预防由于变量名称拼写错误而导致的错误。VB根据变量声明里的拼写自动更正变量名称。
技巧:隐式声明变量的坏处
1、如果你错误拼写了一个变量名称,VB会显示运行时间错误,或者产生一个新的变量。你保证需要浪费很多时间来做故障排除,然而,如果在过程前声明了变量,这些很容易避免
2、因为VB不知道你要保存的变量的数据类型,它将分配给它Variant数据类型。这导致你的过程运行要慢一些,因为VB每次在处理这个变量时不得不检查数据类型。因为Variant可以储存任何一种数据类型,VB不得不占用更多的内存来储存你的数据
你可以使用关键字Dim来声明变量,Dim代表“Dimension”。关键字Dim后面紧跟变量名称,再后面就是数据类型。假设你想让过程显示员工的年龄,你计算年龄之前,必须给过程提供员工的生日。你可以这样做,声明一个叫DateOfBirth的变量:
Dim DateOfBirth As Date
注意,关键字Dim之后是变量名称(DateOfBirth)。如果你不喜欢这个名称,你可以自由地改为其它的,只有你想用的名称不是VBA关键字之一就行。关键字As以及后面的表3-1其中的一个数据类型,明确了该变量的数据类型。数据类型Date告诉VB变量DateOfBirth将会储存日期。
要储存员工的年龄,按下面方式声明变量Age:
Dim Age As Integer
变量Age将会储存今天和该员工生日之间年数的数字。因为年龄显示为整年,所以变量Age就被分配为Integer数据类型。你可能还想要你的程序追踪员工的姓名,因此需要声明另一个变量来保存员工的名和姓:
Dim FullName As String
因为词语“Name”已经在VBA占用的清单上,在你的VBA程序里使用它的话保证会有错误。将变量命名为FullName并且将它声明为String类型(因为员工姓名是文本),来保存员工姓名。
技巧: 隐式声明变量
没有用Dim语句来明确声明的变量叫做隐式声明。这些变量自动会被分配一个数据类型Variant。它们可以保存数字,字符串和其它信息类型。你可以通过在你VBA程序的任何地方,简单地赋值给一个变量名称来创建一个变量。例如,你可以按下述方式来隐式声明变量:DaysLeft = 100
声明变量被认为是编程的好习惯,因为它使程序可读性增强并且帮助避免某些类型的错误。既然你已经知道了如何声明变量,我们就来看一下使用它的一个程序:
Sub AgeCalc( )
‘variable declaration (变量声明)
Dim FullName As String
Dim DateOfBirth As Date
Dim Age As Integer
'assign values to variables (赋值给变量)
FullName = "John Smith"
DateOfBirth = #01/03/1967#
'calculate age (计算年龄)
Age = Year(Now())-Year(DateOfBirth)
'print results to the Immediate window (在立即窗口里打印结果)
Debug.Print FullName & " is " & Age & " years old."
End Sub
(Debug是非常好的工具,它让对象在运行时将结果在立即窗口上显示)
变量在程序的开始部分就被声明了,从那里开始,它们就可以使用了。在上面的过程里,每个变量声明在分开的行。如果你想,你也可以同时在一行里声明好几个变量,用逗号分开每个变量,例如:
Dim FullName As String, DateOfBirth As Date, Age As Integer
注意,关键字Dim只在变量声明行的开头出现了一次。
当VB执行变量声明语句时,它产生了有确切名称的变量,并且占用内存空间来储存它们的值,然后,明确的值被赋给这些变量。如何给变量赋值?变量名称,之后是一个等号,等号的右边是你希望用该变量储存的数据。这里你输入的数据必须是该变量声明的数据类型。文本数据应该使用引号包括起来,而日期需要用井号#包括起来。VB使用DateOfBirth提供的数据来计算员工的年龄,并且将计算结果储存到Age这个变量。员工的姓名和年龄通过指令Debug.Print打印到立即窗口。当程序运行结束后,你必须打开立即窗口来查看结果。
我们来看看你声明了错误的数据类型,会发生什么情况。下面的过程是计算一个工作表里的总单元格数目,并且将结果使用一个对话框显示给用户。
Sub HowManyCells( )
Dim NumOfCells As Integer
NumOfCells = Cells.Count
MsgBox "The worksheet has " & NumOfCells & " cells."
End Sub
错误的数据类型会导致错误。在上面的过程里,当VB尝试将Cells.Count语句的结果赋给变量NumOfCells时失败,Excel显示信息“运行时间错误6——溢出”。这个错误的产生原因时变量的无效数据类型,工作表里单元格总数目不在Integer数据范围之内。要更正这个问题,你应该选择一个可以包含一个大数据的数据类型。然而,要快速地解决上面程序遇到的问题,你只要删除变量类型AsInteger就行了。当你重新运行这个过程时,VB将给你的变量分配为Variant类型,尽管Variant比其它变量类型使用更多的内存和降低程序运行速度(因为VB不得不做额外的工作区检查变量类型),但是,如果这是在一个简短的程序里,使用Variant的代价也是难以觉察的。
技巧:
变量类型是什么?
通过下述方法,你可以快速地查明你程序里使用的变量的类型:在变量名称上单击右键,并且从快捷菜单上选择“快速信息”。
技巧:串联
你可以将两个或多个字符串结合成为一个新的字符串。这个操作称为串联。你已经在AgeCalc和HowManyCellss过程里看到了串联的例子。串联用&符号在表示。
例如,“Hisnameis”&FirstName
将会产生下述字符串:His name is John,或者His name is Michael。人名取决于变量FirstName的内容。注意,在is和结束引号之间有一个空格。字符串的串联也可以使用加号(+)来代表,然而,许多程序员为了消除混淆,宁愿将加号限制于数字的运算。