Matrices en VBA Excel: unidimensionales, multidimensionales y dinámicas. Declarar y usar matrices. Operadores Public, Dim, ReDim. Funciones Array, LBound, UBound.
Matrices unidimensionales
Declarar matrices estáticas unidimensionales (lineales) en VBA Excel:
Public Matriz1(9) As Integer Dim Matriz2(1 To 9) As String
En el primer caso, la matriz pública contiene 10 elementos del 0 al 9 (el índice inferior predeterminado es 0, el superíndice predeterminado es 9), y en el segundo caso, la matriz local contiene 9 elementos del 1 al 9.
De forma predeterminada, VBA Excel considera que el subíndice cero es cero en las matrices. Pero, si lo desea, puede hacer que el subíndice predeterminado sea uno agregando la declaración “Option Base 1” al principio del módulo.
Matrices multidimensionales
Declarar matrices estáticas multidimensionales en VBA Excel es similar a declarar matrices unidimensionales, pero con la adición de dimensiones adicionales separadas por comas:
'La matriz es bidimensional Public Matriz1(3, 6) As Integer 'La matriz es tridimensional Dim Matriz2(1 To 6, 1 To 8, 1 To 5) As String 'La matriz es de cuatro dimensiones Dim Matriz3(9, 9, 9, 9) As Date
La tercera matriz consta de 10.000 elementos: 10x10x10x10.
Matrices dinámicas
Las matrices dinámicas en VBA Excel, a diferencia de las estáticas, se declaran sin especificar la dimensión:
Public Matriz1() As Integer Dim Matriz2() As String
Estas matrices se utilizan cuando la dimensión se desconoce de antemano y se determina durante la ejecución del programa. Cuando se conoce la dimensión de la matriz requerida, se redefine en VBA Excel usando el operador ReDim:
Public Matriz1() As Integer Dim Matriz2() As String ReDim Matriz1(1 To 20) ReDim Matriz2(3, 5, 4)
Al redefinir la dimensión de una matriz, puede utilizar una variable en lugar de un superíndice:
Dim Matriz1() as Variant, x As Integer x = 20 ReDim Matriz1(1 To x)
La dimensión de las matrices dinámicas se puede redefinir repetidamente durante la operación del programa, tanto por el número de dimensiones como por el número de elementos en la dimensión.
Usando el operador ReDim, es imposible cambiar una matriz regular declarada con una dimensión predefinida. Un intento de redefinir la dimensión de dicha matriz provocará un error de compilación con el mensaje: Array already dimensioned (Matriz ya dimensionada).
Al redefinir la dimensión de los arrays dinámicos en VBA Excel se pierden los valores de sus elementos. Para guardar valores, utilice la instrucción «Preserve»:
Dim Matriz1() As String ----- operadores ----- ReDim Matriz1(5, 2, 3) ----- operadores ----- ReDim Preserve Matriz1(5, 2, 7)
Sólo la última dimensión de una matriz dinámica se puede anular con el operador «Preserve«. Este es un defecto de los desarrolladores, que persiste en VBA Excel 2016. Sin el operador «Preserve«, se pueden redefinir todas las dimensiones.
Tamaño máximo
El tamaño de una matriz es el producto de las longitudes de todas sus dimensiones. Representa el número total de elementos contenidos actualmente en la matriz.
Según información del sitio web de los desarrolladores, el tamaño máximo de las matrices depende del sistema operativo y de la memoria disponible. El uso de matrices que son más grandes que la RAM disponible de la computadora dará como resultado velocidades más lentas porque el sistema debe escribir y leer datos en el disco.
Usando matrices
Daré dos ejemplos en los que las matrices son indispensables.
1. Como sabe, la función Dividir devuelve una matriz unidimensional de subcadenas extraídas de la cadena delimitada original. Estos datos se asignan a una matriz dinámica unidimensional, predeclarada con tipo As String. La dimensión se establece automáticamente según el número de subcadenas.
2. Los datos de las matrices se procesan mucho más rápido que los de las celdas de la hoja de cálculo. El procesamiento fila por fila de la información en una tabla de Excel se puede observar visualmente mediante el parpadeo de la pantalla si su actualización (Application.ScreenUpdating) no está deshabilitada. Para acelerar su código, puede precargar valores de un rango de celdas en una matriz dinámica usando el operador de asignación (=). El tamaño de la matriz se establecerá automáticamente. Después de procesar los datos de la matriz con código VBA, los resultados se cargan nuevamente en la hoja de cálculo de Excel. Tenga en cuenta que solo puede cargar valores en un rango de celdas de la hoja de trabajo utilizando el operador de asignación (=) desde una matriz bidimensional.
Funciones Array, LBound, UBound
Función Array
La función Array devuelve una matriz de elementos de tipo Variante a partir de una lista inicial de elementos, separados por comas. La numeración de los elementos de una matriz comienza desde cero. Puede acceder a un elemento de matriz especificando su número (índice) entre paréntesis.
Sub Ejemplo1() Dim a() As Variant a = Array("text", 25, "solo", 35.62, "stop") MsgBox a(0) & vbNewLine & a(1) & vbNewLine _ & a(2) & vbNewLine & a(3) & vbNewLine & a(4) End Sub
Copie el código en el módulo VBA Excel y ejecútelo. El mensaje informativo MsgBox mostrará los valores de la matriz recuperados por índice.
Función LBound
La función LBound devuelve un valor Long igual al índice más pequeño (inferior) disponible en la dimensión de matriz especificada.
Sintaxis:
LBound (arrayname[, dimension])
arrayname
es el nombre de la variable de matriz y es un argumento obligatorio;dimension
es el número de la dimensión de la matriz, un argumento opcional, el valor predeterminado es 1.
El índice más pequeño puede ser 0 o 1 dependiendo de la configuración de la declaración Option Base.El límite inferior de una matriz producida por la función Array es siempre 0.
Al declarar variables de matriz o redefinir sus dimensiones, los índices más pequeños pueden ser cualquier número entero, incluidos los negativos.
Función UBound
La función UBound devuelve un valor Long igual al índice más grande (superior) disponible en la dimensión de la matriz especificada.
Sintaxis:
UBound (arrayname[, dimension])
arrayname
es el nombre de la variable de matriz y es un argumento obligatorio;dimension
es el número de la dimensión de la matriz, un argumento opcional, el valor predeterminado es 1.
La función UBound se utiliza junto con la función LBound para determinar el tamaño de una matriz.
Sub Ejemplo2() Dim a(-2 To 53) As String MsgBox "Índice más pequeño = " & LBound(a) & _ vbNewLine & "El mayor índice = " & UBound(a) End Sub
Copie el código en el módulo VBA Excel y ejecútelo. El mensaje informativo MsgBox mostrará los valores del índice más pequeño y más grande de la variable de matriz a
.
Recorriendo una matriz
Atravesar una matriz unidimensional usando un bucle For…Next, en el que las funciones UBound y LBound se usan para determinar los límites de la matriz:
Sub Ejemplo3() Dim a() As Variant, i As Long a = Array("text", 25, "solo", 35.62, "stop") For i = LBound(a) To UBound(a) Debug.Print "a(" & i & ") = " & a(i) Next End Sub
Verá el resultado del bucle en la ventana Immediate.
Limpieza (puesta a cero) de matrices
Primer método
Puede borrar cualquier matriz, estática o dinámica, sin utilizar un bucle utilizando el operador Erase. El término «poner a cero» sólo se puede aplicar a un array de tipo numérico.
Dim Matriz1(4, 3) As String, Matriz2() As Variant ----- operadores ----- 'anular matriz dinámica ReDim Matriz2(2, 5, 3) ----- operadores ----- 'limpieza las matrices Erase Matriz1 Erase Matriz2
Tenga en cuenta que ambas matrices con este método de limpieza volverán a su estado original, que tenían inmediatamente después de la declaración:
- static Matriz1 conservará la dimensión (4, 3);
- el Matriz2 dinámico no conservará la dimensión ().
Segundo método
Una matriz dinámica se puede borrar (poner a cero) sin utilizar un bucle utilizando el operador ReDim. Simplemente redefínelo con la misma dimensión.
Dim Matriz() As Double ----- operadores ----- 'redefinir la matriz ReDim Matriz(5, 6, 8) ----- operadores ----- 'limpieza la matriz ReDim Matriz(5, 6, 8)