教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 基础教育 >

菜鸟也懂VBA-excle2007VBA入门教程(15)

来源:网络收集 时间:2026-04-01
导读: Excel 2007 VBA 教程 第十三讲 VBA数组基础(一) 一. 什么是数组? VBA数组就是储存一组数据的数据空间,它是由连续可索引的且具有相同的数据类型成员集合。数组中的每一个成员都具有唯一的索引号,数组存在于内存

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字,全部文档内容请下载后查看。喜欢就下载吧 ……

菜鸟也懂VBA-excle2007VBA入门教程(15).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/566040.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)