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.