数组
我们前面已经学习了常量和变量,用来保存程序运行过程中需要值。常量,变量都只能保存一个值,并不能保存一组同样类型的值。数组的出现就很好地解决了这个问题。数组就是同类型多个变量的集合,也是变量,数组是有顺序的。数组既然也是变量,数组也应当要先声明,后赋值使用。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,以上程序的运行结果如下:
数组赋值和取值
数组赋值格式如下:
数组名(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,以上程序的运行结果如下:
数组的开始索引设置
数组的索引默认是从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,以上程序的运行结果如下:
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
|
转载请注明本网址。