Saltar al contenido
Nuestra aplicación "Vuelos baratos" en AppGallery >>

VBA Excel. Matrices (unidimensionales, multidimensionales, dinámicas)

Matrices en VBA Excel: unidimensionales, multidimensionales y dinámicas. Declarar y usar matrices. Operadores Public, Dim, ReDim. Funciones Array, LBound, UBound.

Los arrays son conjuntos de elementos del mismo tipo que tienen el mismo nombre y se diferencian entre sí por índices. Pueden ser unidimensionales (lineales), multidimensionales y dinámicos. Las matrices en VBA Excel, al igual que otras variables, se declaran mediante las declaraciones Dim y Public. Para cambiar la dimensión de las matrices dinámicas, se utiliza el operador ReDim. Las matrices con una dimensión previamente declarada se denominan estáticas.

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)
¡Prestar atención!
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)

Contenido de la sección VBA Excel en ruso, puedes utilizar el traductor de Google.