VBA进阶 | 数组基础05: 动态数组
微信公众号:excelperfect
前面讲解的数组都是在声明时就指定了维数和大小,它们称之为固定数组。在不知道要使用多大数组的情形下,可以声明一个尽可能大的固定数组。但是,数组是存储在计算机内存中的,如果声明的数组越大,浪费的内存就越多。此时,可以考虑使用动态数组。
例如,使用数组来存储用户输入的数据,但是无法知道用户究竟会输入多个数据,此时,可以声明和使用动态数组来解决。
动态数组是指没有设置大小的数组,允许在程序运行时使用ReDim语句重新定义数组的大小。
声明动态数组
使用下面的语句,通过忽略数组维数来声明动态数组:
Dim 数组名() As 数据类型
当然,也可以使用语句声明Variant型的数组:
Dim 数组名()
然后,在需要使用该数组时,使用ReDim语句来设置该数组的大小。
下面的示例将当前工作簿中所有工作表的名字存储在数组myArray中。由于事先不知道工作簿中有多少工作表,因此声明一个动态数组。
SubtestDynamicArray()
"声明一个字符型的动态数组
Dim myArray() As String
Dim iCount As Integer, iWks As Integer
iWks = ActiveWorkbook.Worksheets.Count
"设置数组大小
ReDim myArray(1 To iWks)
For iCount = 1 To iWks
myArray(iCount) =ActiveWorkbook.Sheets(iCount).Name
Next iCount
End Sub
保留动态数组中的数据
每次使用ReDim语句时,都会初始化数组,即清除该数组中原来存储的数据内容。如果要保留原来的数据,那么要加上Preserve关键字。
实际上,ReDim语句的作用是创建一个新的数组,而Preserve关键字的作用则是指原数组中的数据复制到新数组中。
注意,如果使用ReDim语句重新定义的数组大小比原数组要小,则无论是否使用Preserve关键字,肯定会丢失掉那部分被减少了的元素数据。
下面的示例,收集用户在文本框TextBox1中输入的数据,单击CommandButton2按钮时显示用户已经输入过的数据。
Dim myArray() AsString
Dim iCount AsInteger
Private SubCommandButton1_Click()
"保留原数组的值并将数组变大
ReDim Preserve myArray(iCount)
"将用户输入的文本存储在数组中
myArray(iCount) = Me.TextBox1.Text
iCount = iCount + 1
Me.TextBox1.Text = ""
End Sub
Private SubCommandButton2_Click()
Dim str As String
Dim i As Integer
str = "用户已输入的内容是:"
For i = LBound(myArray) To UBound(myArray)
str = str & vbCr & myArray(i)
Next i
MsgBox str
End Sub
运行上述代码后的结果如图1所示。
图1
下面的示例搜索指定路径下的所有Excel文件,并在数组中存储其文件名。由于不知道文件夹里面有多少所需要的文件,因此无法指定数组的实际大小。
SubtestDynamicArray1()
Dim strName As String
Dim strFileNames() As String
Dim iCount As Integer, i As Integer
"获取指定类型的文件名
"将其存储在数组中
strName = Dir("G:\09.Excel\*.xls*")
Do Until strName = ""
iCount = iCount + 1
ReDim Preserve strFileNames(1 ToiCount)
strFileNames(iCount) = strName
strName = Dir
Loop
"将数组中存储的文件名输出到工作表
For i = 1 To UBound(strFileNames)
Worksheets("Sheet1").Range("A" & i) =strFileNames(i)
Next i
End Sub
上述代码首先使用Dir函数在指定路径中找到与*.xls*相匹配的第一个文件,将其保存在数组中,接着获取下一个相匹配的文件,并将其保存在数组中,直至找不到相匹配的文件并返回一个零长度字符串。
注意,如果数据很多,那么在使用Preserve时,会减慢程序代码的运行速度。
可以定义二维或三维以上的动态数组,并且使用ReDim语句可以改变数组的维数,但是使用Preserve关键字只能改变多维数组最后一维的大小,而不能改变数组的维数。
Erase语句
Erase语句可以清空数组,使其重新成为赋值前的状态。
可以使用Erase语句一次清空多个数组,数组之间用逗号隔开。
使用Erase语句后,固定大小的数组将保持其维数,而动态数组将释放其使用的所有内存空间。
如果使用Erase语句清除了动态数组,那么再次使用该数组之前要使用ReDim语句重新定义维数。
相关文章(单击文章标题即可查看详细页面):
VBA进阶 | 数组基础01: 用最浅显的介绍来帮你认识数组
VBA进阶 | 数组基础02: 简单的数组操作
VBA进阶 | 数组基础03: 二维数组
VBA进阶 | 数组基础04: 运用数组处理工作表数据
本文属原创文章,转载请联系我(xhdsxfjy@163.com)或者注明出处。
欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
欢迎关注[完美Excel]微信公众号:
方法1—在微信“添加朋友”或者通讯录中搜索“完美Excel”或者“excelperfect”后点击关注。
方法2—扫一扫下面的二维码
别忘了,留言、点赞、点击每篇文章底部的广告,也是给我的支持和鼓励哟!
- 亲历三年V峰会,看微博的平台化进阶
- 免费赠书 | 评论区留言就送《Android进阶之光》
- 托福预备进阶班
- Java程序员编程的10个正确姿势
- 线上公开课 Vol.5 | 小白进阶之路
- 平台型产品经理如何突破进阶中级瓶颈?
- 福利放送! 价值4000元的A-Level进阶数学系列公开课不要错过!名
- 进阶AI工程师 不只有理论知识 你还要掌握这些方法和工具
- ArrayList 底层数组扩容原理
- 从0到1:十五天完成达芬奇影视调色的进阶之路