Para almacenar más de una columna de datos, necesitamos una dimensión diferente de la matriz. Ejemplo:
Guardar datos en una matriz bidimensional:
'Declaración Dim array_example(10, 2) 'Matriz "definida" de 11 x 3 'Guardar datos en una matriz For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
Estos son algunos ejemplos de cómo trabajar con estos valores:
MsgBox array_example(0, 0) '=> devuelve: 03.11.2026 MsgBox array_example(0, 1) '=> devuelve: 24 MsgBox array_example(9, 2) '=> devuelve: NO MsgBox array_example(10, 2) '=> devuelve: SÍ
Imaginemos por un momento que necesitamos actualizar los datos de nuestro arreglo regularmente, y por lo tanto no podemos asignar valores fijos en el momento de la declaración...
Para saber el número de fila de la última celda no vacía, es decir, la última fila de nuestra base de datos, utilizaremos la siguiente fórmula:
last_row = Range("A1").End(xlDown).Row
Excel no acepta variables en la declaración.
En su lugar, declare una matriz dinámica (usando paréntesis vacíos), luego defina su tamaño usando Redim:
Dim array_example() ReDim array_example(last_row - 2, 2)
Con el siguiente procedimiento, puede almacenar todas las filas de su conjunto de datos (tabla) en nuestra matriz:
Dim array_example() ReDim array_example(last_row - 2, 2)
En el ejemplo anterior, el último número de nuestra matriz era last_row - 2:
For i = 0 To last_row - 2
Otra forma de determinar el último número en nuestra matriz podría ser usando Ubound:
For i = 0 To UBound(array_example)
Esta función devuelve el número más grande de la matriz para la dimensión seleccionada (la primera dimensión es la predeterminada).
Aquí hay algunos ejemplos que lo harán más claro:
Sub example() Dim array_example(10, 2) MsgBox UBound(array_example) '=> devuelve: 10 MsgBox UBound(array_example, 1) '=> devuelve: 10 MsgBox UBound(array_example, 2) '=> devuelve: 2 End Sub
Es posible llenar una matriz con valores de un rango de celdas en una hoja de trabajo sin siquiera usar un bucle:
'Declaración Dim array_example(10, 2) 'Matriz "definida" de 11 x 3 'Guardar datos en una matriz For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
El código anterior puede ser efectivamente reemplazado por este:
'Declaración Dim array_example() 'Guardar datos en una matriz array_example = Range("A2:C12").Value
Aunque el segundo método parece más atractivo que el primero, tenga en cuenta que en la mayoría de los casos puede costarle más tiempo implementarlo que el primero.
Si almacena los datos en su matriz de esta manera, el primer número será 1 en lugar de 0, lo que puede causar confusión...
Más adelante en el proceso de aumentar el código, si decide almacenar solo los datos que cumplen con ciertos criterios de búsqueda en la matriz (o realizar una operación completamente diferente), tendrá que reescribir completamente el código usando una función de bucle diferente...
Pero este segundo método es bastante útil si necesita guardar todo el contenido de un gran conjunto de datos, porque es más rápido que el bucle (ahorra alrededor de 0,2 segundos por cada 15.000 registros).
Pero si necesita crear una matriz que tenga contenidos "fijos".
Una solución podría ser registrar los valores cinta por cinta:
Dim en(5) en(0) = "IF" en(1) = "VLOOKUP" en(2) = "SUM" en(3) = "COUNT" en(4) = "ES NÚMERO" en(5) = "MID"
Afortunadamente, puede simplificar este código usando una matriz (Array):
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ES NÚMERO", "MID")
Aquí hay una demostración del uso de la función Reemplazar (esto lo ayudará a comprender el siguiente ejemplo):
Sub replace_example() Dim var_translate As String 'Cinta de texto para este ejemplo var_translate = "Hello World !" 'Reemplace "Mundo" con "usted" en la cinta de texto var_translate = Replace(var_translate, "World", "you") 'Cinta después del reemplazo MsgBox var_translate '=> devuelve "¡Hola!" End Sub
Ahora bien, si queremos reemplazar una serie de valores por otro conjunto de datos, usar arreglos y la función Array será sumamente útil:
Sub translate() 'Un ejemplo simplificado de traducción de fórmulas del inglés al francés Dim var_translate As String 'Cinta de texto para este ejemplo var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))" 'Dos conjuntos de valores en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ES NÚMERO", "MID") fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT") 'Reemplace "SI" con "IF", "RECHERVEV" con "BUSCARV", etc. For i = 0 To UBound(en) var_translate = Replace(var_translate, en(i), fr(i)) Next 'Cinta después del reemplazo MsgBox var_translate '=> devuelve "Formula para traducir: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))" End Sub
La función Split nos permite dividir una cadena de caracteres en partes y escribir los valores resultantes en una matriz.
Para convertir una cinta en una matriz, haga lo siguiente:
variable = "IF/BUSCARV/SUMA/CUENTA/ESNUMERO/MEDIO"
Utilice la función VBA Split y especifique el separador:
en = Split(variable, "/")
La matriz "en" devolverá los siguientes valores:
MsgBox en(0) '=> devuelve: IF MsgBox en(1) '=> devuelve: BUSCARV MsgBox en(2) '=> devuelve: SUMA MsgBox en(3) '=> devuelve: CONTAR MsgBox en(4) '=> devuelve: ESNUMERO MsgBox en(5) '=> devuelve: MID
Las siguientes 3 matrices también devolverán los mismos valores:
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ES NÚMERO", "MID") en = Split("IF,BUSCARV,SUMA,CONTADOR,ESNÚMERO,MEDIO", ",") en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")
El siguiente ejemplo devuelve el tercer valor en la cadena:
MsgBox Split("IF,BUSCARV,SUMA,CONTADOR,ESNÚMERO,MEDIO", ",")(2) '=> devuelve: SUMA
El inverso de Split es la función VBA Join.
Esta función recopila los valores de una matriz en una cadena.
MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> devuelve: 12345