Un arreglo (Array) es un grupo de ítems “empaquetados” en una única variable; en VBA y en muchos otros lenguajes de programación encontraremos los Arrays como estructuras de uso común.
Definir un Array en VBA
Los meses del año son un ejemplo ilustrativo. Si necesitáramos guardar la información de cada periodo sin usar los Arrays deberíamos recurrir a doce (12) variables, una por mes. Para facilitar el manejo, podríamos generar un arreglo con 12 argumentos, uno por cada mes del año. Tenemos varias formas para declarar estos arreglos:
Opción 1 | Dim Mes(1 To 12) As Integer |
Opción 2 | Dim Mes(1,12) |
Opción 3 | Dim Mes(11) |
Opción 4 | Option Base 1 Dim Mes(12) |
Las dos primeras opciones son las más intuitivas: la primera genera un arreglo de 12 elementos, desde el elemento 1 hasta el 12. La segunda opción tiene una estructura matricial, por ello puede que nos resulte familiar. Puedes revisar el tutorial de Loops en VBA, así como los Tips y atajos en VBA de Seleccionar una celda o Encontrar última celda ocupada.
Los arreglos en VBA comparten en cierta forma la sintaxis con otros lenguajes en donde se maneja por defecto el cero como numero base, por lo tanto el arreglo como se describe en la opción 3, va desde el número 0 hasta el 11, es decir, 12 elementos. Sin embargo, para hacer la actividad más intuitiva, VBA nos permite cambiar la base por defecto a través de la declaración Option Base 1, así como lo vemos en la opción 4. Es recomendable que la declaración Option Base 1 se coloque al inicio de cada módulo.
Dimensionamiento del Arrays
A diferencia de las variables cuya declaración era opcional (puedes revisar un poco más en el tutorial de variables en VBA), la dimensión del arreglo debe ser previamente declarada antes de comenzar a introducir elementos en él.
Los ejemplos hasta ahora mostrados son unidimensionales, para mayor facilidad de comprensión, sin embargo es importante tener en cuenta que los Arrays pueden tener hasta más de 60 dimensiones.
Hagamos un ejemplo tridimensional: si en tu macro deseas almacenar la información mensual de las horas trabajadas por cada trabajador respecto a su turno de rotación, una opción inteligente sería mediante la declaración de un arreglo. Para dimensionar el arreglo debemos conocer los máximos valores que cada variable podría tomar. Para los meses su máximo valor será de 12; el número total de empleados depende de la plantilla de la empresa, en este caso supondremos un valor de 10. Partiendo de que los turnos de trabajo son de 8 horas por día, el número máximo de turnos será de 3. La declaración debería lucir como esta:
Ejemplo:
Option Base 1
Dim Horas (12, 10, 3)
Considerando que la base es 1, entonces 12 representa el número de meses, 10 el número de trabajadores y 3 el número de turnos.
Por lo tanto, para guardar la información se deberán llenar los espacios correspondientes a cada mes, empleado y turno. Algunos ejemplos serian:
Ejemplo a): Si la persona llamada “Trabajador #3” en el mes de Julio estuvo en el 2do turno y trabajó 125 horas, la asignación de valores en el Array sería:
Horas(7, “Trabajador#3”, 2)= 125
Ejemplo b): Si la persona llamada “Trabajador #8” en el mes de Abril estuvo en el 1er turno y trabajó 150 horas, la asignación de valores en el Array sería:
Horas(4, “Trabajador#8”, 1)= 150
Ejemplo c): Si la persona llamada “Trabajador #1” en el mes de Diciembre estuvo en el 3er turno y trabajó 200 horas, la asignación de valores en el Array sería:
Horas(12, “Trabajador#1”, 3)= 200
Extraer o leer información del Array
Afortunadamente para nosotros, VBA es muy intuitivo, así que si deseamos escribir en una celda o una variable el valor de determinado elemento de un arreglo, solo debes hacer referencia a la posición del arreglo, tal y como se muestra a continuación en un arreglo tridimensional:
Ejemplo en una celda:
Range("A2") = Horas(7, “Trabajador#3”, 2)
Ejemplo en una variable:
ResultadoHP= Horas(7, “Trabajador#3”, 2)
Bajo este enfoque, debes estar seguro de que en el Array existen los elementos que estas consultando para escribir en la celda, ya que en caso contrario VBA te mostrara un error de dimensionamiento. Para evitar ese tipo de errores, puedes emplear las funciones Lbound y Ubound, las cuales te permiten conocer los límites inferior y superior de tu arreglo, respectivamente.
Dimensionamiento dinámico del Array
Un uso avanzado de los arreglos refiere al dimensionamiento dinámico. Si retomamos el ejemplo anterior, el número de empleados podría cambiar respecto del tiempo.
Para lidiar con este caso, debemos inicializar el arreglo en vacío, siendo estrictamente necesario asignarle las dimensiones antes de almacenar alguna información en el arreglo mediante el comando de redimensionamiento Redim, tal y como se describe a continuación:
Option Base 1
Dim Horas() As Integer
Redim Horas(12, 10, 3)
Los valores para redimensionamiento pueden ser una constante como en el caso anterior, o también pueden ser variables previamente definidas como lo vemos en el siguiente ejemplo:
Option Base 1
Dim Horas() As Integer
Ntrab=10
Redim Horas(12, Ntrab, 3)
El redimensionamiento puede expandir o reducir el tamaño del arreglo, sin embargo, debemos tener en cuenta que el comando Redim borra toda la información previamente almacenada en el arreglo. Si deseamos expandir el arreglo y preservar la información contenida en él, debemos usar la instrucción Redim Preserve. En el ejemplo vemos los “Espacios vacíos” añadidos al arreglo, representados por los elementos que tienen el fondo verde.
Un código de redimensionamiento de número de trabajadores en el ejemplo ilustrado seria así:
Option Base 1
Dim Horas(12, 10, 3) As Integer
Ntrab=12
ReDim Preserve Horas(12, Ntrab, 3)
No debemos olvidar que en el redimensionamiento por reducción perderemos la información de los elementos que quedan “Excluidos” del Array. Por ejemplo, si pasamos del arreglo original de 3x3 a uno de 2x2 , perderíamos la información de los elementos que están en el fondo blanco.
Al igual que en el anterior, si deseamos preservar la información de los elementos del fondo azul, debemos utilizar la instrucción ReDim Preserve.
Quieres saber más? Contáctanos...