Excel中处理数据的基本类型有数值、文本、逻辑型、错误和空白,而在VBA编程环境中,数据类型要丰富得多,本文将讨论数值类型及相关运算。
讨论数值类型之前,先来了解一个新的概念——关键字。关键字是代码中有着特殊含义和用途的标识符,如前文中使用的Sub、Function、End都是关键字,它们和它们的组合定义了子程序结构和函数结构。在代码中定义自己的元素时不应使用关键字作为元素的名称,如子程序名、函数名、变量名、常量名等。
下面了解各种数值类型标识符(关键字)、取值范围和类型声明字符。VBA中的数值类型中的整数类型包括:
Byte,处理范围为0到255。
Integer,处理范围-32,768到32,767,类型声明字符为%。
Long,处理范围-2,147,483,648到2,147,483,647,类型声明字符为&。
LongLong,处理范围-9,223,372,036,854,775,808到9,223,372,036,854,775,807,类型声明字符为^。
可以处理小数部分的数值类型有:
Single,负数处理范围-3.402823E38到-1.401298E-45,正数处理范围1.401298E-45到3.402823E38,类型声明符号为!。
Double,负数据处理范围-1.79769313486231E308 到 -4.94065645841247E-324,正数处理范围4.94065645841247E-324到1.79769313486232E308。类型声明符号#。
Currency,处理范围-922,337,203,685,477.5808到922,337,203,685,477.5807,此类型可以提供高精度的计算,多用于财务、金融计算等。类型声明字符@。
如果上述类型的数据处理范围还不够大,还可以使用Decimal数据类型;需要注意的是,此类型并不能使用Decimal关键字定义,而是需要定义为Variant类型(不声明类型时的默认类型)。Decimal类型在处理整数时可以处理最大28位,处理范围±79,228,162,514,264,337,593,543,950,335;处理小数时最多可以有28位小数,处理范围±7.9228162514264337593543950335。此外,如果需要将数据显式转换为Decimal类型可以使用CDec()函数。
代码中,除了直接使用数值(直接量),还可以使用变量和常量处理数据。变量是指在代码执行过程中可以改变其数据的标识符,在VBA代码中使用Dim关键字声明,如下面的代码。
VBA |
Sub test() Dim x As Long, y As Long, sum As Long x = 10 y = 99 sum = x + y Debug.Print (sum) End Sub |
执行代码会在立即窗口中显示109。test()子程序中,首先使用Dim关键字定义了x、y、sum三个变量,它们的类型都是Long,而声明变量类型时需要使用As关键字。接下来,将x变量赋值为10,将y变量赋值为99,并将x加y的和赋值到sum变量中;最后通过Debug.Print()方法显示sum变量的值。
需要注意的是,使用Dim关键字声明变量时,如果不使用As关键字指定变量的数据类型,则默认的数据类型是Variant;声明多个变量时,需要分别指定数据类型,如代码“Dim x,y As Long”中,x会声明为Variant类型,y声明为Long类型。Variant类型的变量可以赋予任何类型的数据,运算时会根据实际的数据类型进行处理,如下面的代码。
VBA |
Sub test() Dim x, y, sum x = 10 y = 99.1 sum = x + y Debug.Print (sum) End Sub |
本例首先声明x、y和sum三个变量,然后分别赋值,最后会显示109.1。代码中,变量x赋值为整数,而变量y赋值为浮点数,保存计算结果的sum变量应该是什么类型呢?当不同类型的数据进行运算时会遵循一个基本的原则,代码会隐式地将处理范围小的类型转换为处理范围大的类型,运算结果的类型也是处理范围较大的类型。代码中可以使用VarType()函数获取参数的类型值,函数会返回一个整数,其含义如下表所示:
值 | 常量 | 说明 |
0 | vbEmpty | 空(未初始化),Variant类型的默认值。 |
1 | vbNull | Null(不是有效数据) |
2 | vbInteger | Integer,整数 |
3 | vbLong | Long,长整数 |
4 | vbSingle | Single,单精度浮点数 |
5 | vbDouble | Double,双精度浮点数 |
6 | vbCurrency | Currency,货币值 |
7 | vbDate | Date,日期值 |
8 | vbString | String,字符串类型 |
9 | vbObject | Object,对象 |
10 | vbError | Error,错误值 |
11 | vbBoolean | Boolean,布尔值(逻辑值) |
12 | vbVariant | Variant(仅与变量的数组一起使用) |
13 | vbDataObject | 数据访问对象 |
14 | vbDecimal | Decimal,小数值 |
17 | vbByte | Byte,字节值 |
20 | vbLongLong | LongLong ,长长整数,仅x64 平台有效。 |
36 | vbUserDefinedType | 包含用户定义类型的变量 |
8192 | vbArray | Array,数组 |
常量在代码中有两层含义,一方面,常量的数据在代码运行时不再改变;另一方面可以使用常量表示常用数据,方便记忆和使用;如上表中的常量值,如果记不清楚表示类型的数值,可以使用常量值进行对比。如下面的代码会判断x是不是Long类型。
VBA |
Sub test() Dim x As Long Debug.Print (VarType(x) = vbLong) End Sub |
执行代码会显示True(真),即变量x是Long类型。大家可以修改As关键字后的类型名称来观察代码执行结果。
VBA代码中使用Const关键字定义常量,如下面的代码。
VBA |
Sub test() Const uPI = 3.1415926 Debug.Print (uPI) End Sub |
代码中定义了常量uPI并赋值,然后通过Debug.Print()方法显示其值,执行代码会在立即窗口中显示3.1415926。
实际工作中,有时只需要判断变量是不是数值类型,此时可以使用IsNumeric()函数,如下面的代码会返回True。
VBA |
Sub test() Dim x x = 1 Debug.Print (IsNumeric(x)) End Sub |
这里可以修改变量x的值并观察执行结果,如修改为"Hello"就会显示False。需要注意的是,如果IsNumeric()函数的参数能够成功转换为数值就会返回True,如IsNumeric("123")也会返回True值。
使用IsNumeric()函数判断变量可以转换为数值后,还可以通过一系列的函数显式地转换为指定的数值类型,如:
使用Dim关键字声明变量时,指定数据类型和不指定数据类型有什么区别呢?如果不指定数据类型,则默认类型是Variant类型,其默认值为空(Empty),使用IsEmpty()函数判断时会返回True;将变量声明为指定的数据类型时,变量会有一个可用的默认值,如数值类型的默认值就是0。
VBA代码中,默认的整数类型是Integer,默认的浮点数类型是Double,如果需要指定数值的类型,可以在数值的后面加上类型声明字符,如下面的代码。
VBA |
Sub test() Debug.Print (VarType(1&)) End Sub |
执行代码会显示3,即Long类型。可以删除或修改数字1后面的类型声明字符来观察执行结果。
VBA代码中,数值的常用运算有:
加法运算,使用+运算符。
减法运算,使用-运算符。
乘法运算,使用*运算符。
除法运算,使用/运算符。运算结果为浮点数。
整数除法运算,使用\运算符。如果运算数不是整数,则通过四舍五入转换为整数后计算,计算结果为整数,如10.1\3.1等于3。
幂运算,使用^运算符,如x ^ y是求x的y次方;也可以使用^运算符求开方,如x ^ (1 / n)就是求x开n次方的结果。在x64平台使用^运算符时注意在运算符前应有一个空格,否则无法正确运行。
模运算,即求余数运算,使用Mod运算符,如10 Mod 3等于1,注意Mod运算符前后各有一个空格。Mod运算符同样用于整数计算,如10.1 Mod 3.3等于1,10.9 Mod 3.6等于3。
运算结果需要保留指定的小数位时,可以使用Round()函数,其中参数1为需要转换的数据,参数2指定保留的小数位数,如果不指定参数2将返回整数部分。需要注意的是,Round()函数采用的舍入方法是“四舍六入五取偶”,即4以下舍去,6以上前一位加1,5时前一位取最近的偶数;如Round(1.24,1)返回1.2,Round(1.25,1)返回1.2,Round(1.35,1)返回1.4,Round(1.26,1)返回1.3。如果需要真正的四舍五入,可以使用Application.Round()函数。
不需要四舍五入而直接获取小数的整数部分时,还可以使用Int()和Fix()函数,当参数大于等于0时两个函数返回结果相同,当参数小于0时,Int()函数返回小于等于参数的最大整数,Fix()函数返回大于等于参数的最小整数。
本文小结如下:
关键字是代码中有着特殊含义和用途的标识符,一般不应使用关键字为元素命名。
使用Dim关键字定义变量,不指定变量类型时默认为Variant类型,值为空(Empty),可以使用IsEmpty()判断。指定变量为数值类型时,默认值为0。数值类型包括Byte、Integer、Long、LongLong、Single、Double、Currency,此外,Decimal类型的数据需要通过Variant类型处理。
使用Const关键字定义常量。
使用VarType()获取数据类型。
l使用IsNumeric()函数判断参数是否为数值或是否可以转换为数值。判断成立时可以使用一系列函数进行类型转换。
不同类型的数值一起运算时,运算数统一转换为取值范围大的类型,计算结果同样为取值范围大的类型。
注意\运算符和Mod运算符只用于整数运算,如果运算数不是整数则通过四舍五入转换为整数后计算。
Round()函数采用“四舍六入五取偶”原则,如需要按四舍五入保留小数位可使用Application.Round()函数。