Как вы переопределяете массив в VBA?

Я пытаюсь rediminsion массива на VBA в MS доступа. Каков наиболее эффективный способ сделать это?

3 ответов


Как насчет...

это сохранит данные уже в MyArray

 Redim Preserve MyArray(15)

это сотрет все предыдущие данные, существующие в MyArray

 Redim MyArray(15)

самый эффективное способ переопределения массива-ограничить количество раз, когда вы изменяете размер этого массива. Каждый раз, когда вы изменяете размер массива, VB берет весь массив и копирует его, тратя время и память.

если вы не знаете размер вашего массива во время разработки вы должны сделать лучшее предположение на максимальный размер массива, а затем заполнить массив. После завершения заполнения массива вы можете изменить его размер до нужного размера.

в петлях часто лучше всего сделать это предположение, удвоив размер текущего массива, как только у вас закончится пространство. Вы можете увидеть это в действии с RedimTestA() изменение размера массива в каждой итерации (1000000 раз) и 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

также обратите внимание, что вы можете только redim право наибольшее измерение многомерного массива.