¿Cómo configuro una “matriz dentada” en VBA?

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 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?

“Arreglo irregular” es jerga para una matriz de matrices. El tipo de datos Variant de VBA puede contener casi cualquier cosa *, incluida una matriz. Por lo tanto, crea una matriz de tipo Variant y asigna a cada uno de sus elementos una matriz de longitud arbitraria (es decir, no todos tienen que tener la misma longitud).

Aquí hay 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 (eg 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 son los tipos definidos por el usuario. Las variantes no pueden contener estos.

Puedes usar 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 

Qué salidas Kid 4, Toy 2 = Kid4Toy2

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 diferentes elementos secundarios pueden referenciarse según el tipo implícito de cada uno:

a (2) (1) = 3

a (3) (1) = “a”

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

También podría concatenar la lista de juguetes en, por ejemplo, una cadena separada por tubería, y luego usar División para convertir 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 

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.