2012-01-26 24 views
7

Quiero tener una lista de arreglo en VBA, por lo tanto, tengo una variante declarada en Excel VBA como:matriz en Excel VBA

Dim Students(10) as variant 

Ahora quiero para almacenar números en la lista de estudiantes. los números no son continuos En algún momento como:

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

¿Cómo puedo hacer esto en vba? también ¿cómo puedo acceder a los elementos de la lista?

Respuesta

10

Los estudiantes deben ser declarados como una matriz dinámica. Es decir, una matriz cuyos límites se pueden cambiar. Dim Students(10) proporciona una matriz cuyos límites no se pueden modificar y no se pueden cargar desde una matriz.

Dim Students() As Variant 

Para cargar Estudiantes:

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

Para acceder a los elementos:

Dim Inx As Long 

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

LBound (límite inferior) y UBound quiere decir que el bucle se ajusta al número real de elementos de Estudiantes

+0

+1 ¡Buen trabajo! También tenga en cuenta que las matrices tienen un límite de cero por defecto. – JimmyPena

+1

@JP. Lo sé, pero de alguna manera, a menos que haya declarado explícitamente el límite inferior, no confío en que siempre será cero. –

3

Usted puede agregar valores a una matriz como esta ...

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

O como esta

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

A continuación, se puede acceder a los valores de la misma mansión. Nota Si utiliza la segunda opción que tendrá que declarar como sigue:

Dim Students() As Variant 
4

Esto es demasiado complejo para usted en este momento, y es probable que nunca se quedará en una situación en la que necesita esto, pero:

utilizo el siguiente método para formar más matrices de memoria eficiente (debido Variant usa la mayor cantidad de memoria de cualquier tipo de variable) al tiempo que tiene la conveniencia de declarar los contenidos de la matriz en una línea. Para seguir su ejemplo:

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 

Un ejemplo de acceder a él sería algo así como:

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

Aprendí esto de aquí: http://www.vbforums.com/showthread.php?669265-RESOLVED-VBA-Excel-Assigning-values-to-array-in-a-single-line&p=4116778&viewfull=1#post4116778

+0

Tenga en cuenta que solo necesita hacer esto para matrices que no sean de cadena, porque para la cadena simplemente puede hacer 'arrStrings() = Split (" Item1, Item2, Item3 ",", ",, vbtextcompare)' o lo que sea. – puzzlepiece87

0

Bueno, Eso depende de cómo se suministraría los valores para la matriz, obtendría los valores de Hoja de trabajo.Rango o de Cuadro de texto o Lista B buey, pero básicamente el código sería algo así:

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 

No es una buena práctica para atenuar una matriz como la variante cuando se sabe sin duda que se va a utilizar sólo enteros, ya que va a comer una gran cantidad de memoria que no es necesaria en primer lugar. También debe tener en cuenta los límites de los números que se asignarán, si excede el límite de Entero, entonces debe usar Doble o Float. Esta es mi primera participación en el sitio, Cheers.