设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2469|回复: 4
打印 上一主题 下一主题

[其它] 数组的力量

[复制链接]
跳转到指定楼层
1#
发表于 2013-6-26 16:40:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、数组概念
数组就是一个列表或者一组数据表。它是由连续可索引的具有相同内在数据类型的元素所组成的集合,数组中每一个元素都具有唯一的索引号。更改其中一个元素并不会影响到其它元素。
数组存在内存,可以利用索引号获取该集合中每一个子集。
数组的两个特点:
1、读写速度快
VBA读取对象中的值永远慢于读取内存中的值。可以借助VBA数组对程序提速。
2、无法永远保存
数据存于工作表区域内,可以永久保存。但存入内存中的变量数组和常量数组却受其作用域影响生命周期。
过程级别的私有数组变量或者常量数组在过程结束后会自动释放,结束其生命周期;
而公有的变量数组和常量数组在excel应用程序关闭后会自动释放。也就是重新启动excel后,以前任何数组都不存在。
3、数组分类
按照数组元素是否固定来分,可以分为静态数组和动态数组;
按照数组维度来分,可以分为一维数组、二维数组等,最多只能为60维。
二、数组的维度
数组可以是一维、二维直到六十维。而对于excel工作表来说,excel的每一行或者每一列就可以转换成一维数组,而多行多列就可以转换成二维数组。
1、一维数组
在数组公式中,在A1:F1区域中输入数组公式:={1,2,3,4,5,6},然后按Ctrl+Shift+Enter,就可以在A1:F1之间得到了横向区域的值。
在A1:A6区域中输入数组公式:={1;2;3;4;5;6},然后按Ctrl+Shift+Enter,就可以在A1:A6之间得到了纵向区域的值。
而VBA数组也可以得到同样的效果:
2.1 VBA 代码
Sub 横向数组()
  [A1:F1] = [{1,2,3,4,5,6}]
End Sub
[{1,2,3,4,5,6}]代表是一维横向数组。
2.2 VBA代码
Sub 纵向数组()
  [A1:A6] = [{1;2;3;4;5;6}]
End Sub
[{1;2;3;4;5;6}]代表是一维纵向数组。
从上面两个赋值过程来看,看到数组在VBA中的优势,不仅可以对单元格进行循环赋值,还可以把原本需要循环6次的操作集中一次完成。
2、二维数组
对于三行三列的数组,我们可以使用数组公式:={1,1,1;2,2,2;3,3,3}
在VBA中也可以用数组表示一个二维数组,如下面例子
Sub 二维数组()
[A1:C3] = [{1,1,1;2,2,2;3,3,3}]
End Sub

三、利用索引号获取数组中的元素
类似Range可以使用索引号访问区域中每一个单元格一样,一维数组和二维数组也可以使用索引号获取数组中每一个值。主要有两种形式:
形式一:Arr(Item)
形式二:Arr(RowIndex,ColumnIndex)
这两种形式看起来在形式上和Range的索引号完全一致,但在事实上存在很多差异。
请看差异在哪里,例子1:
Sub 索引号引用数组()
Dim arr1() '声明数组变量
arr1 = Array("wise", "rose", "小花鸟", "小花鸭") '对数组赋值
MsgBox arr1(1) '正确的引用
MsgBox arr1(1, 1) '错误的引用
End Sub
在例子1中,对于一维数组的两种索引方式只能前者可以正常执行,后者会产生错误。
例子2:
Sub 索引号引用数组1()
Dim arr1() '声明数组变量
arr1 = [{1,1,1,1;2,2,2,2;3,3,3,3;4,4,4,4}] '对数组赋值
MsgBox arr1(4, 2) '正确的引用
MsgBox arr1(4) '错误的引用
End Sub
对于二维数组,例子2中两种方式只能使用第一种方式,而后者会产生错误。
当使用索引号引用数组时候,值得注意是:第一个元素的默认索引值。
在默认状态下,如果模块中未指定第一个元素的索引号,那么默认为0。即数组中arr中的第一个值用arr(0)来表示,最后一个元素的索引号则为数组元素个数减1来表示。
如下例子:
Sub 索引号引用数组()
Dim arr1() '声明数组变量
arr1 = Array("wise", "rose", "小花鸟", "小花鸭") '对数组赋值
MsgBox arr1(1) '正确的引用
End Sub
该例子显示的结果是rose而不是wise。
如果不习惯这种默认的索引方式,可以利用option base语句。
option base 1:表示数组中第一个元素的索引号为1
option base 语句只能置于模块的顶部,并且可选值只能为0或1。因为默认状态为0,那么option base 0可以忽略。

四、声明数组与赋值
1、声明数组变量
声明数组和声明其他变量一样,可以使用dim 、static、private 或public等语句声明。
一般来说,有两种声明方式,一种是静态数组声明,该种声明方式在声明数组变量时已经指明了数组的大小。一种是动态数组声明,它在程序运行后,数组大小可以被重置、改变。
数组声明:
当数组变量的参数是一个数值时,表示它是一维横向数组,元素个数等于该值加1。
如:(1) dim arr(5):表示声明一个具有6个元素一维横向数组,其数据类型是变体变量variant;
(2)dim arr(4) as byte:表示声明一个具有5个元素的横向数组,其数据类型为byte
如果借助to关键字,可以指定数组第一个元素的索引值。如
(1)dim arr(1 to 3) as string:表示声明一个具有3个元素的一维横向数组,数据类型是string,其第一个元素索引号为1;
(2)如果需要声明二维数组,可以使用逗号将参数分开,其形式为arr(一维,二维),如:
dim arr(3,2) as string:表示声明一个四行三列的二维数组,默认第一元素索引值为0;
dim arr(1 to 3,1 to 2) as string:表示声明一个三行二列的二维数组

2、对数组变量赋值
数组赋值通常采用三种方式:利用循环逐个赋值、利用Array对一维数组变量赋值、直接将区域赋予数组。
循环赋值:
Sub 数组赋值()
  Dim arr(3) As String, Item As Integer
  '循环数组四个元素
  For Item = 0 To 3
  '逐个赋值,将A1:A4值赋予每个变量
  arr(Item) = Range("A" & Item + 1)
  Next
  MsgBox arr(1)
End Sub

Array 数组赋值:

Sub 数组赋值1()
Dim arr As Variant '必须使用变体变量
'一次性对数组赋值,横向一维数组
arr = Array("wise", "Rose", "鸟", "鸭")
MsgBox arr(1)
End Sub
也可以对一维数组进行纵向赋值:

Sub 数组赋值2()
Dim arr As Variant '必须使用变体变量
'一次性对数组赋值,纵向一维数组
arr = WorksheetFunction.Transpose(Array("wise", "Rose", "鸟", "鸭"))
[D14] = arr
End Sub
区域赋值:

Sub 区域赋值()
Dim arr
arr = [A1:A6]
MsgBox arr(4, 1)
End Sub


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖 订阅订阅
2#
发表于 2013-6-26 18:20:00 | 只看该作者
{:soso_e113:}[{1,1,1;2,2,2;3,3,3}]写法有点像json

点击这里给我发消息

3#
发表于 2013-6-26 18:20:59 | 只看该作者
谢谢分享
回复

使用道具 举报

4#
发表于 2013-6-26 19:06:34 | 只看该作者
本帖最后由 mclly2000 于 2013-6-26 19:08 编辑

谢谢张老板
可能看看我的这个帖子http://www.office-cn.net/thread-117145-1-1.html
谢谢
5#
发表于 2014-4-11 09:57:21 | 只看该作者
学习了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-24 08:43 , Processed in 0.189805 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表