数据类型用来决定可保存何种数据。数据类型包括 Byte、Boolean、Integer、Long、Currency、Single、Double、Date、String、Object、Variant ( 默认 )和用户定义类型等。
每个变量、文本、常数、枚举、属性、过程参数、过程变量和过程返回值都具有数据类型。事实上,在VBA中,凡是与数据有关就与数据类型有关。
除非使用无类型数据编程,否则必须声明所有编程元素的数据类型,例如:
上面的代码声明了strTemp变量,后面用As关键字声明了变量的数据类型为String。
整数是数据类型中最高效的,VBA中有两种整数类型:Integer和Long,具体介绍如表4-1所示。
表4-1
例如:
VBA中有两种小数类型:Single和Double,具体介绍如表4-2所示。
表4-2
例如:
Currency 变量存储为 64 位(8 个字节)整型的数值形式,然后除以 10,000 给出一个定点数,其小数点左边有 15 位数字,右边有 4 位数字。这种表示法的范围为−922,337,203,685,477.5808~922,337,203,685,477.5807。Currency的类型声明字符为@。
Currency 数据类型在货币计算与定点计算中很有用,在这种场合精度特别重要。
如果将变量声明为Boolean数据类型,则它可以保存True和False值。关键字True和False对应于Boolean 变量的两种状态。默认值为False。当VBA将数字数据类型值转换为Boolean时,False变为 0,其他值变为True。当VBA将Boolean值转换为数字类型时,False变为 0,True变为−1。下面的示例检测在PowerPoint中,结果是否存储于IsPPT变量中。
如果声明变量为Date数据类型,则它可以保存日期和时间值。
Date变量存储为IEEE 64 位(8 个字节)浮点数值形式,其可以表示的日期范围为 100年 1 月 1 日到 9999 年 12 月 31 日,而时间范围为 0:00:00 到 23:59:59。任何可辨认的文本日期都可以赋值给Date变量。日期文字必须以数字符号(#)括起来,例如,#January 1,1993# 或#1 Jan 93#。
VBA接受许多种文字的Date和Time格式。下面的Date/Time值全部有效:
当其他的数值类型要转换为Date数据类型时,小数点左边的值表示日期信息,而小数点右边的值则表示时间,0:00 为 0,而 12:00 为 0.5。负整数表示 1899 年 12 月 30 日之前的日期。
在VBA中对日期或时间操作的函数如表4-3所示。
表4-3
变量声明为String类型,则变量保存的是字符串值。String的类型声明字符为美元号($)。
例如:
String 的字符码的范围是 0~255。字符集的前 128 个字符(0~127)对应于标准的U.S. 键盘上的字符与符号。这前 128 个字符与ASCII字符集中所定义的字符相同。后 128个字符(128~255)则代表特殊字符,例如国际字符,重音符号,货币符号及分数。
字符串有两种,具体介绍如表4-4所示。
表4-4
如果变量包含二进制数,则将它声明为Byte数据类型的数组。
除一元减法外,所有可对整数进行操作的运算符均可操作Byte数据类型。因为Byte是 0~255 的无符号类型,所以不能表示负数。
有关Byte类型的详细使用见 4.7 节(P63)。
如果将变量声明为Variant数据类型,则该变量将存储任何类型的数据。
如果需要在不同的时间存储不同的数据类型,或者不知道变量在编译时可能会存储何种数据类型或类型,应使用Variant数据类型,如下面的示例所示。
Variant也可以包含Empty,Error,Nothing及Null等特殊值。可以用VarType函数或TypeName函数来决定如何处理Variant中的数据。
① Empty值
Variant变量初始前具有Empty值,表示 0 或空字符串或NULL等特定的值,可用IsEmpty函数测试Empty值,如下所示:
② NULL值
NULL值表示未知的数据,可用IsNULL函数来测试NULL值,如下所示:
注意:过多地使用Variant变量将使代码变得难以阅读和低效,还易产生不可预知的错误。
如果要用相同名字引用一系列变量,可以使用数组。
数组是连续可索引的具有相同内在数据类型的元素构成的集合,数组中的每一个元素具有唯一索引号。更改其中一个元素并不会影响其他元素。
例如:
有关数组的详细操作见 4.3 节(P43)。
不同类型的变量可以组合起来用来创建用户定义的类型,当需要创建单个变量来记录多项相关的信息时,用户定义类型是十分有用的。
创建用户定义的类型用 Type 语句,该语句必须置于模块的声明部分,不能用于过程中。用户定义类型可用Private 或 Public声明其范围,如下所示:
① 包含数组的用户定义类型
包含数组的用户定义类型如图4-7所示。
图4-7
可以采用访问对象中属性的方法来访问用户定义类型中的元素值,如下所示:
访问UDT中的数组元素,如下所示:
进行测试,如下所示:
② 嵌套数据结构
嵌套数据结构可以达到所希望的复杂程度。
事实上,正如以下的示例所显示,用户定义类型可以包含其他的用户定义类型。为了保证代码的可读性和易于调试,应尽量将定义用户定义数据类型的所有代码限制在一个模块的范围内。
进行测试,如下所示:
在PowerPoint中使用VBA编程,就必须与对象打交道,对象让编程任务变得更加简单。除了存储值以外,变量还可以引用对象。
① 存储特定对象,如下面的示例所示:
② 存储一般的对象使用Object类型,如下面的示例所示:
关于对象的详细应用请参阅第 9 章透视对象(P109)。
将值从一种数据类型更改为另一种类型的过程称为“转换”。
根据源代码中的语法,它们可以是隐式转换或显式转换。
① 隐式转换
隐式转换不需要源代码中的任何特殊语法。在下面的示例中,在将 k 的值赋给 q 之前,VBA 将该值隐式地由Integer类型转换成Double类型。
② 显式转换
显式转换使用类型转换关键字。VBA 提供了一些这样的关键字,它们将括号中的表达式强制转换为所需的数据类型。
VBA类型转换函数如表4-5所示。
表4-5
下面为对上面的例子的扩展,CInt关键字将q的值转换回整数,然后将该值赋给k。
如果要检查某个变量或数据的类型,VBA提供了如图4-8所示的一些有用的函数:
图4-8
下面的示例用IsNumeric函数检查用户的输入是否为数字。