String (定长)
字符串长度 1 到大约 65,400 Variant (数字)
16 个字节 任何数字值,最大可达 Double 的范围 Variant (字符) 22 个字节加字 符串长度
与变长 String 有相同的范围 用户自定义 (利用 Type) 所有元素所需 数目
每个元素的范围与它本身的数据类型的范围相同。
当使用 Variant 数据类型的时候,VBA 会根据实际需要将数据转换为特定的数据类型, 但有时VBA 的自动转换并不正确,就需要使用类型转换函数。类型转换函数可以如下方 式使用:
bResult = CBool(expression)
其中expression 参数可以是任何字符串表达式或数值表达式,类型转换函数的类型和 使用说明见表 2-4,如果参数超出可以接受的范围会导致一个运行时错误。 表 2-4 VBA 的类型转换函数及其说明
函数 返回类型 expression 参数范围
CBool Boolean 任何有效的字符串或数值表达式。 CByte Byte 0 至 255。
CCur Currency -922,337,203,685,477.5808 至922,337,203,685,477.5807。 CDate Date 任何有效的日期表达式。
CDbl Double 负数从 -1.79769313486231E308 至 -4.94065645841247E-324;正数从 2. VBA 简介 22
Excel 与VBA 程序设计 Copyright ? 2005 马维峰 4.94065645841247E-324 至 1.79769313486232E308。 CDec Decimal 零变比数值,即无小数位数值,为
+/-79,228,162,514,264,337,593,543,950,335。对于 28 位小数的数值,范 围则为+/-7.9228162514264337593543950335;最小的可能非零值是 0.0000000000000000000000000001。
CInt Integer -32,768 至 32,767,小数部分四舍五入。
CLng Long -2,147,483,648 至 2,147,483,647,小数部分四舍五入。
CSng Single 负数为 -3.402823E38 至 -1.401298E-45 ; 正数为 1.401298E-45 至 3.402823E38。
CStr String 依据expression 参数返回 Cstr。
CVar Variant 若为数值,则范围与Double 相同;若不为数值,则范围与String 相同。 很多资料和书籍会告诉读者不要使用 Variant 类型,因为速度和空间占用。笔者也推荐
显式定义数据类型,但原因不是因为速度,而是程序的清晰和可读性。
Variant 代表Integer 类型时,速度慢50%,但作为Double 的Variant 类型,速度没有什 么差别,作为Currency 类型的Variant 类型,速度有些时候还要快一些。
2.3.3. 运算符
VBA 中的运算符有以下几类运算符:
1. 算术运算符,用来进行数学计算的运算符; 2. 比较运算符,用来进行比较的运算符; 3. 连接运算符,用来合并字符串的运算符; 4. 逻辑运算符,用来执行逻辑运算的运算符。
逻辑运算符和比较运算符将在介绍条件语句时介绍,连接运算符在介绍字符串时做介 绍,本小节只介绍算术运算符。 算术运算符有以下运算符:
1. ^ 运算符:求一个数字的某次方,如A^B; 2. * 运算符:乘法运算; 3. / 运算符:除法运算;
4. \\ 运算符:对两个数作除法并返回一个整数; 5. Mod 运算符:求两数的余数; 6. + 运算符:加法运算;
2. VBA 简介 23
Excel 与VBA 程序设计 Copyright ? 2005 马维峰
7. - 运算符:减法运算。
当一个表达式牵扯到多个运算符时,就必须考虑运算符的优先顺序。运算符的优先顺 序是指在一个表达式中进行若干操作时,每一部分都会按预先确定的顺序进行计算求解, 称这个顺序为运算符的优先顺序。
在表达式中,当运算符不止一种时,要先处理算术运算符,接着处理比较运算符,然 后再处理逻辑运算符。所有比较运算符的优先顺序都相同;也就是说,要按它们出现的顺 序从左到右进行处理。而算术运算符和逻辑运算符则必须按下列优先顺序(由上至下)进 行处理(表 2-5)。可以用括号改变优先顺序,强令表达式的某些部分优先运行。括号内的 运算总是优先于括号外的运算。但是,在括号之内,运算符的优先顺序不变。 表 2-5 运算符的优先顺序
算术 比较 逻辑
指数运算 (^) 相等 (=) Not 负数 (–) 不等 (<>) And 乘法和除法 (*、/) 小于 (<) Or 整数除法 (\\) 大于 (>) Xor
求模运算 (Mod) 小于或相等 (<=) Eqv 加法和减法 (+、–) 大于或相等 (>=) Imp 字符串连接 (&) Like Is
2.3.4. 数组
数组是具有相同数据类型并且共享同一个名字的一组变量的集合。数组中的元素通过 索引数字加以区分。定义数组的语法如下: Dim ArrayName(n) As Type
Dim ArrayName(a to b) As Type
其中n、a、b 是数组中的元素的数目。n 表示数组元素为0 到n,共n+1 个,a 表示数 组元素最小索引为a,最大为b,元素个数为(b-a+1)个。
例如,如果要创建保存 10 个学生名字的数组,可以使用如下语句: Dim strStudents(9) As String
注意,括号中的数字是9 而不是10。这是因为在默认情况下,第一个索引数字是0。
数组在处理相似信息时非常有用。假设需要处理15 门考试成绩,可以创建15 个独立的变 量,也可以创建一个数组来保存考试成绩,具体语句如下:
2. VBA 简介 24
Excel 与VBA 程序设计 Copyright ? 2005 马维峰
Dim iTestScores(14) As Integer
大多数情况下,可以使用像上面例子中类似的一维数组。VBA 也支持多维数组。可以 认为二维数组和工作表或者表格具有相似的结构。要创建4×4 的数组,可以使用如下语句: Dim iTable(3,3) As Integer
声明数组时的另一种选择是不给定大小。这样,当程序开始运行时,就具有定义数组 大小的灵活性。如果声明数组时没有给定大小,就成为动态数组。声明动态数组的语法如 下:
Dim DynamicArray() As Type
例如,你的应用程序让用户创建一张表格,可以提示用户确定要创建的表格的行和列 的数目。通过创建动态数组就可以做到这样,甚至还可以使用户在创建完表格(实际上是 数组)后对改变行或列的维数。
对数组进行声明后,可以在运行时用 ReDim 语句重新指定数组的大小: ReDim DynamicArray(size)
参数size 代表数组的新大小。如果要保留数组的数值,请在ReDim 语句后使用关键字 Preserve,具体语法如下:
ReDim Preserve DynamicArray(size)
任何数据类型的数组都需要20 个字节的内存空间,加上每一数组维数占4 个字节,再 加上数据本身所占用的空间。数据所占用的内存空间可以用数据元数目乘上每个元素的大 小加以计算。例如,以4 个2 字节之 Integer 数据元所组成的一维数组中的数据,占8 个 字节。这8 个字节加上额外的24 个字节,使得这个数组所需总内存空间为32 个字节。包 含一数组的Variant 比单独的一个数组需要多 12 个字节。
2.3.5. 自定义数据类型
在模块中可以使用 Type 关键字定义包含一个或多个元素的用户自定义的数据类型。语 法如下:
[Private | Public] Type varname
elementname [([subscripts])] As type [elementname [([subscripts])] As type] … … End Type
其中各关键字和前文说明一致。用户自定义类型可包含一个或多个某种数据类型的数
2. VBA 简介 25
Excel 与VBA 程序设计 Copyright ? 2005 马维峰
据元素、数组或一个先前定义的用户自定义类型,一般用于表示数据记录,记录一般由多 个不同数据类型的元素组成。例如: Type MyType
MyName As String '定义字符串变量存储一个名字。 MyBirthDate As Date '定义日期变量存储一个生日。 MySex As Integer '定义整型变量存储性别 End Type
Type 语句只能在模块级使用。使用Type 语句声明了一个用户自定义类型后,就可以 在该声明范围内的任何位置声明该类型的变量。可以使用Dim、Private、Public、ReDim 或Static 来声明用户自定义类型的变量。需要说明的是,在标准模块中,用户自定义类型 按缺省设置是公用的,可以使用Private 关键字来改变其可见性;而在类模块中,用户自定 义类型只能是私有的,且使用Public 关键字也不能改变其可见性。
2.3.6. 枚举类型
在 Offfice 和Excel 对象模型中,有一类常量称为枚举常量,如表示目前操作系统的
XlPlatform 枚举常量,其包含3 个常量xlMacintosh、xlMSDOS、xlWindows,在代码中可 以如下使用: XlPlatform.xlWindows
一方面易于记忆,并可以使用代码窗口的自动完成功能。我们也可以用Enum 语句自 定义枚举变量。变量和参数都可以定义为Enum 类型。Enum 类型中的元素被初始化为Enum 语句中指定的常数值。所赋给的值可以包括正数和负数,且在运行时不能改变。例如: Enum SecurityLevel IllegalEntry = -1 SecurityLevel1 = 0
SecurityLevel2 = 1 End Enum
Enum 语句只能在模块级别中出现,可以定义为Private 类型或者Public 类型。定义
Enum 类型后,就可以用它来定义变量,参数或返回该类型的过程。不能用模块名来限定 Enum 类型。类模块中的Public Enum 类型并不是该类的成员;只不过它们也被写入到类型 库中。在标准模块中定义的Enum 类型则不写到类型库中。具有相同名字的Public Enum 类 型不能既在标准模块中定义,又在类模块中定义,因为它们共享相同的命名空间。若不同 的类型库中有两个Enum 类型的名字相同,但成员不同,则对这种类型的变量的引用,将
2. VBA 简介 26
Excel 与VBA 程序设计 Copyright ? 2005 马维峰
取决于哪一个类型库具有更高的引用优先级。 例如,可以定义如下的枚举变量: #001 Public Enum MyColors #002 icMistyRose = &HE1E4FF& #003 icSlateGray = &H908070& #004 icDodgerBlue = &HFF901E& #005 icDeepSkyBlue = &HFFBF00& #006 icSpringGreen = &H7FFF00& #007 icForestGreen = &H228B22& #008 icGoldenrod = &H20A5DA& #009 icFirebrick = &H2222B2& #010 End Enum
然后,在代码中,我们就可以使用此枚举变量: #001 Sub MyTest()
#002 PrintColor (icForestGreen) #003 End Sub #004
#005 Sub PrintColor(color As MyColors)