本文系因违规而删除的2017年10月21日推送文章经修改后重新推送,已看过的朋友可直接飘过,免得浪费时间。
前面讲解的数组都是在声明时就指定了维数和大小,它们称之为固定数组。在不知道要使用多大数组的情形下,可以声明一个尽可能大的固定数组。但是,数组是存储在计算机内存中的,如果声明的数组越大,浪费的内存就越多。此时,可以考虑使用动态数组。
例如,使用数组来存储用户输入的数据,但是无法知道用户究竟会输入多个数据,此时,可以声明和使用动态数组来解决。
动态数组是指没有设置大小的数组,允许在程序运行时使用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: 运用数组处理工作表数据
本文属原创文章,转载请注明出处。
欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。
联系客服