Excel 2016 VBA入门与应用
上QQ阅读APP看书,第一时间看更新

3.5 大量数据的操作从数组开始

正如前面介绍的,对于单个的数据,使用变量名来访问它是一个简单的方法。在VBA中,对于大量数据的访问,使用变量名就显得很麻烦了。实际上,对于大批量数据的访问,在VBA中,使用数组是一个高效快捷的方式。

3.5.1 初识数组

在程序中遇到大量的数据需要处理,如果为每一个数据定义一个变量将使程序变得非常的庞杂且很难阅读。此时,最好的办法就是使用数组来存储这些数据。

数组可以理解为一种特殊的变量,是一组变量的集合,这些变量具有相同的或不同的数据类型,共享一个名称。VBA的数组与其他程序设计语言不同的地方在于,其他程序语言的数组中所有元素都必须具有相同的数据类型,而VBA数组的各个元素可以是相同的数据类型,也可以是不同的数据类型。数组用来保存一组有序的数据,通俗地说数组就像一个柜子,柜子被分出了一个个抽屉,各种数据就放置在这一个个抽屉中。如表3-3所示的数据共有5个项目,可以使用数组来保存这些数据。

表3-3 数组数据

在表3-3中的数据可以通过项目名称后加上数据元素在列表中的序号来表示,如数据“郭义”可以用“项目1”来表示。这里数据只具有行或者列,是一种比较简单的数组,称为一维数组。

如果将由行和列组成的数据表定义为一个数组,这个数组即为二维数组。典型的二维数组就是大家熟悉的Excel工作表,工作表中每个数据的位置由行号和列号共同决定,而不是像一维数组那样只需要行号或列号就可以了。在下面的二维数据表3-4中的数据,要确定某个数据,必须同时使用行号或列号。如要确定数据“王明”,需要行号2和列号1。

表3-4 二维数据表

如果数组除了能处理行和列上的排列之外,还具有深度,这样的数组即为三维数组。如果把Excel的工作表看作一个二维数组,那么由于工作簿包含了多个工作表,其可以看作是三维数组。VBA的数组最大能够达到60维,但是对于超过三维的数组就已经十分难以理解了。所以读者大可以放心,在编写VBA程序时,那种庞大而繁杂的多维数组基本上不可能遇到,一般情况下,用得最多的是一维、二维和三维数组。

3.5.2 声明数组

与变量一样,数组在使用之前同样需要进行声明,让系统为其分配一片连续的内存空间。数组的声明,与变量相同,同样使用Dim、Static、Private或Public语句来实现。但是与声明变量不同是,数组在声明时必须为其指定大小。如果数组的大小被指定的话,则它将是固定大小的数组,这种数组称为静态数组。如果程序运行时,数组的大小可以被改变,则其将是动态数组。

对于一维的静态数组,常使用两种方法来进行声明。

第一种方法的语法格式如下所示:

        Dim数组名(上界) As数据类型

这里,数组名用于指定数组的名称,上界用于指定数组下标的上边界值,数据类型用于指定数组中数据的数据类型。这种定义方式需要给出数组下标的上界,这个上界值为数组下标可以使用的最大值。如果省略下标的上界,则该值取默认值0。如下面的语句:

        Dim myStrings (15) As String

这里,声明了名为myStrings的一维数组,数组中的元素从myStrings(0)开始,依次是myStrings(1), myStrings(2), …, myStrings(15)为止,数组一共包含16个元素。其中的数字0, 1,2… 为数组的下标,表示该元素是数组中的第几号数字。

声明数组的第二种方法是在定义数组时,直接指明数组的上界和下界的值。此时数组的下界值将不从默认的0开始,而是从定义的下界开始。具体的声明方法如下所示:

        Dim数组名 (下界To上界) As数据类型

这种方式能够将数组的下标的下界定义为任意值。如:

        Dim myArray(-2 To 8) As String

该语句定义了一个名为myArray的数组,该数组共有11个元素,它们分别是myArray(-2), myArray(-1), myArray(0), myArray(1), …, myArray(8)。

注意:在声明数组时,数组名的命名与变量名的命名一样都要符合标识符的规则,并且要尽量做到有一定的意义以便于阅读。在同一个过程中,数组名不能和变量名相同,否则会出错。

如果需要声明二维数组,可以使用下面的语法结构:

        Dim数组名 (第一维上界,第二维上界) As数据类型

或:

        Dim数组名 (第一维下界To第一维上界,第二维下界To第二维下界) As数据类型

如下面的语句定义了一共具有60个元素的二维数组:

        Dim myArray(-2 To 9,8 To 12) As Integer

这里,myArray数组中的元素为myArray(-2,8), myArray(-2,9), MyArray(-2,10), myArray(-2,11), myArray(-2,12), myArray(-1,8), myArray(-1,9), …, myArray(9,12)。

3.5.3 随心所欲的动态数组

在声明数组时,指定数组的下界和上界,数组将是一个固定大小的数组,这种数组称为静态数组。在很多情况下,程序中使用的数组的大小不需要固定,需要在代码的执行过程中根据需要来改变数组的大小,这种可以改变容量大小的数组,称为动态数组。

在VBA中,对于静态数组来说,数组的下标必须为常数,不能是变量或表达式,否则将会出错。如下面的语句在运行时将会出错,如图3-9所示。

图3-9 声明数组时的出错提示

        Dim i As Integer
        i = 3
        Dim a(i) As String
        a(0) = "Excel VBA"

动态数组在程序运行时的大小是可以改变的,要实现这种改变,需要使用变量来作为数组下标。要创建动态数组,一般使用两个步骤:

01 首先使用Dim、Static、Private或Public语句来声明数组,此时使语句中的括号为空。如下面语句定义名为myArray的数组:

        Dim myArray() As Integer

02 在创建数组后,使用ReDim语句来再次对数组进行声明,为数组重新分配存储空间。

ReDim语句的语法格式如下所示:

        ReDim [Preserve] 数组名(下标) [As数据类型]

ReDim语句将在过程中重新定义数组的维数和大小,该语句中的关键字Preserve为可选。如果省略该关键字,在重新定义数组大小时数组中保存的数据将全部消失。如果使用了Preserve关键字,则在扩充数组时将能够保存原有数组中的数据。

如下面语句将能够在myArray数组中扩充10个元素,而原数组中的值将不会丢失。

        ReDim Preserve myArray(UBound(myArray)+10)

注意:这里UBound函数用来获得数组的最大下标,如果需要获得数组的最小下标,可以使用LBound函数。