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

Это происходит из-за кеша, хранящегося в браузере. Перед запуском приложения вы можете удалить кеш и файлы cookie, сохраненные в вашем браузере.

6
задан 20 May 2009 в 23:16
поделиться

3 ответа

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

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

 Redim Preserve MyArray(15)

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

 Redim MyArray(15)
13
ответ дан 8 December 2019 в 02:46
поделиться

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

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

В циклах часто лучше делать это предположение, удваивая размер текущего массива, когда у вас заканчивается место. Вы можете увидеть это в действии ниже: 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
11
ответ дан 8 December 2019 в 02:46
поделиться

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

9
ответ дан 8 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: