数组

我们前面已经学习了常量和变量,用来保存程序运行过程中需要值。常量,变量都只能保存一个值,并不能保存一组同样类型的值。数组的出现就很好地解决了这个问题。数组就是同类型多个变量的集合,也是变量,数组是有顺序的。数组既然也是变量,数组也应当要先声明,后赋值使用。VBA中的数组分为静态数组和动态数组。

指定了数组的大小是静态数组(也叫固定数组)。没有指定大小,并在程序运行时大小可以更改的数组是动态数组。

声明静态数组

静态数组语法如下:
Dim 数组名(start to end) As 数据类型

其中start和end是索引值,必须是整数,表示静态数组的开始和结束。 索引值start可以省略,默认是0。省略时,声明语法变为Dim 数组名(end) As 数据类型

start是数组的上界,end是数组的下界。

例1,声明静态数组变量intA,strB。

1
2
3
4
5
6
7
8
Sub Test()

    '数组intA表示学生成绩,共有4个数据
    Dim intA(2 To 5) As Integer
    '数组strB表示学生的总评价,共有4个数据
    Dim strB(3) As String

End Sub

声明动态数组

动态数组语法如下:
Dim 数组名() As 数据类型
ReDim 数组名() As 数据类型

空括号代表的就是数组长度是可以变化的,不是固定写死的。当确定了数组的长度之后,使用ReDim来重新定义数组。

例2,声明动态数组变量intA,strB。根据学生数来定义数组的大小。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Sub Test()
    '数组intA表示学生成绩
    Dim intA() As Integer
    '数组strB表示学生的总评价
    Dim strB() As String

    Dim nums As Integer
    'InputBox函数是弹出一个输入对话框,让你来输入一个数字。
    'int函数是将输入的数字转换为整型。
    nums = Int(InputBox("请输入大于3的学生数"))
    Debug.Print "学生数:" & nums

    '根据nums数来生成数组
    ReDim intA(nums) As Integer
    ReDim strB(nums) As String

End Sub

输入数字4,以上程序的运行结果如下:

1
学生数:4

数组赋值和取值

数组赋值格式如下:
数组名(i)= 数组的值

数组取值格式如下:
变量 = 数组名(i)

数组的赋值和取值都是通过小括号加上数字来实现的。i是索引值,必须是整数。

例3,声明静态数组变量intA,strB。intA数组的索引数字是2到5,共有四个。strB数组的索引是0到3,也有四个。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Sub Test()
    '数组intA表示学生成绩,共有4个数据
    Dim intA(2 To 5) As Integer
    '数组strB表示学生的总评价,共有4个数据
    Dim strB(3) As String

    intA(2) = 60
    intA(3) = 70
    intA(4) = 50
    intA(5) = 90

    strB(0) = "B"
    strB(1) = "C"
    strB(2) = "A+"
    strB(3) = "A"
End Sub

例4,声明动态数组变量intA,strB。根据学生数来定义数组的大小。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub Test()
    '数组intA表示学生成绩
    Dim intA() As Integer
    '数组strB表示学生的总评价
    Dim strB() As String

    Dim nums As Integer
    'InputBox函数是弹出一个输入对话框,让你来输入一个数字。
    'int函数是将输入的数字转换为整型。
    nums = Int(InputBox("请输入大于3的学生数"))
    Debug.Print "学生数:" & nums

    '根据nums数来生成数组
    ReDim intA(nums) As Integer
    ReDim strB(nums) As String

    intA(1) = 50
    intA(2) = 60
    intA(3) = 70

    strB(1) = "C"
    strB(2) = "A+"
    strB(3) = "A"

End Sub

输入数字4,以上程序的运行结果如下:

1
学生数:4

数组的开始索引设置

数组的索引默认是从0开始。实际上,是可以更改的。第0个数字,一般不好理解,我们可以将其设置为从1开始。
Option Base 1 可以设置数组从1开始。Option Base 1语句和前面介绍的Option Explicit类似,必须放置在过程的外面。

例5,静态数组的起始索引强制为从1开始,strB(0)会出错,因为索引超出错误。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Option Base 1

Sub Test()
    '数组intA表示学生成绩,共有4个数据
    Dim intA(2 To 5) As Integer
    '数组strB表示学生的总评价,共有4个数据
    Dim strB(3) As String

    intA(2) = 60
    intA(3) = 70
    intA(4) = 50
    intA(5) = 90

    strB(0) = "B"
    strB(1) = "C"
    strB(2) = "A+"
    strB(3) = "A"
End Sub

以上程序的运行后的错误如下:

数组索引超出范围的错误

删除strB(0)的赋值语句,就不会出现错误了。修改如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Option Base 1

Sub Test()
    '数组intA表示学生成绩,共有4个数据
    Dim intA(2 To 5) As Integer
    '数组strB表示学生的总评价,共有4个数据
    Dim strB(3) As String

    intA(2) = 60
    intA(3) = 70
    intA(4) = 50
    intA(5) = 90

    strB(1) = "C"
    strB(2) = "A+"
    strB(3) = "A"
End Sub

例6,动态数组的起始索引强制为从1开始,strB(0)会出错,因为索引超出错误。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Option Base 1

Sub Test()
    '数组intA表示学生成绩
    Dim intA() As Integer
    '数组strB表示学生的总评价
    Dim strB() As String

    Dim nums As Integer
    'InputBox函数是弹出一个输入对话框,让你来输入一个数字。
    'int函数是将输入的数字转换为整型。
    nums = Int(InputBox("请输入大于3的学生数"))
    Debug.Print "学生数:" & nums

    '根据nums数来生成数组
    ReDim intA(nums) As Integer
    ReDim strB(nums) As String

    intA(0) = 50
    intA(1) = 60
    intA(2) = 70

    strB(0) = "C"
    strB(1) = "A+"
    strB(2) = "A"
End Sub

输入数字4,以上程序的运行后的错误如下:

数组索引超出范围的错误

删除intA(0)和strB(0)的赋值语句,就不会出现错误了。修改如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Option Base 1

Sub Test()
    '数组intA表示学生成绩
    Dim intA() As Integer
    '数组strB表示学生的总评价
    Dim strB() As String

    Dim nums As Integer
    'InputBox函数是弹出一个输入对话框,让你来输入一个数字。
    'int函数是将输入的数字转换为整型。
    nums = Int(InputBox("请输入大于3的学生数"))
    Debug.Print "学生数:" & nums

    '根据nums数来生成数组
    ReDim intA(nums) As Integer
    ReDim strB(nums) As String

    intA(1) = 60
    intA(2) = 70

    strB(1) = "A+"
    strB(2) = "A"
End Sub

输入数字4,以上程序的运行结果如下:

1
学生数:4

ReDim Preserve–动态数组的保存

ReDim语句更改动态数组。但是,每次这么做时,数组中的现有值都会丢失。 我们通过例4来看下。

例7,声明动态数组变量intA,strB。根据学生数来定义数组的大小。先输入三个学生的数据,过后再输入另外三个学生的数据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Sub Test()
    '数组intA表示学生成绩
    Dim intA() As Integer
    '数组strB表示学生的总评价
    Dim strB() As String

    '先输入三个学生的数据,也就是输入3。nums1变为3
    Dim nums1 As Integer
    'InputBox函数是弹出一个输入对话框,让你来输入一个数字。
    'int函数是将输入的数字转换为整型。
    nums1 = Int(InputBox("请输入大于3的学生数"))
    Debug.Print "第一次学生数:" & nums1

    '根据nums数来生成数组
    ReDim intA(nums1) As Integer
    ReDim strB(nums1) As String

    intA(1) = 50
    intA(2) = 60
    intA(3) = 70

    strB(1) = "C"
    strB(2) = "A+"
    strB(3) = "A"

    Debug.Print "第一位学生成绩:" & intA(1)
    Debug.Print "第一位学生评价:" & strB(1)

    '再输入三个学生的数据,因为我想保存之前的三个学生的数据,所以输入6.nums2变为6
    Dim nums2 As Integer
    'InputBox函数是弹出一个输入对话框,让你来输入一个数字。
    'int函数是将输入的数字转换为整型。
    nums2 = Int(InputBox("请输入大于3的学生数"))
    Debug.Print "第二次学生数:" & nums2

    '根据nums2数来生成数组
    ReDim intA(nums2) As Integer
    ReDim strB(nums2) As String

    intA(4) = 80
    intA(5) = 90
    intA(6) = 100

    strB(4) = "A+"
    strB(5) = "A+"
    strB(6) = "A-"
    Debug.Print "第一位学生成绩:" & intA(1)
    Debug.Print "第一位学生评价:" & strB(1)
End Sub

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

1
2
3
4
5
6
第一次学生数:3
第一位学生成绩:50
第一位学生评价:C
第二次学生数:6
第一位学生成绩:0
第一位学生评价:

为啥第二次Redim之后,数组intA的前三个值都小时呢?这是因为Redim每次都会重置数组,第二次Redim时,已经保存在数组里面的前三项丢失了。 如何在第二次Redim时能保住已经存在数组里面的值呢?使用ReDim Preserve可在保留数组中现有值的情况下扩展数组。

将例4中的第二次Redim语句修改为ReDim Preserve,看看结果如何?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Sub Test()
    '数组intA表示学生成绩
    Dim intA() As Integer
    '数组strB表示学生的总评价
    Dim strB() As String

    '先输入三个学生的数据,也就是输入3。nums1变为3
    Dim nums1 As Integer
    'InputBox函数是弹出一个输入对话框,让你来输入一个数字。
    'int函数是将输入的数字转换为整型。
    nums1 = Int(InputBox("请输入大于3的学生数"))
    Debug.Print "第一次学生数:" & nums1

    '根据nums数来生成数组
    ReDim intA(nums1) As Integer
    ReDim strB(nums1) As String

    intA(1) = 50
    intA(2) = 60
    intA(3) = 70

    strB(1) = "C"
    strB(2) = "A+"
    strB(3) = "A"

    Debug.Print "第一位学生成绩:" & intA(1)
    Debug.Print "第一位学生评价:" & strB(1)

    '再输入三个学生的数据,因为我想保存之前的三个学生的数据,所以输入6.nums2变为6
    Dim nums2 As Integer
    'InputBox函数是弹出一个输入对话框,让你来输入一个数字。
    'int函数是将输入的数字转换为整型。
    nums2 = Int(InputBox("请输入大于3的学生数"))
    Debug.Print "第二次学生数:" & nums2

    '根据nums2数来生成数组  Preserve关键字是重点。不会清空数组,保护已经存在的值
    ReDim Preserve intA(nums2) As Integer
    ReDim Preserve strB(nums2) As String

    intA(4) = 80
    intA(5) = 90
    intA(6) = 100

    strB(4) = "A+"
    strB(5) = "A+"
    strB(6) = "A-"
    Debug.Print "第一位学生成绩:" & intA(1)
    Debug.Print "第一位学生评价:" & strB(1)
End Sub

执行好的结果如下:

1
2
3
4
5
6
第一次学生数:3
第一位学生成绩:50
第一位学生评价:C
第二次学生数:6
第一位学生成绩:50
第一位学生评价:C

超出动态数组的范围时,也会报索引超出的错误,错误号码是9。

例8,声明动态数组intA,strB。输入小与3的学生数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub Test()
    '数组intA表示学生成绩
    Dim intA() As Integer
    '数组strB表示学生的总评价
    Dim strB() As String

    Dim nums As Integer
    'InputBox函数是弹出一个输入对话框,让你来输入一个数字。
    'int函数是将输入的数字转换为整型。
    nums = Int(InputBox("请输入小于3的学生数"))
    Debug.Print "学生数:" & nums

    '根据nums数来生成数组
    ReDim intA(nums) As Integer
    ReDim strB(nums) As String

    intA(1) = 50
    intA(2) = 60
    intA(3) = 70

    strB(1) = "C"
    strB(2) = "A+"
    strB(3) = "A"
End Sub

输入数字2, 以上程序的运行后的错误如下:

数组索引超出范围的错误

多维数组

vba支持多维数组,上面介绍的都是一维数组。多维数组的定义格式同一维类似,只是括号中多了逗号。格式如下:
Dim 数组名(start1 to end1,start2 to end2,start3 to end3,……) As 数据类型

例9,声明二维数组变量intA,三维数组变量strB。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub Test()

    '二维数组intA。第一维是2到3,有2个数据。
    '第一维是3到4,有2个数据。
    '共有2*2=4个数据。
    Dim intA(2 To 3,3 to 4) As Integer

    '三维数组strB。第一维是0到1,有2个数据。
    '第一维是0到2,有3个数据。
    '共有2*3=6个数据。
    Dim strB(1,2) As String

    intA(2, 3) = 1
    intA(2, 4) = 2
    intA(3, 3) = 3
    intA(3, 4) = 4

    strB(0, 0) = "A"
    strB(0, 1) = "B"
    strB(0, 2) = "C"
    strB(1, 0) = "D"
    strB(1, 1) = "E"
    strB(1, 2) = "F"
End Sub

转载请注明本网址。