2012-02-24 29 views
18

Tengo un aula llena de niños, cada uno de los cuales tiene que enumerar sus juguetes favoritos para una tarea. Algunos niños solo enumeran 1 juguete mientras que otros enumeran más.¿Cómo configuro una "matriz dentada" en VBA?

¿Cómo creo una matriz dentada tal que Kids (x) (y) ... donde x es la cantidad de niños en mi clase, y y es la lista de juguetes que enumeran como sus favoritos?

+1

Consulte mi respuesta a [Matriz de carga de Excel Arrays] (http://stackoverflow.com/q/8726625/973283) que explica acerca de las matrices irregulares. –

Respuesta

25

"matriz escalonada" es el argot de matriz de matrices. El tipo de datos Variant de VBA puede contener casi cualquier cosa *, incluida una matriz. Por lo tanto, crea una matriz del tipo Variant y asigna a cada uno de sus elementos una matriz de longitud arbitraria (es decir, no todos deben tener la misma longitud).

Aquí está un ejemplo:

Dim nStudents As Long 
Dim iStudent As Long 
Dim toys() As Variant 
Dim nToys As Long 
Dim thisStudentsToys() As Variant 

nStudents = 5 ' or whatever 

ReDim toys(1 To nStudents) ' this will be your jagged array 

For iStudent = 1 To nStudents 
    'give a random number of toys to this student (e.g. up to 10) 
    nToys = Int((10 * Rnd) + 1) 
    ReDim thisStudentsToys(1 To nToys) 

    'code goes here to fill thisStudentsToys() 
    'with their actual toys 

    toys(iStudent) = thisStudentsToys 
Next iStudent 

' toys array is now jagged. 

' To get student #3's toy #7: 
MsgBox toys(3)(7) 
'will throw an error if student #3 has less than 7 toys 

* Una excepción notable es tipos definidos por el usuario. Las variantes no pueden contener estos.

+0

Cuando recupera el 'thisStudentsToys', ¿se crea esencialmente una nueva ubicación de memoria? Pensé que las matrices en VBA son referencias. Solo quiero volver a verificar: en la segunda iteración del ciclo for, reescribir la matriz 'thisStudentsToys' no altera el primer índice de' juguetes' Por favor, avíseme si no me estoy dejando claro. Gracias –

5

Se puede utilizar una colección de colecciones

Public Sub Test() 

    Dim list As New Collection 
    Dim i As Integer, j As Integer 
    Dim item As Collection 
    For i = 1 To 10 
     Set item = New Collection 
     For j = 1 To i 
      item.Add "Kid" & CStr(i) & "Toy" & CStr(j) 
     Next j 
     list.Add item 
    Next i 

    Debug.Print "Kid 4, Toy 2 = " & list(4)(2) 
End Sub 

que da salida a Kid 4, Toy 2 = Kid4Toy2

+0

¿En qué se diferencia una colección de colecciones, con la que no estoy familiarizado, de una matriz de matrices o una matriz dentada? – phan

+1

Puede agregar y eliminar elementos de una colección, pero no de matrices. También puede acceder a elementos con una clave además de un índice si es necesario. Tal vez use el nombre o la identificación de los niños como clave para la colección. – ja72

2

También puede concatenar la lista de juguetes en, por ejemplo una cadena de tubos separados, a continuación, utilizar Split a girar la cadena en una matriz cuando sea necesario:

Sub UntangleTheString() 

Dim sToys As String 
Dim aToys() As String 
Dim x As Long 

sToys = "baseball|doll|yoyo" 

aToys = Split(sToys, "|") 

For x = LBound(aToys) To UBound(aToys) 
    Debug.Print aToys(x) 
Next 

End Sub 
3

Jean-Francois señaló que cada elemento puede ser una variedad de longitud variable. Añadiría que cada elemento también puede ser de otros tipos y no es necesario que sean matrices. Por ejemplo:

Dim c as New Collection 
Dim a(1 to 5) as Variant 

c.Add "a","a" 
c.Add "b","b" 
a(1) = 5 
a(2) = Array(2,3,4) 
set a(3) = c 
a(4) = "abcd" 
a(5) = Range("A1:A4").Value 

Los diversos elementos secundarios entonces se puede hacer referencia en función del tipo implícito de cada uno:

un (2) (1) = 3

un (3) (1) = "a"

a (5) (2,1) = lo que está en la celda A2.

1

No necesita necesariamente una matriz dentada para manejar su escenario ya que una matriz 2D (r, c) también funcionará. Una fila para cada niño y una columna para cada regalo. Las dimensiones de la matriz serán (número de hijos, número máximo de regalos) y solo significará que algunas de las ranuras estarán vacías o 0 (dependiendo de su tipo de datos). Pero al menos de esta manera no tendrá que redimidar la matriz cada vez que agregue un regalo para un niño.

Cuestiones relacionadas