VBA – Declarar (Dim), Crear e Inicializar una Variable Tipo Matriz
In this Article
Este tutorial demostrará cómo declarar (Dim), crear e inicializar variables de matriz en VBA
¿Qué es una variable de matriz en VBA?
Una variable de matriz en VBA puede ser considerada como un grupo de variables, almacenadas bajo el mismo nombre y con el mismo tipo de datos. Una matriz puede almacenar texto, números u objetos.
Para referirse a un elemento de una matriz se utiliza su número de índice.
Puedes declarar una variable de matriz de la misma manera que declararías cualquier otra variable utilizando las palabras clave Dim, Static, Public o Private.
Matrices estáticas
Hay dos tipos de matrices: estáticas y dinámicas. Una matriz estática se declara con su tamaño especificado cuando se declara inicialmente la matriz. También se le llama Matriz Fija.
Dim intA(4) as integer
La matriz anterior se declara utilizando la sentencia Dim a nivel de Procedimiento o Módulo, y el tamaño de la matriz es 5 ya que no hemos declarado el valor LBound de la Matriz. No, ¡no es un error tipográfico! El tamaño de la matriz es 5, a pesar de haber introducido 4 en el array. Esto se debe a que los índices de la matriz comienzan automáticamente en cero.
Índices de matrices
Los índices de las matrices comienzan automáticamente en cero a menos que se declare la Opción Base 1 en la parte superior de su módulo de código.
Si se declara la opción Base 1, las matrices comenzarán automáticamente en 1. Sin embargo, considero que declarar variables de esta manera es problemático. Los revisores de código pueden no ser conscientes de que las matrices empiezan en cero o de la declaración de la Opción Base 1 En su lugar, prefiero declarar explícitamente las posiciones inicial y final de los arrays:
Dim intA(2 to 5) as integer
Fíjate que al hacerlo, puedes empezar el array en cualquier número (no sólo en el 1 o el 0).
Matrices dinámicas
Una variable de matriz dinámica es una matriz cuyo tamaño puede cambiarse en tiempo de ejecución. Las variables dinámicas se declaran sin tamaño.
Dim intA() as integer
Puedes usar la sentencia ReDim para especificar el tamaño de la matriz después de que haya sido creada.
ReDim intA(2)
Se puede cambiar el tamaño de una matriz dinámica en cualquier momento. Sin embargo, cuando se utiliza la sentencia ReDim, se borran todos los valores existentes. Para conservar los valores existentes de la matriz, utilice ReDim Preserve en su lugar.
ReDim Preserve intA(2)
Puede declarar una matriz dinámica a nivel de Procedimiento, Módulo o Global, pero sólo puede utilizar la sentencia ReDim dentro de un Procedimiento.
Matrices tipo Variantes
Las matrices variantes son matrices dinámicas con las que es más fácil trabajar.
Dim varNames()
Observe que no necesita especificar el tipo de datos (se asume que es variante) o el tamaño de la matriz. Como veremos más adelante, puedes inicializar matrices variantes usando la función Array (¡no es necesario redimensionar las matrices primero!)
Declarar matrices públicas y de módulos
Como se muestra arriba, las matrices pueden ser declaradas dentro de procedimientos, para su uso dentro de ese procedimiento:
Sub StaticArray()
'Declarar una matriz con Valor LBound en 1 y Valor UBound de 4
Dim IntA(1 to 4) as Integer
End Sub
Pero también se pueden declarar a nivel de Módulo o Global.
Option Explicit
'Declarar una matriz con Valor LBound en 1 y Valor UBound de 4
Dim IntA(1 to 4) as Integer
Sub StaticArray()
End Sub
En este ejemplo, la variable de la matriz puede ser llamada en cualquier lugar dentro de este módulo de código. En su lugar, puedes declarar una matriz pública que puede ser utilizado en todo tu proyecto VBA (ver la siguiente sección).
Declarando una Matriz Pública
Declaras una matriz estático público como declararías una variable pública.
Public Nombres(3) as String
Esta declaración debe ir en la parte superior de su módulo, debajo de la opción explícita. Puede ser utilizada en todo el proyecto VBA en cualquier módulo o procedimiento.
Si usted declara la matriz en la parte superior del módulo, pero con la palabra clave Dim, entonces el uso de esa matriz está restringido a ese módulo individual. Tratar de usar la matriz en un módulo separado resultaría en un error.
Inicializar Arrays
Puede asignar valores a un array estático de la siguiente manera.
Sub StaticArray()
'declarar una matriz estatica con valor LBound de 1 y valor UBound de 4
Dim IntA(1 To 4) As Integer
'Inicializar la matriz
IntA(1) = 10
IntA(2) = 20
IntA(3) = 30
IntA(4) = 40
'Mostrar el resultado de la posición 2 de la matriz en la ventana inmediato
Debug.Print IntA(2)
End Sub
Si ejecutas el procedimiento anterior, el valor de 20 se mostraría en la ventana inmediata.
También puede asignar los valores a una matriz dinámica de la misma manera
Sub MatrizDinámica()
'declarar una matriz dinámica pero omitiendo los valores ligados
Dim IntA() As Integer
'inicializar la matriz
ReDim IntA(1 To 4)
IntA(1) = 10
IntA(2) = 20
IntA(3) = 30
IntA(4) = 40
'mostrar el resultado de la posición 2 de la matriz en la ventana inmediata
Debug.Print IntA(2)
End Sub
Función Array
Sin embargo, con el array variante solamente, puede utilizar la Función Array que puede ser más fácil que utilizar el método estándar.
'Llenar la matriz
intA() = Array(10, 20, 30, 40)
Llenar la matriz con un bucle
También puede rellenar arrays haciendo un bucle a través de un rango de celdas en Excel
Sub PruebaMatrizDinamicaDesdeExcel()
'Declarar la matriz
Dim Nombres() As String
'Declarar un entero para contar las filas en un rango
Dim n As Integer
'Declarar un entero para el bucle
Dim i As Integer
'Contar las filas en el rango
n = Range("A1", Range("A1").End(xlDown)).Rows.Count
'Redimensionar la matriz a la cantidad de filas en el rango
ReDim Nombres(n)
For i = 0 To n
Nombres(i) = Range("A1").Offset(i + 1, 0)
Next i
'Mostrar los valores en la matriz
MsgBox Join(Nombres())
End Sub
Reiniciar Matrices
Puede reiniciar su array en cualquier etapa de su código, pero entonces perderá el valor original contenido en esa posición de su array.
Sub StaticArray()
'declara la matriz con un valor LBound de 1 y un valor UBound de 4
Dim IntA(1 a 4) as Integer
'inicializa la matriz
IntA(1) = 10
IntA(2) = 20
IntA(3) = 30
IntA(4) = 40
'mostrar el resultado de la posición 2 de la matriz en la ventana inmediata
Debug.Print IntA(2)
'vuelve a inicializar la matriz
intA(2)= 200
Debug.Print IntA(2)
End Sub
En el ejemplo anterior, la matriz estática mantendrá todos los valores, excepto el valor en la posición 2 – ese valor cambiará a 200.
Usando ReDim
Si está utilizando una Matriz Dinámica, la sentencia ReDim se utiliza para establecer el tamaño de su Matriz. Puede utilizar la sentencia ReDim posteriormente en su código para cambiar el tamaño de la matriz tantas veces como necesite. La línea de código de abajo reiniciará la matriz intA para que tenga un tamaño de 2 (Recuerda – ¡un índice de Array comienza en 0!)
ReDim intA(1) as Integer
Así que el código que incluye la declaración ReDim se vería como el ejemplo de abajo.
Sub PruebaMatrizDinamica()
'declare la matriz
Dim intA() As Integer
ReDim intA(2)
'rellena la matriz con números
intA(0) = 2
intA(1) = 5
intA(2) = 9
'muestra el número en la posición 1
Debug.Print intA(1)
'redimensiona el array para cambiar el tamaño
ReDim intA(3)
intA(0) = 6
intA(1) = 8
'muestra el número en la posición 1 esta vez
Debug.Print intA(1)
End Sub
Si ejecutas el procedimiento anterior, el valor de 5 se mostraría en la ventana inmediata, y luego se mostraría un valor de 8 una vez que hayamos redimensionado la matriz usando ReDim y lo hayamos rellenado. Sin embargo, como no hemos llenado IntA(2), y no hemos utilizado ReDim Preserve, el valor en esa posición del array será eliminado y tanto la posición 3 como la 4 del array serán cero.
Usando ReDim Preserve
Si usamos ReDim Preserve, mantendrá los valores originales contenidos en el array.
Sub PruebaMatrizDinamica()
'declaramos la matriz
Dim intA() As Integer
ReDim intA(2)
'rellena la matriz con números
intA(0) = 2
intA(1) = 5
intA(2) = 9
'muestra el número en la posición 2
Debug.Print intA(2)
'redimensiona la matriz
ReDim Preservar intA(3)
intA(0) = 6
intA(1) = 8
'vuelve a mostrar el número en la posición 2
Debug.Print intA(2)
End Sub
En ambos cuadros de mensaje mostrados arriba, el número 9 aparecerá ya que la sentencia ReDim Preserve mantuvo ese valor en esa posición.