vba编程中我们会经常遇到type语句,以下为一个Type 语句示例:
Type people ? ?'创建用户自定义的类型。
? ? ID As Integer ? ?'定义元素的数据类型。
? ? Name As String * 20
? ? Address As String * 30
? ? Phone As Long
? ? HireDate As Date
End Type
Sub CreateRecord()
? ? Dim student As people? ? '声明变量。
? ? '对 people?变量的赋值必须在过程内进行。
? ? student.ID = 3300002000010100000? ? '给学生的身份证号赋值。
End Sub
type 语句,定义用户自定义的数据类型,只能在模块级使用。如果要在类模块中使用,则必须在 Type 语句前冠以关键字 Private。
定义如下:Type 语句在模块级别中使用,用于定义包含一个或多个元素的用户自定义的数据类型。
语法
Private (或 Public )Type varname
elementname (number) As type
. . .
End Type
Type 语句的语法包含下面部分:
部分 描述?
Public 可选的。用于声明可在所有工程的所有模块的任何过程中使用的用户定义类型。?
Private 可选的。用于声明只能在包含该声明的模块中使用的用户自定义的类型。?
varname 必需的。用户自定义类型的名称;遵循标准的变量命名约定?
elementname 必需的。用户自定义类型的元素名称。除了可以使用的关键字,元素名称也应遵循标准变量命名约定。?
number (脚注符号)可选的。数组元素的维数。当定义大小可变的数组时,只须圆括号。
number 参数使用如下语法:?
(1 to 3). . . '下标1,上标3
如果不显式指定下标1,则数组的下界由 Option Base 语句控制。如果没有下标 Option Base 语句则下界为 0。?
type 必需的。元素的数据类型;可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(对变长的字符串)、String * length(对定长的字符串)、Object、Variant、其它的用户自定义的类型或对象类型。?
说明
Type 语句只能在模块级使用。使用 Type 语句声明了一个用户自定义类型后,就可以在该声明范围内的任何位置声明该类型的变量。可以使用 Dim、Private、Public、ReDim 或 Static 来声明用户自定义类型的变量。
在标准模块中,用户自定义类型按缺省设置是公用的。可以使用 Private 关键字来改变其可见性。而在类模块中,用户自定义类型只能是私有的,且使用 Public 关键字也不能改变其可见性。
在 Type...End Type 块中不允许使用行号和行标签。
用户自定义类型经常用来表示数据记录,记录一般由多个不同数据类型的元素组成。
下面的示例演示了一个用户自定义类型的大小固定的数组的用法:
Type ProvinceData '定义省级数据
? ? CityCode (1 To 100) As Integer ? ?' 定义市级代码为 一个静态数组
? ? County As String * 30? '定义县级为包含30个字符的字符串
End Type
Dim zhejiang(1 To 100) As ProvinceData? '定义浙江为type类型的省级数据
在上述示例中,ProvinceData 中包括了一个 CityCode 静态数组和county的字符串,且记录zhejiang的结构与 ProvinceData 相同。
当在用户自定义类型中声明大小固定的数组时,必须用数字文字或常数而不能用变量来声明数组的维数。redim函数可以重新定义动态数组。
ReDim 语句示例
该示例使用 ReDim 语句为动态数组变量分配和重分配存储空间。假设 下标Option Base 是 1。
Dim MyArray() As Integer ? ?'声明动态数组。
Redim MyArray(5) ? ?'分配 6个元素,下标0-5。这个跟之前帮助文件不太一致,以本文章为准。
For I = 0 To 5 ? ?'循环 5 次。
? ? MyArray(I) = I ? ?'初始化数组。
Next I
下一条语句重定义该数组的大小,并清除其中的元素。
Redim MyArray(10) ? ?'大小重定为 11 个元素,下标0-10。
For I = 0To 10 ? ?'循环 11 次。
? ? MyArray(I) = I ? ?'初始化数组。
Next I
下面的语句重定义该数组的大小,但没有清除其中的元素。
Redim Preserve MyArray(15) ? ?'大小重定为 16 个元素。
前11个元素内容不变,后5个元素内容为空""。
Len 函数示例
本示例使用 Len 函数来得知某字符串的长度(字节数)或某变量的大小。
好了,Type...End Type 程序区块定义一个自定义数据类型 studentRecord。如果该数据类型定义在对象类模块中,则必需以关键字 Private 开头(表示为私有)。若定义在常规模块中,Type 定义就可以为 Public。
Type studentRecord ? ?' 定义用户自定义的数据类型。
? ? ID As Integer ? ?' 将此定义放在常规模块中。
? ? Name As String * 10
? ? Address As String * 30
End Type
Dim student As studentRecord ? ?' 声明变量。
Dim MyInt As Integer, MyCur As Currency
Dim MyString, MyLen
MyInt = 10000
MyString = "Hello World" ? ?' 设置变量初值。
MyLen = Len(MyInt) ? ?' 返回 2。整形数不管大小,占2个字节
MyLen = Len(student) ? ?' 返回 42。2+10+30=42
MyLen = Len(MyString) ? ?' 返回 11。空格也占1个字节
MyLen = Len(MyCur) ? ?' 返回 8。currency类型变量占8个字节
Currency 数据类型
? 首先普及下字节相关知识:
一个字节=8位(计算机内存中二进制0101,数字0或1占一位)?
??1、计算机存储信息的最小单位,称之为位(bit),音译为比特,二进制的一个“0”或一个“1”叫一位。
2、计算机存储容量基本单位是字节(Byte),音译为拜特,8个二进制位组成1个字节。一般而言:一个标准英文字母占一个字节位置,一个标准汉字占二个字节位置。
3、计算机存储容量大小以字节数来度量,1024进位制:
1024B=1K(千)B
1024KB=1M(兆)B
1024MB=1G(吉)B
1024GB=1T(太)B
Currency 变量存储为 8 个字节(64位)整型的数值形式,然后除以 10,000 给出一个定点数,其小数点左边有 15 位数字,右边有 4 位数字。这种表示法的范围可以从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807。Currency 的类型声明字符为at号 (@)。
Currency 数据类型在货币计算与定点计算中很有用,在这种场合精度特别重要。
?
以下第二个实例不常用,可酌情参考:
第二个示例使用 LenB 和用户定义的函数 (LenMbcs) 在使用 ANSI 表示字符串时返回字符串中的字节字符数。
Function LenMbcs (ByVal str as String)
? ? LenMbcs = LenB(StrConv(str, vbFromUnicode))
End Function
Dim MyString, MyLen
MyString = "ABc"
' 其中“A”和“B”为双字节,“c”为单字节。
MyLen = Len(MyString)
' 返回 3 - 字符串中的 3 个字符。
MyLen = LenB(MyString)
' 返回 6 - 对于 Unicode,使用 6 个字节。
MyLen = LenMbcs(MyString)
' 返回 5 - 对于 ANSI,使用 5 个字节。
好了,以上啰嗦一大堆,希望大家都能熟练掌握。