VBA数据类型

与其它的编程语言一样,VBA也有它自己的数据类型。数据类型是对同一类数据的统称,如文本、日期、数值等。VBA里的数据类型有:字节型(Byte),整数型(Integer),长整数型(Long),单精度浮点型(Single),双精度浮点型(Double),货币型(Currency),小数型(Decimal),字符串型(文本型)(String),日期型(Date),布尔型(Boolean),变体类型(Variant)。

下表显示了VBA语言的数据类型,以及存储大小和范围。

数据类型 存储空间大小 范围
Boolean 2 个字节 True 或 False
Byte 1 个字节 0 到 255
Collection 未知 未知
Currency(缩放整数) 8 个字节 -922,337,203,685,477.5808 到 922,337,203,685,477.5807
Date 8 个字节 公元 100 年 1 月 1 日到公元 9999 年 12 月 31 日
Decimal 14 个字节- (+/-79,228,162,514,264,337,593,543,950,335,不带小数点),(+/-7.9228162514264337593543950335,小数点右边有 28 位),(最小非零数字为 +/-0.0000000000000000000000000001)
Dictionary 未知 未知
Double(双精度浮点) 8 个字节 负值:-1.79769313486231E308 到 -4.94065645841247E-324,正值:4.94065645841247E-324 到 1.79769313486232E308
Integer 2 个字节 -32,768 到 32,767
Long(长整型) 4 个字节 -2,147,483,648 到 2,147,483,647
LongLong(LongLong 整型) 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(仅在 64 位平台上有效。)
LongPtr(在 32 位系统上为长整型,在 64 位系统上为 LongLong 整型) 在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节 在 32 位系统上为 -2,147,483,648 到 2,147,483,647,在 64 位系统上为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
Object 4 字节 任何 Object 引用
Single(单精度浮点) 4 个字节 负值:-3.402823E38 到 -1.401298E-45,正值:1.401298E-45 到 3.402823E38
String(可变长度) 10 字节 + 字符串长度 0 到大约 20 亿
String(定长) 字符串长度 1 到大约 65,400
Variant(带数字) 16 个字节 达到 Double 的范围的任何数值
Variant(带字符) 22 字节 + 字符串长度(在 64 位系统上的 24 字节) 与变长 String 的范围相同
用户定义(使用 Type) 元素所需的数字 每个元素的范围与其数据类型的范围相同。

上表是VBA里面所有的数据类型,有很多是平常的开发中用不到的,我们只讲解经常使用的数据类型。

数字类型

VBA中用于表示数字的数据类型有4种:整型Integer、长整型Long、单精度浮点型Single、双精度浮点型Double。整型及长整型用于表示整数,单精度与双精度浮点型都用于表示小数。

整型Integer 与 长整型Long

整型就是整数类型的略称,用来表示整数,包括正负整数。长整型就是表示范围比整型更大的整数。

整型与长整型的区别在于两者所能表示的数值范围不同:
整型数据能表示的数据范围:-32768 ~ 32767
长整型数据能表示的数据范围:-2147483648 ~ 2147483647

例1,声明整型变量intNumA,长整型变量lngNumB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Sub IntegerLongTest()
    Dim intNumA As Integer
    Dim lngNumB As Long

    intNumA = 32767
    lngNumB = 2147483647

    Debug.Print intNumA
    Debug.Print lngNumB
End Sub

以上程序的运行结果如下:

1
2
 32767
 2147483647

整数变量,长整数变量超出范围时,会报超出范围的错误,错误号码是6。

例2,声明超出整型范围intNumA,长整型范围lngNumB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Sub Test()
    Dim intNumA As Integer
    Dim lngNumB As Long

    intNumA = 32768
    lngNumB = 2147483648

    Debug.Print intNumA
    Debug.Print lngNumB
End Sub

以上程序的运行结果如下:

超出范围的错误

单精度浮点型Single 与 双精度浮点型Double

带有小数点的数字是浮点型。根据精度和大小分为单精度浮点数与双精度浮点数除。 单精度浮点数与双精度浮点数除了在数值范围不同之外,两者所能表示的数据精度(即小数点后多少位)也是不同的。

单精度浮点型能表示的数据范围 在表示负数时: -3.402823E38 ~ -1.401298E-45 在表示正数时: 1.401298E-45 ~ 3.402823E38

双精度浮点型能表示的数据范围 在表示负数时: -1.79769313486231E308 ~ -4.94065645841247E-324 在表示正数时: 4.94065645841247E-324 ~ 1.79769313486231E308

例3,声明单精度浮点型变量sngNumA,双精度浮点型变量dblNumB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Sub Test()
    Dim sngNumA As Single
    Dim dblNumB As Double

    sngNumA = 3.402823E38
    dblNumB = 1.79769313486231E308

    Debug.Print sngNumA
    Debug.Print dblNumB
End Sub

以上程序的运行结果如下:

1
2
 3.402823E+38
 1.79769313486231E+308

超出范围时,会报超出范围的错误,错误号码是6。

例4,声明超出范围的单精度浮点型变量sngNumA,双精度浮点型变量dblNumB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Sub Test()
    Dim sngNumA As Single
    Dim dblNumB As Double

    sngNumA = 3.402823E+38 + 3.402823E+38
    dblNumB = 1.79769313486231E+308 + 1.79769313486231E+308

    Debug.Print sngNumA
    Debug.Print dblNumB
End Sub

以上程序的运行结果如下:

超出范围的错误

注意: 单精度浮点型其精度是6,即只能保存小数点后最多6位的数据;双精度浮点型其精度是14,即只能保存小数点后最多14位的数据。如果超出以上长度,则超出部分会被去掉。在VBE编辑器中,超出14位以后的数字是输入不了得。

例5,单精度浮点型变量和双精度浮点型变量的小数位

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Sub Test()
    Dim sngNumA1 As Single
    Dim sngNumA2 As Single
    Dim dblNumB1 As Double
    Dim dblNumB2 As Double

    sngNumA1 = 5.1234567
    sngNumA2 = 5.1234561
    dblNumB1 = 5.12345678901235
    dblNumB2 = 5.12345678901231

    Debug.Print sngNumA1 '打印 5.123456
    Debug.Print sngNumA2 '打印 5.123456
    Debug.Print dblNumB1 '打印 5.12345678901235
    Debug.Print dblNumB2 '打印 5.12345678901231
End Sub

以上程序的运行结果如下:

1
2
3
4
 5.123456
 5.123456
 5.12345678901235
 5.12345678901231

因为在数字的表示范围上长整型大于整型,而双精度浮点型大于单精度浮点型,理论上来说,如果把变量定义为表示范围更大的数据类型可以更好地避免掉数据溢出的问题。但在定义变量时,应当遵守的一个原则就是:够用就好。而不是越大越好。所以通常如果整型和单精度浮点型就足以表示数据的话,应当使用它们而不是长整型和双精度浮点型。

字符串类型String

字符串是用于保存文本数据的,字符串内容应放置于双引号内。双引号只是表示字符串的起止,并不是字符串的一部分。

布尔型Boolean

布尔型数据用于表示逻辑值:真、假 。其中“真”为True,“假”为False。布尔值数据常用于条件判断语句。

例6,声明布尔型Boolean变量blnA,blnB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Sub Test()
    Dim blnA As Boolean
    Dim blnB As Boolean

    blnA = False
    blnB = True

    Debug.Print blnA
    Debug.Print blnB
End Sub

以上程序的运行结果如下:

1
2
False
True

将其他数值类型转换为布尔值时,0 将变为 False,所有其他值均变为 True。将布尔值转换为其他数据类型时,False 将变为 0,True 将变为 -1。

日期型Date

日期型数据不仅可以表示日期,还可以表示时间。可以表示的日期范围是:100年1月1日 ~ 9999年12月31日;可以表示的时间范围是:0:00:00 ~ 23:59:59。

任何可识别日期文字都可以分配给Date变量。 日期文字必须包含在数字符号 (#) 中, 例如, #January 1, 1993# 或 #1 Jan 93#。 Date变量根据计算机所设置的短日期格式显示日期,基于计算机识别的时间格式(12 小时或 24 小时)显示时间。

例7,声明日期型变量dtA,dtB。now函数是获取现在的日期时间点。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Sub Test()
    Dim dtA As Date
    Dim dtB As Date

    dtA = #9/18/2017 6:01:20 AM#
    dtB = Now()

    Debug.Print dtA
    Debug.Print dtB
End Sub

以上程序的运行结果如下:

1
2
2017/09/18 6:01:20
2019/09/13 14:12:33

变体型Variant

变体型数据是一种特殊的数据类型,它包含除固定长度 String 数据以外的任何类型的数据,还可以包含特殊值Empty、Error、Nothing 和 Null。可以简单地理解为:当不知道变量所要表示的数据是什么类型时,就把它定义为Variant(但这种操作应当尽量避免)。可以使用VarType函数或TypeName函数来确定Variant中的数据。

例8,声明变体型变量varA,varB。赋值时分别设置为日期型和整型。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Sub Test()
    Dim varA As Variant
    Dim varB As Variant

    Debug.Print TypeName(varA)
    Debug.Print TypeName(varB)

    varA = #9/18/2017 6:01:20 AM# '变体型变为日期型
    varB = 100                    '变体型变为整型

    Debug.Print varA
    Debug.Print varB
    Debug.Print TypeName(varA)
    Debug.Print TypeName(varB)
End Sub

以上程序的运行结果如下:

1
2
3
4
5
6
Empty
Empty
2017/09/18 6:01:20
 100
Date
Integer

字节类型byte

Byte变量存储为一个不带符号的 8 位(1 个字节)数字,值范围为0-255。Byte数据类型对于二进制数据非常有用。


转载请注明本网址。