打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VBA进阶 | 数组基础05: 动态数组

 

本文系因违规而删除的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: 运用数组处理工作表数据



 

本文属原创文章,转载请注明出处。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VBA数组基础学习
第8章 数组
asp?vbscript?数组的使用
VBScript 变量
VBA进阶 | 数组基础06: 与数组相关的函数——Array函数与IsArray函数
[vb数组2]Redim动态数组
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服