如何在VBA中重新定义数组?

6 ms-access vba

我正在尝试重新安装MS Access VBA中的数组.最有效的方法是什么?

Cur*_*che 13

怎么样...

这将保留MyArray中已有的数据

 Redim Preserve MyArray(15)
Run Code Online (Sandbox Code Playgroud)

这将删除MyArray中存在的任何先前数据

 Redim MyArray(15)
Run Code Online (Sandbox Code Playgroud)


Mar*_*old 11

重新定义数组的最有效方法是限制调整该数组大小的次数.每次调整数组大小时,VB都会占用整个数组并复制它,浪费时间和内存.

如果在开发时不知道数组的大小,则应该最好地猜测数组的最大大小,然后填充数组.完成填充阵列后,您可以将其调整到正确的大小.

在循环中,通常最好通过在空间不足时将当前数组的大小加倍来进行猜测.您可以在下面的操作中看到此操作,RedimTestA()每次迭代(1,000,000次)调整数组RedimTestB()大小,并且仅偶尔调整大小(22次).

我的笔记本电脑RedimTestA()需要3.93秒,RedimTestB()需要0.41秒.

Option Explicit

Sub RedimTest()
  Dim tA, tB As Single
  tA = RedimTestA(1000000)
  tB = RedimTestB(1000000)

  MsgBox "Test A takes : " & tA & ", and Test B takes : " & tB

End Sub


Function RedimTestA(iterations As Long) As Single
  Dim t As Single
  Dim i As Long
  Dim aryString() As String
  Dim myString As String

  t = Timer
  Do While i <= iterations
    ReDim Preserve aryString(i) As String
    aryString(i) = "ABCEFG123"
    i = i + 1
  Loop
  RedimTestA = Timer - t

End Function


Function RedimTestB(iterations As Long) As Single
  Dim t As Single
  Dim i As Long
  Dim aryString() As String
  Dim myString As String

  t = Timer

  ReDim aryString(0) As String
  Do While i <= iterations
    If i >= UBound(aryString) Then
      ReDim Preserve aryString(i * 2) As String
    End If

    aryString(i) = "ABCEFG123"
    i = i + 1
  Loop

  ReDim Preserve aryString(i - 1) As String ' i - 1 becuase of the final i = i + 1
  RedimTestB = Timer - t

End Function
Run Code Online (Sandbox Code Playgroud)

  • 哦,来吧 - 除非你在一个循环中重新调整1000次迭代,这实际上并不是一个现实的问题.我有大量的代码,ReDims阵列一直都没有性能和内存问题.另一方面,我不使用数组来存储1000个值(这就是表和记录集的用途). (2认同)

Ton*_*ews 9

另请注意,您只能重新创建多维数组的最右侧维度.

  • 这是一个需要考虑的重要细微注意事项. (2认同)