VBA – Declarar (Dim), Crear e Inicializar una Variable Tipo Matriz

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on febrero 28, 2022

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.

vba option base

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.

Pantalla Matriz Publica

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.

Pantalla Matriz Con Dim

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.

Matriz Resultado1

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.

vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples