菜鸟也懂VBA-excle2007VBA入门教程(15)
Excel 2007 VBA 教程
第十三讲 VBA数组基础(一)
一. 什么是数组?
VBA数组就是储存一组数据的数据空间,它是由连续可索引的且具有相同的数据类型成员集合。数组中的每一个成员都具有唯一的索引号,数组存在于内存中,平常我们是把数据存在于工作表中的单元格里。 二. 数组的特点
1. 读写速度快
学VBA的朋友,刚开始时,不会怎么要求关注运行速度,但是当你处理大量数据时,当你的VBA水平不断提高时,可能你就有这方面的意识了,Vba读取内存中的数据远远比从读取对象中的数据要快,有了这个特点,往往VBA爱好者一有机会就会用数组处理数据。 (1). 实例 对比下面两段代码的运行速度
Sub test1() '用时0.12秒
Dim t As Single, i As Integer, s As Long, arr As Variant t = Timer
arr = Range(\ For i = 1 To 5000
s = s + arr(i, 1) '直接调用内存中的值 Next i
MsgBox Format(Timer - t, \秒\End Sub
Sub Test2() '用时7.32秒
Dim t As Single, i As Long, s As Long t = Timer
For i = 1 To 1000000
s = s + Cells(i, 1) '调用单元格中的值 Next i
MsgBox Format(Timer - t, \秒\End Sub
从上面两段代码大家可以看出,第一段代码用了数组,第二段代码是从单元格中读取数据,速度差那么远,第一段代码没有感觉到等,第二段感觉在等待。所以大家说说,要不要学数组。因为数组的运行速度快。太棒了。
2. 无法永久保存
数据存放在工作表中单元格里可以永久保存,但存放在数组中数据只你要关闭Excel程序,不管是你是模块级变量,还是全局性变量,都会消失,以前的任何数组都不存在了。
三. 数组的分类
1. 按维分
(1). 一维数组 相当于工作表里单行,不能是单列,如果要转为单列,就要借助于工作函数里转置函数
Transpose (2). 二维数组 相当于工作表里单元格区域,是一个矩形区域,多行多列 (3). 还有三维,四维,他们说可以到60维,我都不会,也不理解,在我们Excel里VBA几乎用不到三维,
所以大家了解二维和一维就可以了。
2. 按其它的分
(1). 常量数组 如array(\(2). 静态数组 我们定义变量时就知道数组的维数和数组的上下界 (3). 动态数组 我们定义变量时不知道数组的维数和数组的上下界
第 38 页 共 52 页
Excel 2007 VBA 教程
四. 向数组中写于数据
Sub test1() '写入一维数组 Dim i As Integer Dim arr(1 To 100) arr(1) = \佛山\ arr(2) = \老鼠\
arr(3) = \佛山小老鼠\End Sub
Sub test2() '向二维数组写入数据,二维数组和我们工作表时的单元格区域相似,这样大家可能好理解一点
'先循环行,然后再循环列
Dim x As Integer, y As Integer Dim arr(1 To 7, 1 To 4) For x = 1 To 7 For y = 1 To 4
arr(x, y) = Cells(x, y) Next y Next x
MsgBox arr(2, 2) End Sub
Sub tets3() '动态数组
Dim arr(), MyRow As Integer, i As Integer '定义变量,定义Arr为动态数组,因为我们不能确定数组Arr的一维上标
MyRow = Cells(Rows.Count, 1).End(xlUp).row '取得A列最后一个数据的单元格的行号
ReDim arr(1 To MyRow, 1 To 4) '重新定义数组Arr ,大家记得,前面我们定义它Dim Arr(),现在还要给它定义一次,因为现在知道它的上标了
'所以用了 ReDim arr(1 To MyRow, 1 To 4)
For x = 1 To MyRow '遍历单元格区域,然后通过循环一一把单元格里的数据写于数组 arr(x, 1) = Cells(x, 1) '第X行第1列 arr(x, 2) = Cells(x, 2) '第X行第2列 arr(x, 3) = Cells(x, 3) '第X行第3列 arr(x, 4) = Cells(x, 4) '第X行第4列 Next x End Sub
Sub test4() '由常量数组导入 Dim arr
arr = Array(1, \佛山小老鼠\End Sub
Sub test5() '由单元格区域导入 Dim arr '
arr = Range(\大家注意,这种赋值,我们就不能指定数组的上下标,如果指定就会报错 所以直接用了Dim arr End Sub
五. 动态数组的扩充
1. 用ReDim Preserve arr1(一维变量),这个是扩充一维的
2. 用ReDim Preserve arr1(一维,二维变量),这个只能扩充二维的
第 39 页 共 52 页
Excel 2007 VBA 教程
备注 大家务必要记得动态数组的扩充是扩展末维的,如二维的你就不能扩充一维,你只能扩充二维的变量
实例 把B列有小老鼠的记录筛选出来放在F1开始的单元格区域 Sub test1()
Dim arr, arr1() '定义arr为数组,arr1为动态数组
Maxrow = Cells(Rows.Count, 2).End(xlUp).Row '取得B列最后一个有数据的行号 arr = Range(\把单元格区域一次写于数组
For i = 1 To Maxrow '遍历数组Arr中的一维, 相当于遍历B列中的数据 If arr(i, 2) = \小老鼠\如果数据是“小老鼠“那么 k = k + 1 '累加K值
ReDim Preserve arr1(1 To 4, 1 To k) '重新定义数组Arr1,且要保留原有的数据,二维的下标你从1开始,那么刚好和数组 arr一致,这个地方一定要注意
'为什么二维不直接写个k,而写成1 to k,还有一个原因,Resize(k, 4)吻合。直接用K就见Test2的的写法
arr1(1, k) = arr(i, 1) '把数组Arr中符合条件重新放到新数组arr1中
arr1(2, k) = arr(i, 2) ' 大家可以这样理解它,数组arr的列就是数组arr1中的行
arr1(3, k) = arr(i, 3) '数组arr的行就是数组arr1中的列,为什么要这样呢?是因为
arr1(4, k) = arr(i, 4) '给二维数组重新定义数组时扩充只能扩充二维,不能扩充一维,最后通过转置函数又转回来 End If Next i
[F1].Resize(k, 4) = Application.WorksheetFunction.Transpose(arr1) '又通过转置函数又转回来 End Sub
Sub 清空()
Range(\:I\End Sub Sub test2()
Dim arr, arr1() '定义arr为数组,arr1为动态数组
Maxrow = Cells(Rows.Count, 2).End(xlUp).Row '取得B列最后一个有数据的行号 arr = Range(\把单元格区域一次写于数组
For i = 1 To Maxrow '遍历数组Arr中的一维, 相当于遍历B列中的数据 If arr(i, 2) = \小老鼠\如果数据是\小老鼠\那么
ReDim Preserve arr1(1 To 4, k) '重新定义数组Arr1,且要保留原有的数据,二维的下标从0开始
arr1(1, k) = arr(i, 1) '把数组Arr中符合条件重新放到新数组arr1中
arr1(2, k) = arr(i, 2) ' 大家可以这样理解它,数组arr的列就是数组arr1中的行 arr1(3, k) = arr(i, 3) '数组arr的行就是数组arr1中的列,为什么要这样呢?是因为
arr1(4, k) = arr(i, 4) '给二维数组重新定义数组时扩充只能扩充二维,不能扩充一维,最后通过转置函数又转回来 < …… 此处隐藏:4209字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [基础教育]2016-2022年中国钢芯铝绞线市场现状调
- [基础教育]语文部编版初一语文下册练习题 句式变
- [基础教育]南京继续教育参考答案--深入学习贯彻习
- [基础教育]国旗下讲话稿——珍惜时间好读书
- [基础教育]北师大版六年级数学下册圆锥的体积教学
- [基础教育]人教版-音乐-四年级下册-四年级下册音
- [基础教育]乔布斯2019年斯坦福大学毕业典礼致辞.d
- [基础教育]2015年加油站安全知识竞赛试题及答案
- [基础教育]2020年教师年度考核个人工作总结
- [基础教育]2019年中考历史试题-2019年大庆市初中
- [基础教育]初三仁爱英语第一轮总复习教案
- [基础教育]SG-A094电气配管安装工程隐蔽验收记录
- [基础教育]冀教版小学数学三年级下册第六单元教材
- [基础教育]青岛版(五制)小学科学二年级下册16《制
- [基础教育]2018-2019年初中科学初一中考真卷测试
- [基础教育]幼儿园大班期末简短评语精选
- [基础教育]2018云南临沧公务员考试申论技巧:这样
- [基础教育]学校食堂经营管理方案
- [基础教育]新中国砥砺奋进的七十年原文
- [基础教育]真空泵的选型及常用计算公式
- 高职田径课程教学现状与对策
- 全髋关节置换术在老年股骨颈骨折患者中
- 青人社厅函〔2016〕576号(附件)工资
- cp101-07砂子检验作业指导书 - secret
- 微观经济学 第八章 博弈论 习题
- 2014高考真题(词语运用)汇编及答案
- 2018年人教版七年级语文下册《第三单元
- 苏教版数学四年级上册第一单元试题 - M
- 四川大学新闻与传播考研2000-2010年真
- 浙江万里学院英语专业四年制本科教学计
- 最新2018马年事业祝福语-范文word版(2
- 最全模具行业术语英文翻译
- 皮亚杰的发展心理学理论
- 64篇高考情景式默写 练习题及答案
- 仿写(学生稿)
- 《SQL Server数据库技术》试卷A
- 第七章作业答案
- 江苏省赣榆县海头高级中学高中语文必修
- 浙江省2001年10月自考正常人体解剖学答
- 2012英语重点短语




