Как вы переопределяете массив в 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 право наибольшее измерение многомерного массива.