Excel VBA语法与应用手册
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第3章 VBA语言基础

在VBA编程过程中,最基本的问题就是处理数据,凡是有数据的都会涉及到数据类型。本章重点介绍了数据类型、变量和常量的使用、数组,以及如何通过表达式对数据进行运算,这些内容都属于VBA编程所必须掌握的基础知识。

3.1 数据类型

在编写VBA代码的时候会使用到不同类型的数据。例如某个学生的姓名使用的就是文本类型的数据,而其年龄使用的是一个整数,其出生年月则是一个日期型数据。

3.1.1 数据类型简介

数据类型是指程序如何将数据存储在内存中。VBA内置的数据类型包括了整型、长整型、字符型、布尔型、日期型等数据类型,各数据类型的有关资料如表3-1所示。

表3-1 数据类型

1. 字节型

字节型表示0到255之间的一个整数,主要用于存储二进制数据。

2. 布尔型

布尔型又称做逻辑性。它只有两个取值,分别是True或者False,常常应用于逻辑判断的结果。

3. 整型和长整型

整型和长整型都表示一个不带小数的数,只是两种数据类型的区别在于取值范围不同,在内存中所占空间大小有别。它们可以表示正整数、零和负整数。

4. 单精度和双精度型

这两种数据类型都表示一个带小数的数值,它们表示的数据类型取值范围都比较大。两者的区别在于单精度型数据最大可以用7位有效数字来表示,而双精度类型数据最大可以用15位的有效数字来表示。超过了最大有效数字,将会以指数的形式来表示。

说明

计算机在表示数据的值的时候是有误差的。例如要表示12345678.9这个数,如果设定其为单精度类型,那么计算机就会将这个数表示成“1.234568E+07”,如果设定其为Double类型,那么就能够表示为“12345678.9”,但是Double类型的数据最多也只能显示15个有效数字。

5. 货币型

这是一种专为处理货币而定义的数据类型。

6. 小数型

包含小数数值的数据类型。Decimal的最小非零数值可表示为0.0000000000000000000000000001。

注意

此时Decimal数据类型只可以在Variant内使用,不能将变量声明为Decimal类型。

7. 日期型

用来存储日期和时间。日期和时间是两个概念,日期包括年月日,而时间是指时分秒等。日期型采用两个“#”将日期和时间连接起来。例如#2010-02-03 5:32:27 AM#就表示2010年2月3日早上5点32分27秒。

8. 字符串型

字符串类型的数据是指用引号标示出来的字符,它的表示方式就是“字符内容”。

字符串类型又可以分为两种,一种是定长字符串,一种是变长字符串。定长型的字符串其长度是固定的,而变长型的字符串其长度是不固定的,这两种不同的字符串在进行变量声明的时候是有区别的。

9. 对象型

对象型表示程序中的对象,例如单元格区域和工作表等。

10. 变体型

变体型的含义就是其表示的数据类型是可变的,也是一种万能的类型,可以放置任意一种类型的数据。VBA会根据实际情况,自动在不同种数据类型中进行转换。对于变量,如果用户不声明,那么VBA自动就将其数据类型默认为Variant类型。

11. 自定义数据类型

自定义数据类型是用户根据实际需要而定义的数据类型。自定义的数据类型中通常由多个部分组成,而每个部分又是上述一种基本的数据类型。

说明

很多初次接触VBA的用户会有这样的疑问,为什么会有这么多种的数据类型呢?可以做个简单的比喻,设置数据类型的过程就好比是用户到车辆租赁公司去租车。假设某次出行的人数只有7个人,那么最好的方法就是明确告诉出租车辆的公司需要一个可以容纳7人的车辆。当然用户也可以只是告诉出租车公司需要一辆车,那么车辆出租的公司为了满足用户的需要就必须设定多种情形,为客户预留各种不同大小的车辆。甚至于用户可以不告诉出租车辆的公司任何信息,而是直接到公司去租车,那么这种情况是最差的,出租车辆的公司可能会为临时的租车行为进行大规模的调整用车计划。为了避免出现这种情况,最好的方法就是声明确定一个合适的数据类型。

那么为了以防万一,是否可以声明一个数据范围最大的类型呢?答案是肯定的,就好比租车的时候租一辆最大的车总没有错,但是这样做的后果是无谓地添加了车辆的油耗,增加了系统的开销。

不同的数据类型都有各自的取值范围,超出了取值范围,就会显示一个错误。

例3-01:在模块中,设置一个名为“测试”的Sub过程,在该过程中定义销售数量sl,并将该变量定义为Interger类型,将变量sl的值设置为40000,观察下述代码运行的结果。

    #001:  Sub测试 ()
    #002:     Dim sl As Integer
    #003:     Sl = 40000
    #004:  End Sub

单击工具栏上的运行按钮,显示如图3-1所示的错误信息。

图3-1 错误提示

出现这个问题的原因就在于使用数据类型的时候发生了错误。第2行代码将变量sl定义为Integer类型,也就是整型数。这种数据最多只能表示一个-32,768到32,767之间的整数,因此当第3行代码将sl的值设置为40000的时候就已经超出了这个Integer数据类型的取值范围,最终导致发生错误。

在VBA中有一种类型是Variant类型,这是一种万能的类型,可以表示任意的一种数据类型。在VBA中如果不对变量进行声明,或者声明的时候将不指明变量的数据类型,那么该变量的数据类型其实就被VBA认为是Variant类型,这也就是为什么在VBA中不声明变量的数据类型,也可以正常使用变量的原因。

3.1.2 自定义数据类型

数据类型描述的是一类数据或者对象。VBA中只内置了最基本的数据类型,但是实际上,用户处理的数据可能会复杂得多,描述它们的时候,仅仅用一种数据类型可能是不够的,为此VBA允许用户根据需要自定义数据类型。

在VBA中自定义数据类型的格式如下。

    Type自定义数据类型名
        ……
    End Type

自定义数据类型的代码必须放置在模块的最上端。

例3-02:假设有如图3-2所示的电子表格,该电子表格中的内容反映的是某个班级学生的信息,要求用户定义一种名为Student的数据类型来表示某学生类型的数据。

图3-2 学生信息

数据类型是对对象的描述。描述一个学生信息的时候,它有4个方面的内容,包括了学生的id、姓名、性别和年龄方面信息。可以包含上述4个方面信息的记录定义为Student类型。这种Student类型的数据不是VBA中固有的类型,属于用户自定义的数据类型。

在模块中输入如下的代码。

    #001:  Type Stuedent
    #002:     Id As Integer
    #003:     Xm As String * 4
    #004:     Xb As String * 1
    #005:     Nl As Integer
    #006:  End Type

第1行到第6行代码完成了自定义数据类型的定义。其中Id和年龄定义为整型,姓名和性别都用字符串类型来定义。“Xm As String * 4”这种用法表示Xm这个变量为定长类的字符串类型,并且最多不能超过4个字节。