ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > Excel VBA > VBA数组学习(一)

VBA数组学习(一)

作者:绿色风 分类: 时间:2022-08-17 浏览:149
楼主
wise
本人是新手,目前还在学习阶段,数组对我来说,一直都是觉得不怎么掌握。本文整合以前在EP的东西及网上找来的资料,如有侵权,请见谅。
一.初识数组
1. 数组就是一个列表或一组数据表。学习数组的目的,就是为了加速VBA代码的效率。
2. 我们如何运用数组呢?
1)声明数组
2)给数组赋值
3)将数组返回到工作表区域中
3. 调试数组的手段:本地窗口
可以通过设置Stop语句,或F8逐步执行代码,在本地窗口中观测数组的变化。
  1. Sub test()
  2. Dim arrSheetName(5) As String
  3. Stop
  4. End Sub
4. 数组的优势与不足
数组的速度优势是明显的,但不足也很明显,因为数组处理的都是数据,因此,它不能给EXCEL数据添加颜色,删除行列,插入行列等等动作。
5. VBA数组没有内存数组和一般数组之分。在声明数组时,就已经将数组写入内存里。
2楼
wise
二. 声明数组
声明一个数组变量,也是用Dim语句来声明。
(当声明了一个数组,便决定了这个数组用于存储数据所用的内存空间。)
Dim arrCnt(10) As Integer
Dim arrSheetName(5) As String
Dim arr(7) As Variant
1)带括号的数字——这个数组所能存储的最大元素数
2)数组也可以有不同的数据类型,可以是Integer,Long,String,Variant 等等。
注意:上面定义数组的例子是静态数组,即我们在声明数组时,就决定了数组占用内存空间的大小。
3楼
wise
三. 数组的上界和下界
1.默认下界
VBA中,数组默认的下界是0,也就是Option Base 0
如果,我们习惯了用1作为我们的下界,可以强制声明:Option Base 1
注:Option Base 0(1)必须放在所有模块之前,并且对生成数组的函数Array不起作用。
2.自定义上下界
当然,也可以忽略这个强制声明,那就需要在声明数组时,指明数组的上界和下界,如:
Dim arrSheetName(1 to 3) as String
表明这个数组的上下界分别是1和3。
注意:上界和下界可以是任意整数,不是一定要从0或1开始,但是上界一定要大于等于下界。
Dim arrSheetName(-1 to 3) as String
4楼
wise
四. 一维数组和多维数组
数组可以定义多达60维。
但很少看到多过2维的代码。这也是因为对于Excel的工作表来说,行和列,就是表示2维,处理的数据区域很多都是围绕行和列进行处理。
1. 定义一个二维数组
  1. Sub test2()
  2.     Dim arrSheetName(1 To 3, 1 To 1) As String
  3.     Stop
  4. End Sub

2. 定义一个三维数组
  1. Sub test3()
  2.     Dim arrSource(1 To 10, 1 To 6, -1 To 5) As Long
  3.     Stop
  4. End Sub
5楼
wise
五. 静态数组和动态数组
静态数组——知道数组的大小,直接声明,程序运行过程不能改变其大小;
动态数组——事先不知道数组大小,程序运行过程可以改变其大小。
1. 动态数组是可以改变大小的数组,通过在数组名称后附带空括号来声明,如:
  1. Dim arrSheetName() as String

2. 在定义动态数组之后,必须使用ReDim来设置动态数组的上界和下界,为数组重新分配存储空间。
3. 使用ReDim语句反复地改变数组的元素个数和维数。
  1. '改变数组的大小和维数
  2. Sub arr1()
  3.     Dim arr()
  4.     Dim i As Long
  5.    
  6.     ReDim arr(1 To 3)
  7.     For i = 1 To 3
  8.         arr(i) = i
  9.     Next
  10.     Sheet1.Range("A1").Resize(1, 3) = arr
  11.    
  12.     Stop
  13.     ReDim arr(1 To 2, 1 To 4)
  14.     arr = Sheet1.Range("A1").Resize(2, 4)
  15.    
  16.     Stop
  17.     For i = 1 To 4
  18.         arr(2, i) = i
  19.     Next
  20.     Sheet1.Range("A1").Resize(2, 4) = arr
  21. End Sub

4. ReDim Preserve语句
Preserve 英文的意思是保留,保存。顾名思义,就是重新定义数组时,将数组元素保留在数组中。
与ReDim不同的是,使用了ReDim Preserve,只能通过改变上界,即最末维的大小,来改变数组的大小,且不能改变数组维数。如果改变了下界,就会出现错误信息。
1) 扩充1维数组
  1. '扩充一维数组
  2. Sub arr2()
  3. Dim arr()
  4. arr = Array(1, 2, 3)
  5. Stop
  6. ReDim Preserve arr(UBound(arr) + 1)
  7. Stop
  8. End Sub

2) 扩充2维数组
  1. '扩充二维数组
  2. Sub arr3()
  3. Dim arr()
  4. arr = Range("A1:E1")
  5. Stop
  6. ReDim Preserve arr(1 To 1, 1 To UBound(arr, 2) + 1)
  7. Stop
  8. End Sub
6楼
wise
六. 释放数组
在某些情况下,我们根据需要来释放数组来重新定义数组,或避免数据堆栈。
Erase语句:重新初始化大小固定的数组元素,以及释放动态数组的存储空间。即,Erase可以删除静态数组和动态数组里的数据元素。

  1. Sub Erase1()
  2.     Dim arr(1 To 100) As Integer
  3.     arr(1) = 1
  4.     MsgBox arr(1)
  5.     MsgBox UBound(arr)
  6.    
  7.     Erase arr
  8.     MsgBox arr(1)
  9.     MsgBox UBound(arr)
  10. End Sub

从上面的代码中,我们可以看到,Erase语句用于清除数组元素,对静态数组维数和上标是没有改变的。
而对于动态数组,Erase 语句在释放动态数组所使用的内存后。在下次引用该动态数组之前,程序必须使用 ReDim 语句来重新定义该数组变量的维数。
  1. Sub Erase2()
  2.     Dim arr() As Integer
  3.    
  4.     ReDim arr(1 To 100)
  5.     arr(1) = 1
  6.     MsgBox arr(1)
  7.     MsgBox UBound(arr)
  8.    
  9.     Erase arr
  10.     'ReDim arr(1 To 10)
  11.     MsgBox arr(1)
  12.     MsgBox UBound(arr)
  13. End Sub
7楼
赵文竹
我现在也正在学习数组,老找不到感觉,呵呵,版主的内容真好,跟帖学习了……谢谢!想点击收藏,以便下次查找,为什么看不到收藏按钮呢?
8楼
DJ_Soo
好,支持一下小7~
9楼
wangqilong1980
好,支持一下小7~
10楼
coverme
好,支持一下小7~
11楼
mn860429
跟着学习,我是真正的新手
12楼
老糊涂
系统学习数组
13楼
keven
zanyige !!!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap