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

时间:2009-05-20 23:16:07

标签: ms-access vba

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

3 个答案:

答案 0 :(得分:13)

怎么样......

这将保留已存在于MyArray中的数据

 Redim Preserve MyArray(15)

这将删除MyArray中存在的所有先前数据

 Redim MyArray(15)

答案 1 :(得分: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

答案 2 :(得分:9)

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