Динамическое измерение массива VBA?

19

Почему мне не удается установить размер массива на основе переменной? Каков наилучший способ этого?

Dim NumberOfZombies as integer
NumberOfZombies = 20000
Dim Zombies(NumberOfZombies) as New Zombie
    
задан sooprise 01.12.2010 в 17:41
источник

4 ответа

37

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

Dim Zombies() As Integer
ReDim Zombies(NumberOfZombies)

Или вы можете сделать все с помощью одного оператора, если вы создаете массив, который является локальным для процедуры:

ReDim Zombies(NumberOfZombies) As Integer

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

Вы можете использовать константу, если знаете, что значение переменной не изменилось:

Const NumberOfZombies = 2000

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

    
ответ дан Cody Gray 01.12.2010 в 17:51
источник
  • Почему, но это неправильный ответ. ReDim Zombies (NumberOfZombies) объявили бы массивы с NumberOfZombies + 1 elemnts, а не только NumberOfZombies. –  Ans 30.08.2017 в 12:12
3

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

Public Sub Test()
    Dim NumberOfZombies As Integer
    NumberOfZombies = 20000
    Dim Zombies() As New Zombie
    ReDim Zombies(NumberOfZombies)

End Sub

Это может показаться странным, когда вы уже знаете размер вашего массива, но там вы идете!

    
ответ дан Chris Spicer 01.12.2010 в 17:55
источник
2

Вы также можете изучить использование объекта Collection. Обычно это работает лучше, чем массив для пользовательских объектов, поскольку он динамически размер и имеет методы для:

  • Добавить
  • Count
  • Удалить
  • Пункт (индекс)

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

    
ответ дан Fink 01.12.2010 в 18:53
источник
1

Вам нужно использовать константу.

CONST NumberOfZombies = 20000
Dim Zombies(NumberOfZombies) As Zombies

, или если вы хотите использовать переменную, вы должны сделать это следующим образом:

Dim NumberOfZombies As Integer
NumberOfZombies = 20000

Dim Zombies() As Zombies

ReDim Zombies(NumberOfZombies)
    
ответ дан carny666 01.12.2010 в 17:43
источник
  • Есть ли более аккуратный способ бросить NumberOfZombies в качестве права CONST в определении размера? Dim Zombies (CONST NumberOfZombies) как новый зомби –  sooprise 01.12.2010 в 17:44
  • Я отправил свой ответ, прежде чем закончил печатать. –  carny666 01.12.2010 в 17:46
  • О, я вижу, поэтому переменную можно использовать для определения измерения, если используется Redim, что полезно знать, спасибо! –  sooprise 01.12.2010 в 17:48