2012-01-26 3 views
7

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

Dim Students(10) as variant 

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

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

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

ответ

10

Студенты должны быть объявлены как динамические массивы. То есть массив, границы которого могут быть изменены. 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 означает, что цикл приспосабливается к фактическому числу элементов в Студенты.

+0

+1 Хорошая работа! Также обратите внимание, что по умолчанию массивы привязываются по нулевой отметке. – JimmyPena

+1

@JP. Я знаю, но почему-то, если я явно не объявил нижнюю границу, я не верю, что она всегда будет равна нулю. –

3

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

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 
4

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

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

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

+0

Обратите внимание, что вам нужно сделать это только для нестроковых массивов, потому что для строки вы можете просто сделать 'arrStrings() = Split (" Item1, Item2, Item3 ",", ",, vbtextcompare)' или что-то еще. – puzzlepiece87

0

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

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 

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

Смежные вопросы