Excel中处理数据的基本类型有数值、文本、逻辑型、错误和空白,而在VBA编程环境中,数据类型要丰富得多,本文将讨论数值类型及相关运算。
讨论数值类型之前,先来了解一个新的概念——关键字。关键字是代码中有着特殊含义和用途的标识符,如前文中使用的Sub、Function、End都是关键字,它们和它们的组合定义了子程序结构和函数结构。在代码中定义自己的元素时不应使用关键字作为元素的名称,如子程序名、函数名、变量名、常量名等。
下面了解各种数值类型标识符(关键字)、取值范围和类型声明字符。VBA中的数值类型中的整数类型包括:
可以处理小数部分的数值类型有:
如果上述类型的数据处理范围还不够大,还可以使用Decimal数据类型;需要注意的是,此类型并不能使用Decimal关键字定义,而是需要定义为Variant类型(不声明类型时的默认类型)。Decimal类型在处理整数时可以处理最大28位,处理范围±79,228,162,514,264,337,593,543,950,335;处理小数时最多可以有28位小数,处理范围±7.9228162514264337593543950335。此外,如果需要将数据显式转换为Decimal类型可以使用CDec()函数。
代码中,除了直接使用数值(直接量),还可以使用变量和常量处理数据。变量是指在代码执行过程中可以改变其数据的标识符,在VBA代码中使用Dim关键字声明,如下面的代码。
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类型的变量可以赋予任何类型的数据,运算时会根据实际的数据类型进行处理,如下面的代码。
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()函数获取参数的类型值,函数会返回一个整数,其含义如下表所示:
常量在代码中有两层含义,一方面,常量的数据在代码运行时不再改变;另一方面可以使用常量表示常用数据,方便记忆和使用;如上表中的常量值,如果记不清楚表示类型的数值,可以使用常量值进行对比。如下面的代码会判断x是不是Long类型。
Sub test() Dim x As Long Debug.Print (VarType(x) = vbLong) End Sub
执行代码会显示True(真),即变量x是Long类型。大家可以修改As关键字后的类型名称来观察代码执行结果。
VBA代码中使用Const关键字定义常量,如下面的代码。
Sub test() Const uPI = 3.1415926 Debug.Print (uPI) End Sub
代码中定义了常量uPI并赋值,然后通过Debug.Print()方法显示其值,执行代码会在立即窗口中显示3.1415926。
实际工作中,有时只需要判断变量是不是数值类型,此时可以使用IsNumeric()函数,如下面的代码会返回True。
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,如果需要指定数值的类型,可以在数值的后面加上类型声明字符,如下面的代码。
Sub test() Debug.Print (VarType(1&)) End Sub
执行代码会显示3,即Long类型。可以删除或修改数字1后面的类型声明字符来观察执行结果。
VBA代码中,数值的常用运算有:
运算结果需要保留指定的小数位时,可以使用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()函数返回大于等于参数的最小整数。
本文小结如下: