Как вы масштабируете массив в VBA? - PullRequest
6 голосов
/ 21 мая 2009

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

Ответы [ 3 ]

13 голосов
/ 21 мая 2009

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

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

 Redim Preserve MyArray(15)

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

 Redim MyArray(15)
11 голосов
/ 21 мая 2009

Наиболее эффективный способ переразмерения массива - это ограничение количества раз, когда вы изменяете размер этого массива. Каждый раз, когда вы изменяете размер массива, 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
9 голосов
/ 21 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...