Массив в Excel VBA - PullRequest
       4

Массив в Excel VBA

12 голосов
/ 26 января 2012

Я хочу иметь список массивов в vba, поэтому у меня есть вариант, объявленный в Excel vba, например:

Dim Students(10) as variant

Теперь я хочу сохранить числа в списке студентов.числа не являются непрерывными.Примерно так:

Students(2,7,14,54,33,45,55,59,62,66,69)

Как я могу сделать это в VBA?также как я могу получить доступ к элементам списка?

Ответы [ 4 ]

14 голосов
/ 26 января 2012

Студенты должны быть объявлены как динамический массив. То есть массив, границы которого можно изменить. Dim Students(10) дает массив, границы которого не могут быть изменены и не могут быть загружены из массива.

Dim Students() As Variant

Чтобы загрузить студентов:

Students = Array(2,7,14,54,33,45,55,59,62,66,69)

Для доступа к элементам:

Dim Inx As Long

For Inx = LBound(Students) to UBound(Students)
  Debug.Print Students(Inx)
Next

LBound (нижняя граница) и UBound означают, что цикл for подстраивается под фактическое количество элементов в Student.

5 голосов
/ 22 мая 2015

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

Я использую следующий метод для формирования более эффективных для памяти массивов (потому что Variant использует больше всего памяти любого типа переменной), сохраняя удобство объявления содержимого массива в одной строке. Чтобы следовать вашему примеру:

Dim Students() As Long
Dim Array2() As String

Array2() = Split("2,7,14,54,33,45,55,59,62,66,69", ",")

ReDim Array1(0) As Long
For Loop1 = LBound(Array2()) To UBound(Array2())
    ReDim Preserve Array1(0 To (UBound(Array1) + 1)) As String
    Array1(Loop1) = Array2(Loop1)
Next Loop1
ReDim Preserve Array1(0 To (UBound(Array1) - 1)) As Long

Erase Array2

Пример доступа к нему будет выглядеть примерно так:

For Loop1 = LBound(Students) to UBound(Students)
    Msgbox Students(Loop1)
Next Loop1

Я узнал об этом здесь: http://www.vbforums.com/showthread.php?669265-RESOLVED-VBA-Excel-Assigning-values-to-array-in-a-single-line&p=4116778&viewfull=1#post4116778

3 голосов
/ 26 января 2012

Вы можете добавить значения в массив, как это ...

For i = 1 to 10
    Students(i) = i
Next i

Или вот так

Students = Array(2,7,14,54,33,45,55,59,62,66,69)

Тогда вы можете получить доступ к значениям в той же усадьбе. Обратите внимание, что если вы используете второй вариант, вам нужно объявить его следующим образом:

Dim Students() As Variant
0 голосов
/ 31 августа 2015

Ну, это зависит от того, как вы предоставите значения для массива, получите ли вы значения из Worksheet.Range или из TextBox или ListBox , Но в основном код будет выглядеть примерно так:

Dim students(10) as Integer
Dim Carrier as Integer
For i = LBound(students) To UBound(Students)
     'some code to get the values you want to from whatever is your source
     'then assign the value to Carrier

     students(i)=Carrier
Next i

Не рекомендуется уменьшать размер массива как вариант, если вы точно знаете, что собираетесь использовать только целые числа, так как он потребляет многопамять, которая не нужна в первую очередь.Вам также следует помнить о границах номеров, которые будут назначены, если они превышают целочисленный предел, вам следует использовать Double или Float.Это мое первое участие на сайте, ура.

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