2011-08-04 16 views
8

Sé que podemos definir gama única dimensión en Excel VBA utilizando la siguientePre definir matriz multi dimensional en Excel VBA

GroupCols = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L") 

Cómo se puede predefinir matriz multidimensional de la misma manera?

También quiero hacer un seguimiento de ciertos niveles de la siguiente manera

Level[16][0] 
Level[16][1] 
Level[16][2] 

Level[8][0] 
Level[8][1] 
Level[8][2] 

Level[7][0] 
Level[7][1] 
Level[7][2] 

El primer índice define el nivel y por lo tanto pueden no ser consecutivos ... como después del 16 no es recto 8 y así sucesivamente. Para cada uno necesito 3 información que es 0,1,2 segundos índices.

¿Alguien puede orientarme sobre cómo lograr lo mismo en Excel VBA?

Respuesta

9

No se puede tener índices no consecutivos en una serie así. Si solo utiliza un subconjunto no consecutivo de los índices, entonces todos los demás elementos estarán vacíos pero aún así agotará el espacio de almacenamiento, que es tanto ineficiente como propenso a errores (LaunchMissile = Levels(17,1), ¡gritos!).

Lo que estás buscando es el objeto Diccionario. Antes del uso, debe establecer la referencia de la siguiente manera: Herramientas> Referencias> comprobar Microsoft Scripting Runtime.

Ejemplo:

Dim Levels As Scripting.Dictionary 
Set Levels = New Scripting.Dictionary 

' Fill up the dictionary 
Levels.Add Key:=16, Item:=Array("A", "B", "C") 
Levels.Add Key:=8, Item:=Array("FAI", "CNT", "YES") 
Levels.Add Key:=7, Item:=Array("Once", "Twice", "Thrice") 

' Retrieve items from the dictionary 
Debug.Print Levels.Item(8)(0) 
Debug.Print Levels.Item(8)(1) 
Debug.Print Levels.Item(8)(2) 

Tenga en cuenta que un objeto de colección también podría hacer el truco. Ventaja: nativo de VBA, por lo que no es necesario establecer una referencia. Desventaja: la clave es de solo escritura, lo que puede ser bastante incómodo.

0

No hay forma de declarar y poblar una matriz bidimensional como cuando se utiliza la función de matriz(). Puede usar ReDim para definir las dimensiones de la matriz y luego rellenarla. He aquí un ejemplo:

ReDim myArray(0 To 16, 0 To 3) 
myArray(0, 0) = "A" 
myArray(0, 1) = "B" 
... 

Por desgracia, cuando se crea una matriz, se creará un elemento para cada entrada de la cota inferior a la cota superior. Estarán vacíos, pero están allí, por lo que debe ser consciente de ello, especialmente si planea recorrerlo.

3

Puede usar Array(Array()) para p.

data = Array(Array(1,2), Array(3,4)) 

para referirse al primer elemento, utilice data(0)(0)

(copiado from here)

+0

¿Por qué uno hacer esto en lugar de sólo una matriz de dos dimensiones? Esto parece demasiado intrincado, pero puede haber una razón ... –

+0

En algunos casos, le permite evitar una matriz casi vacía. –

+0

¿Cómo es eso? ¿Cómo la matriz de matrices 'data (i) (j)' no contendría el mismo número total de elementos que la matriz bidimensional equivalente 'data2D (i, j)'? –

8

No es una forma de definir una matriz 2D mediante el uso de evaluar() casi como el uso de array() de 1D:

Sub Array2DWithEvaluate() 

Dim Array2D As Variant 

'[] ist a shorthand for evaluate() 
'Arrays defined with evaluate start at 1 not 0 

Array2D = [{"1,1","1,2","1,3";"2,1","2,2","2,3"}] 

Debug.Print Array2D(2, 2) '=> 2,2 

End Sub 

Si desea utilizar una cadena para definir la matriz que tiene que usarlo como este

Sub Array2DWithEvaluateFromString() 

Dim strValues As String 
Dim Array2D As Variant 

strValues = "{""1,1"",""1,2"",""1,3"";""2,1"",""2,2"",""2,3""}" 

Array2D = Evaluate(strValues) 

Debug.Print Array2D(2, 2) '=> 2,2 

End Sub 

Si desea más información sobre otras aplicaciones de la función Evaluate() compruebe esta publicación excelente.

http://www.ozgrid.com/forum/showthread.php?t=52372