TOP

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

Las matrices (Arrays) se utilizan con mucha frecuencia en la programación, incluso en Excel VBA.

Una matriz es esencialmente una sola variable con muchas celdas para almacenar valores, mientras que una variable típica tiene solo una celda de almacenamiento en la que puede almacenar solo un valor.

Se puede acceder a una matriz como un todo si desea hacer referencia a todos los valores que contiene, o puede hacer referencia a sus elementos individuales.

Puede declarar una matriz para trabajar con un conjunto de valores del mismo tipo de datos. Ya cubrimos esto en VBA-Lección 6.2. Tipos de datos, pero profundicemos aún más ahora...

¿Por qué se utilizan matrices?

Imagine que está tratando de escribir un procedimiento en el que necesita almacenar hasta 500 valores. Si tiene que crear 500 variables separadas, será muy difícil. En el medio de la matriz, almacenar y trabajar con estos valores será mucho más fácil.

La segunda razón para usar arreglos es su velocidad. La lectura de datos de matrices lleva mucho menos tiempo que de tablas (hechas de celdas) en la hoja de trabajo Excel.


Un ejemplo de uso de arreglos

Entonces, aquí hay un ejemplo que mostrará la ventaja obvia de usar arreglos VBA en Excel.

La primera hoja de trabajo ("DS") tiene un conjunto de datos: 5000 filas por 3 columnas:

En la segunda hoja, encontrará una tabla resumen que tiene en cuenta todas las respuestas "SI" por años y clientes:

En este caso, el procedimiento usará un ciclo para procesar el conjunto de datos y registrar el número de respuestas "Sí" para cada año y cada número de cliente, y luego ingresar esos datos en las celdas correspondientes.

Sin usar arreglos, tomaría Excel 131.44 segundos ejecutar este procedimiento:

Pero guardar primero los datos en una matriz (de la hoja de trabajo "DS") y luego realizar los mismos cálculos (utilizando las matrices en lugar del conjunto de datos de la hoja de trabajo "DS") tomará solo 1,74 segundos:

Si decidimos optimizar nuestro procedimiento almacenando solo los datos que contienen respuestas "SÍ" en la matriz (que es aproximadamente 3/4 de todos los datos), entonces solo tomaría 1,02 segundos:

Este es un buen ejemplo de cómo el uso de matrices le permite realizar un procedimiento 128 veces más rápido. El resultado de nuestra optimización sería aún mejor si trabajáramos con muchos conjuntos de datos al mismo tiempo.

Volveremos a los detalles de nuestro ejemplo al final de la lección.

Declaración de matrices

A continuación se muestran algunos ejemplos de cómo declarar matrices en VBA (si los primeros dos ejemplos no le resultan claros, relee esto):

 'Un ejemplo de declaración de una matriz unidimensional
 Dim array1(4)

 'Un ejemplo de declaración de una matriz bidimensional
 Dim array2(6, 1)

 'Un ejemplo de declaración de una matriz dinámica
 Dim array3()

Si no puede ingresar valores fijos al declarar matrices (porque dependen, por ejemplo, del tamaño del conjunto de datos), deje los paréntesis vacíos.

No es necesario que declare un tipo de datos (cadena, largo, etc.), aunque en muchos casos esto ralentizará la ejecución de su procedimiento.

Almacenamiento de datos en una matriz

Intentemos almacenar algunos datos en una matriz:

En este caso, queremos almacenar valores de 11x1, por lo que debemos crear una matriz unidimensional:

 'Declaración
 Dim array_example(10)

No olvide que la numeración de los elementos en la matriz comienza con 0 (esto es estándar en programación, por lo que vale la pena adquirir este hábito de inmediato, aunque, de hecho, puede cambiar este enfoque en VBA).

Cada elemento de la matriz ahora recibirá su valor:

 'Guardar valores en una matriz
 array_example(0)  = Range("A2")
 array_example(1)  = Range("A3")
 array_example(2)  = Range("A4")
 array_example(3)  = Range("A5")
 array_example(4)  = Range("A6")
 array_example(5)  = Range("A7")
 array_example(6)  = Range("A8")
 array_example(7)  = Range("A9")
 array_example(8)  = Range("A10")
 array_example(9)  = Range("A11")
 array_example(10) = Range("A12")

Puede operar o modificar cada elemento de la matriz como si fuera una variable normal.

El siguiente es un ejemplo donde usamos array_example(8):

Sub example()
     'Declaración
     Dim array_example(10)
     
     'Guardar valores en una matriz
     array_example(0)  = Range("A2")
     array_example(1)  = Range("A3")
     array_example(2)  = Range("A4")
     array_example(3)  = Range("A5")
     array_example(4)  = Range("A6")
     array_example(5)  = Range("A7")
     array_example(6)  = Range("A8")
     array_example(7)  = Range("A9")
     array_example(8)  = Range("A10")
     array_example(9)  = Range("A11")
     array_example(10) = Range("A12")
     
     'Prueba 1
     MsgBox array_example(8) '=> vuelve: 02/04/2016
    
     'Cambiando uno de los valores
     array_example(8) = Year(array_example(8))
     
     'prueba 2
     MsgBox array_example(8) '=> devuelve: 2016
End Sub

Un bucle For sería una mejor opción para guardar la matriz más rápido:

 'Declaración
 Dim array_example(10)

 'Guardar valores en una matriz
 For i = 0 To 10
    array_example(i) = Range("A" & i + 2)
 Next