VBA: declarar (atenuar), crear e inicializar la variable de matriz

Este tutorial demostrará cómo declarar (atenuar), crear e inicializar variables de matriz en VBA

¿Qué es una variable de matriz VBA?

Una variable de matriz de VBA se puede considerar como un grupo de variables, almacenadas con el mismo nombre y con el mismo tipo de datos. Una matriz puede almacenar texto, números u objetos.

Hace referencia a un elemento en una matriz utilizando su número de índice.

Puede declarar una variable de matriz de la misma manera que declararía cualquier otra variable utilizando la palabra clave Dim, Static, Public o Private.

Matrices estáticas

Hay 2 tipos de matrices: estática y dinámica. Una matriz estática se declara con su tamaño especificado cuando declara inicialmente la matriz. También se denomina matriz fija.

1 Dim intA (4) como entero

La matriz anterior se declara usando la instrucción 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, eso no es un error tipográfico. El tamaño de la matriz es 5, a pesar de ingresar 4 en la matriz. Esto se debe a que los índices de matriz comienzan automáticamente en cero.

Índices de matriz

Los índices de matriz comienzan automáticamente en cero a menos que Opción Base 1 se declara en la parte superior de su módulo de código.

Si Opción Base 1 se declara, las matrices comenzarán automáticamente en 1.

Sin embargo, encuentro que declarar variables de tal manera es problemático. Es posible que los revisores de código no sepan que las matrices comienzan en cero o de la declaración Option Base 1

En cambio, prefiero declarar explícitamente las posiciones inicial y final de las matrices:

1 Dim intA (2 a 5) como entero

Tenga en cuenta que cuando lo haga, puede iniciar la matriz en cualquier número (no solo 1 o 0).

Matrices dinámicas

Una variable de matriz dinámica es una matriz cuyo tamaño se puede cambiar en tiempo de ejecución. Declaras variables dinámicas sin tamaño.

1 Dim intA () como entero

Puede utilizar la instrucción ReDim para especificar el tamaño de la matriz después de que se haya creado la matriz.

1 ReDim intA (2)

Puede cambiar el tamaño de una matriz dinámica en cualquier momento. Sin embargo, cuando se usa la declaración ReDim, se borran todos los valores existentes. Para preservar los valores de matriz existentes, use ReDim Preserve en lugar de.

1 ReDim Preserve intA (2)

Puede declarar una matriz dinámica a nivel de Procedimiento, Módulo o Global, pero solo puede usar la instrucción ReDim dentro de un Procedimiento.

Matrices variantes

Las matrices variantes son matrices dinámicas con las que es más fácil trabajar.

1 Dim varNames ()

Tenga en cuenta que no es necesario especificar el tipo de datos (se supone que es una variante) o el tamaño de la matriz.

Como veremos a continuación, puede inicializar matrices variantes utilizando la función de matriz (no es necesario cambiar el tamaño de las matrices primero).

Módulo de declaración y matrices públicas

Como se muestra arriba, las matrices se pueden declarar dentro de los procedimientos, para su uso dentro de ese procedimiento:

1234 Sub StaticArray ()'declara la matriz con un valor LBound de 1 y un valor UBound de 4Dim IntA (1 a 4) como enteroEnd Sub

Pero también se pueden declarar a nivel de Módulo o Global.

1234567 Opción explícita'declara la matriz con un valor LBound de 1 y un valor UBound de 4Dim IntA (1 a 4) como enteroSub StaticArray ()End Sub

En este ejemplo, la variable de matriz se puede llamar en cualquier lugar dentro de este módulo de código. En su lugar, puede declarar una matriz pública que se puede utilizar en todo su proyecto VBA (consulte la siguiente sección).

Declarar una matriz pública

Declara una matriz estática pública como declararía una variable pública.

1 StrNames públicos (3) como cadena

Esta declaración debería ir en la parte superior de su módulo, debajo de Option Explicit. Luego, podría usarse en todo su proyecto VBA en cualquier módulo o procedimiento.

Si 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 matrices

Puede asignar valores a una matriz estática de la siguiente manera.

1234567891011 Sub StaticArray ()'declara la matriz con un valor LBound de 1 y un valor UBound de 4Dim IntA (1 a 4) como entero'inicializa la matrizIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'muestra el resultado de la posición 2 de la matriz en la ventana inmediataDebug.Print IntA (2)End Sub

Si ejecuta el procedimiento anterior, el valor de 20 se mostrará en la ventana inmediata.

También puede asignar los valores a una matriz dinámica de la misma manera

12345678910111213 Sub DynamicArray ()'declara una matriz dinámica pero omite los valores vinculadosDim IntA () como entero'inicializa la matrizReDim IntA (1 a 4)IntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'muestra el resultado de la posición 2 de la matriz en la ventana inmediataDebug.PrintIntA (2)End Sub

Función de matriz

Sin embargo, solo con la matriz variante, puede usar la función Array, que puede ser más fácil que usar el método estándar.

12 'poblar la matrizintA () = Matriz (10, 20, 30, 40)

Rellenar matriz con bucle

También puede completar matrices recorriendo un rango de celdas en Excel

1234567891011121314151617 Prueba secundariaDynamicArrayFromExcel ()'declarar la matrizDim strNames () como cadena'declara un número entero para contar las filas en un rangoDim n como entero'declara un número entero para el bucleDim i como entero'cuenta las filas en un rangon = Rango ("A1", Rango ("A1"). Fin (xlDown)). Rows.Count'redimiza la matriz a la cantidad de filas en el rango.ReDim strNames (n)Para i = 0 A nstrNames (i) = Rango ("A1"). Desplazamiento (i + 1, 0)Siguiente yo'muestra los valores en la matrizMsgBox Join (strNames ())End Sub

Reinicializar matrices

Puede reinicializar su matriz en cualquier etapa de su código, pero luego perderá el valor original contenido en esa posición en su matriz.

1234567891011121314 Sub StaticArray ()'declara la matriz con un valor LBound de 1 y un valor UBound de 4Dim IntA (1 a 4) como entero'inicializa la matrizIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'muestra el resultado de la posición 2 de la matriz en la ventana inmediataDebug.Print IntA (2)'inicializa la matriz de nuevointA (2) = 200Debug.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 instrucción ReDim se utiliza para establecer el tamaño de su matriz. Puede usar la instrucción ReDim posteriormente en su código para cambiar el tamaño de la matriz tantas veces como sea necesario. La línea de código a continuación reinicializará la matriz intA para que tenga un tamaño de 2 (recuerde: ¡un índice de matriz comienza en 0!)

1 ReDim intA (1) como entero

Entonces, el código que incluye la declaración ReDim se vería como el siguiente ejemplo.

1234567891011121314151617 Sub TestDynamicArray ()'declarar la matrizDim intA () como enteroReDim intA (2)'rellenar la matriz con númerosintA (0) = 2intA (1) = 5intA (2) = 9'muestra el número en la posición 1Debug.Print intA (1)'redim la matriz para cambiar el tamañoReDim intA (3)intA (0) = 6intA (1) = 8'muestra el número en la posición 1 esta vezDebug.Print intA (1)End Sub

Si ejecuta el procedimiento anterior, el valor de 5 se mostrará en la ventana inmediata, y luego se mostrará un valor de 8 una vez que hayamos redimensionado la matriz usando ReDim y la hemos vuelto a llenar. Sin embargo, como no hemos poblado IntA (2), y no usamos Re-Dim Preserve, el valor en esa posición en la matriz se eliminará y tanto la posición 3 como la 4 en la matriz serán cero.

Uso de ReDim Preserve

Si usamos ReDim Preserve, mantendrá los valores originales contenidos en la matriz.

1234567891011121314151617 Sub TestDynamicArray ()'declarar la matrizDim intA () como enteroReDim intA (2)'rellenar la matriz con númerosintA (0) = 2intA (1) = 5intA (2) = 9'muestra el número en la posición 2Debug.Print intA (2)'redim la matrizReDim intA (3)intA (0) = 6intA (1) = 8'muestra el número en la posición 2 de nuevoDebug.Print intA (2)End Sub

En ambos cuadros de mensaje que se muestran arriba, el número 9 aparecerá ya que la declaración ReDim Preserve mantuvo ese valor en esa posición.

Va a ayudar al desarrollo del sitio, compartir la página con sus amigos

wave wave wave wave wave