TOP

VBA-Lección 13.2. Uso de matrices (Arrays) (continuación)

YouLibreCalc for Excel logo

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Í

matriz dinámica

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)

Ubound

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

Guardar datos en un rango de elementos de matriz

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).

Matriz (Array)

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

Convertir texto en matriz (VBA Split)

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