第二章 数组 2.1 数组的声明、赋值及读取 数组,就是多个数据或变量的集合。数组分为一维数组、二维数组、三维数组......等等。通常我们使用的是一维数组和二维数组。 数组是先声明,后使用。 1、声明数组 数组分为静态数组和动态数组 (1)静态数组 静态数组,就是它的长度是固定不变的。它的声明格式是这样的: Dim 数组名(a to b) As 数据类型 其中a、b都是数字,表示数组从a开始,到b结束。如果只写一个数字,则默认数组从0开始,数字表示它的长度。通常我们声明数组的时候,都不声明它的数据类型,这个数组就可以接受任何类型的数据。 例句: Dim arr1(6) '声明一个长度为6的一维数组,这个数组从0开始,它的实际长度是7。如下图所示: Dim arr2(3) As Integer '声明一个长度为3的整型一维数组,这个数组从0开始,它的实际长度是4。 Dim arr3(1 To 6) '声明一个长度为6的一维数组,这个数组从1开始,它的实际长度也是6。如下图所示: Dim arr4(1 To 5, 1 To 4) '声明一个5行4列的二维数组,这个数组的行和列都是从1开始。如下图所示: 通过以上案例我们可以发现,如果这个数组从0开始,那么它的实际长度要比声明的长度多1。如果这个数组从1开始,它的实际长度与声明长度一致。 (2)动态数组 如果定义时不知道数组的长度是多少,可以定义它为动态数组: Dim arr() 像这样,不给出数组的长度,它就是一个动态数组。等确定了数组的长度之后,再重新定义该数组: ReDim arr(1 to 5) 需要注意的是,在重新定义数组之前,如果这个数组已经有了数据,会把已有的数据全部清除掉。要想保留已有的数据,需要在数组前加上Preserve: ReDim Preserve arr(1 to 5) 2、数组赋值 arr(3) = 100 对数组里的一个位置直接赋值。 arr = Array(1, 2, 3, 4, 5, 6) 以数组的方式给数组赋值,产生一个从0开始的数组: brr = Range('a6:f6') 把一行数据赋值给一个数组,产生一个从1开始的二维数组,这个数组1行6列。如下图所示: crr = Range('a6:a16') 把一列数据赋值给一个数组,产生一个从1开始的二维数组,这个数组11行1列。如下图所示: 通过行和列的赋值,大家可以看到,无论是把一行、还是一列数据赋值给数组,都不能直接产生一维数组。这个时候,神器“乾坤大挪移”Transpose登场了! brr = Application.Transpose(brr) crr = Application.Transpose(crr) Transpose是数组转换函数,可以把数组的行和列进行互换。比如上面把一行数据赋值给一个数组brr(1行6列二维数组),转换后相当于把一列数据赋值给它(6行1列二维数组): 把一列数据赋值给一个数组crr(11行1列二维数组),转换后会得到一个长度为11的一维数组。 所以,把一行数据赋值给一个数组,两次转换之后就可以得到一个真正的从1开始的一维数组: brr = Application.Transpose(Application.Transpose(brr)) drr = Range('a1').CurrentRegion 把一个区域赋值给一个数组,产生一个从1开始的二维数组,行数和列数取决于区域大小。如下图所示: 用循环语句把单元格区域给数组赋值,例如,把6行6列的单元格区域的值赋值给一个数组: For i = 1 to 6 For j = 1 to 6 arr(i,j) = Cells(i,j) Next Next 3、数组的读取 数组的读取格式: 一维数组:数组名称(第几个) 二维数组:数组名称(行数,列数) 例如:arr(5) 读取数组的第5个数据。这里要注意的是,如果数组是从0开始的,则是读取数组的第6个数据。 arr(3,2) 读取数组第3行第2列的数据 小程序: 把下表中资产名称为“音响设备”的记录拷贝到h列,并统计它们的原值一共是多少?
Sub 数组应用() Dim arr(), brr(), n%, s& 行 = Range('a1').CurrentRegion.Rows.Count 列 = Range('a1') ReDim brr(1 To 行, 1 To 列) arr = Range('a1').CurrentRegion For i = 2 To 行 If arr(i, 2) = '音响设备' Then n = n + 1 brr(n, 1) = arr(i, 1) brr(n, 2) = arr(i, 2) brr(n, 3) = arr(i, 3) brr(n, 4) = arr(i, 4) brr(n, 5) = arr(i, 5) s = s + arr(i, 4) End If Next [h1].resize(行, 列) = brr MsgBox '音响设备价值一共' & s & '元' End Sub |
|