Este tutorial explicará VBA matriz, varios tipos de matriz, matriz variante, y los métodos de matriz con la ayuda de ejemplos de programación:
Una variable VBA normal es un marcador de posición que almacena el valor de un solo dato. Tiene una relación de 1 a 1, es decir, 1 variable para 1 valor.
Ahora imagina almacenar múltiples valores que son del mismo tipo. En lugar de crear múltiples variables, puedes simplemente crear una variable y almacenar todos los mismos tipos de valores. Esta variable se llama ARRAY.
En este tutorial, se llega a saber lo que es una matriz de VBA, unidimensional, y matrices de dos dimensiones, junto con los diferentes tipos de matrices como fijos y dinámicos. También vamos a entender varios métodos de matriz que se utilizan en VBA.
Matriz VBA
Las matrices son un tipo especial de variable que puede almacenar múltiples valores del mismo tipo de datos.
Por ejemplo, si tienes los nombres de 100 empleados, en lugar de crear 100 variables de tipo string, puedes crear una variable array de tipo string y asignar 100 valores a la misma variable array.
Matriz unidimensional
Un array que tiene todos los elementos en una sola fila o en una sola columna se denomina array unidimensional. Listar los nombres de todos los alumnos de la clase en una sola columna es un ejemplo de array unidimensional. Se declara como se muestra a continuación.
Dim arrayname(lowerbound To UpperBound) As DataType
Existen múltiples formas de declarar un array. A continuación se muestran algunos ejemplos.
Ejemplo:
#1) Dim MyArrayExample(0 To 3) As Integer
Crea una matriz con la ubicación 0,1,2,3 que aceptará valores enteros.
#2) Dim MyArray2(3) As String
Por defecto de 0 a 3 y crea un array con ubicación 0,1,2,3 que aceptará valores String.
#3) Dim MyArray2(13 a 15) As Double
Crea un array comenzando desde 13, es decir, 13, 14 y 15, y acepta valores Double. Hemos mencionado el límite inferior como 13, por lo que el array comenzará a asignar valores desde la posición 13 en lugar de 0.
Vamos a crear un código simple y entender las 3 formas de declaración de array.
Nota: Para escribir código VB Abra Microsoft Excel (las versiones compatibles son Excel 2007, 2010, 2013, 2016, 2019). Navegue hasta Ficha Desarrollador -> Visual Basic (Como alternativa, utilice la combinación de teclas Alt+F11). En el editor VB, haga clic en Insertar -> Módulo y pegue el siguiente código.
Considere el siguiente procedimiento que muestra los diferentes tipos de declaraciones.
Private Sub arrayExample1() Dim firstQuarter(0 To 2) As String 'crea array con índice 0,1,2 firstQuarter(0) = "Ene" firstQuarter(1) = "Feb" firstQuarter(2) = "Mar" MsgBox "Primer Trimestre en calendario " & " " & firstQuarter(0) & " " & firstQuarter(1) & " " & firstQuarter(2) End Sub Private Sub arrayExample2() Dim secondQuarter(2) As String 'crea array con índice 0,1,2secondQuarter(0) = "Abril" secondQuarter(1) = "Mayo" secondQuarter(2) = "Junio" MsgBox "Segundo Trimestre en calendario " & " " & secondQuarter(0) & " " & secondQuarter(1) & " " & secondQuarter(2) End Sub Private Sub arrayExample3() Dim thirdQuarter(13 To 15) As String 'crea array con índice 13,14,15 thirdQuarter(13) = "Julio" thirdQuarter(14) = "Ago" thirdQuarter(15) = "Sep"MsgBox "Tercer trimestre en calendario " & " " & tercerTrimestre(13) & " " & tercerTrimestre(14) & " " & tercerTrimestre(15) End Sub
Pulsa F5 o el botón de ejecución de la barra de herramientas para ejecutar el código.
Variable regular frente a variable de matriz
Ahora que ya sabemos cómo funciona una matriz unidimensional, vamos a entender por qué las matrices son tan importantes en los lenguajes de programación.
Suponga que necesita introducir el salario de 5 empleados. Para conseguirlo utilizando una variable regular, necesita crear 5 variables.
Public Sub RegularVariable() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") ' Declara una variable para cada estudiante Dim Emp1 As String Dim Emp2 As String Dim Emp3 As String Dim Emp4 As String Dim Emp5 As String ' Lee las notas de los estudiantes de la celda Emp1 = shet.Range("A" & 2).Value Emp2 = shet.Range("A" & 3).Value Emp3 = shet.Range("A" & 4).Value Emp4 = shet.Range("A" &5).Value Emp5 = shet.Range("A" & 6).Value ' Imprime las notas de los estudiantes Debug.Print "Emp Name" Debug.Print Emp1 Debug.Print Emp2 Debug.Print Emp3 Debug.Print Emp4 Debug.Print Emp5 End Sub
Ahora vamos a construir el mismo código utilizando una variable Array.
Option Explicit Public Sub ArrayVarible() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") Dim Employee(1 To 6) As String Dim i As Integer For i = 1 To 6 Employee(i) = shet.Range("A" & i).Value Debug.Print Employee(i) Next i End Sub
Aquí, sólo hemos utilizado una variable de matriz que almacenará todos los nombres de los empleados. Supongamos que necesita añadir 100 nombres de empleados más, entonces sólo tiene que cambiar el tamaño de la matriz y no tiene que crear una nueva variable.
Esto reducirá el número de líneas del código y, por tanto, lo hará más comprensible y legible.
Matriz bidimensional
Un array bidimensional tiene 2 índices - el primer índice representará las filas y el 2º índice representará la columna. Tiene múltiples filas y columnas y se suele representar en formato tabla.
La declaración de un array de 2 dim es la siguiente:
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Consideremos un ejemplo de almacenamiento de las notas de 2 alumnos obtenidas en 3 asignaturas. Para ello crearemos un array bidimensional que tiene 2 filas y 3 columnas.
Empezaremos el array desde la fila 1 hasta la fila 2 y desde la columna 1 hasta la columna 3.
Sub Twodim() Dim totalMarks(1 To 2, 1 To 3) As Integer totalMarks(1, 1) = 23 totalMarks(2, 1) = 34 totalMarks(1, 2) = 33 totalMarks(2, 2) = 55 totalMarks(1, 3) = 45 totalMarks(2, 3) = 44 Msgbox "Total Marks in Row 2 and column 2 is " &totalMarks(2,2) Msgbox "Total Marks in Row 1 and column 3 is " &totalMarks(1,3) End Sub
Pulsa F5 o el botón de ejecución de la barra de herramientas para ejecutar el código.
Fila 2 y columna 2
Fila 1 y columna 3
Matrices fijas
Los Arrays Fijos también llamados Arrays Estáticos tienen un límite inferior y un límite superior fijos y este tamaño no se puede cambiar en tiempo de ejecución. El tamaño del array se especifica durante la declaración dentro de los paréntesis. Todos los ejemplos anteriores son Arrays Fijos ya que hemos mencionado su tamaño durante la declaración.
Las matrices fijas suelen utilizarse cuando se está seguro del tamaño de la matriz. Por ejemplo, el número de días de una semana, puedes crear una matriz con límite inferior 0 y superior 6 y estar seguro de que nunca cambiarás su tamaño.
Matrices dinámicas
Los Arrays Dinámicos nos permiten redimensionar el array durante el tiempo de ejecución. Son útiles cuando no se está seguro del tamaño del array. Supongamos que en la admisión a la universidad, no se está seguro de cuántos estudiantes serán admitidos, por lo que no se puede determinar el tamaño en el momento del diseño o de la declaración.
La declaración de una matriz dinámica es similar a la de una matriz estática con paréntesis vacíos.
Dim Empleado() As String
REDIM
Cuando queremos cambiar el tamaño tenemos que utilizar REDIM Si no se puede cambiar el límite inferior, sólo se puede cambiar el límite superior de la matriz.
Sub dynamicArray() Dim dynArray() As String Dim curdate As Date curdate = Now ReDim dynArray(2) ' Redim ayudará a cambiar el tamaño del array durante la ejecución dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Los estudiantes matriculados después de " & curdate & " son " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) End Sub
Ahora, sabemos que podemos cambiar el tamaño del array durante el tiempo de ejecución, por lo tanto podemos usar la sentencia ReDim siempre que necesitemos incrementar el ubound de un array. Intentemos Incrementar el tamaño del array una vez más y añadir un nuevo nombre de estudiante.
Sub RedimExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim dynArray(3) ' Redim reinicializará el array y destruirá los valores antiguosdynArray(3) = "John" MsgBox "Los alumnos matriculados hasta " & curdate & " son " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Habrás observado que el resultado no muestra los nombres de los alumnos añadidos anteriormente, da un valor nulo. Esto es debido a que la sentencia Redim creará un nuevo array con un nuevo tamaño y destruirá los valores antiguos.
Reserva ReDim
La sentencia Represerve nos ayuda a superar la limitación de ReDim conservando los valores antiguos y aumentando así el tamaño del array.
Reescribamos el código anterior utilizando ReDim Preserve.
Sub preserveExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim preserve dynArray(3) ' Redim preserve will retain the old valuesdynArray(3) = "John" MsgBox "Los alumnos matriculados hasta " & curdate & " son " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Como hemos utilizado la palabra clave preserve, los valores introducidos anteriormente no se pierden y el nuevo valor se añade correctamente.
Matriz de variantes
Hasta ahora hemos visto una matriz que acepta el mismo tipo de valores. Ahora vamos a declarar la matriz como una variante y almacenar los distintos tipos de datos como String, Date, Long, Integer en una sola matriz.
Ejemplo:
Sub arrayVariant() Dim arrayData(3) As Variant arrayData(0) = "Vikram Vikrant" arrayData(1) = 411234567890# arrayData(2) = 38 arrayData(3) = "06-09-1972" MsgBox "Details of person " & arrayData(0) & " is " & " Phone No " & arrayData(1) & " ,Id " & arrayData(2) & " ,DOB " & arrayData(3) End Sub
Métodos de matrices VBA
Hay varios métodos en VBA matrices que nos ayudarán a realizar diferentes funciones, como se menciona a continuación.
Nº de sl. | Nombre | Sintaxis | Descripción |
---|---|---|---|
1 | Matriz | Array(arglist) | Convierte una variante regular en una matriz. |
2 | Borrar | Borrar arrayname | Se utiliza para reintializar la matriz de tamaño fijo y libera la memoria para la matriz dinámica. |
3 | IsArray | IsArray (nombrevariable) | Determina si una variable es una matriz. |
4 | Lbound | LBound( NombreArray, [Dimensión] ) | Devuelve el subíndice más bajo de una matriz. |
5 | Ubound | UBound( NombreArray, [Dimensión] ) | Devuelve el subíndice más alto de una matriz. |
6 | Dividir | Split(expresión, [ delimitador, [ límite, [ comparar ]]) | Divide una cadena en múltiples subcadenas y devuelve una matriz basada en cero. |
7 | Únete a | Join(matriz-fuente, [ delimitador ]) | Une varias subcadenas de una matriz y devuelve un valor de cadena. |
8 | Filtro | Filtro(sourcearray, match, [ include, [ compare ]]) | El filtro nos permitirá buscar un coincidencia especificada de una matriz. |
Analicemos detalladamente cada una de ellas con un ejemplo.
#1) Matriz
Declaremos una variable variante regular y utilicémosla como una matriz. Cuando se desea cambiar una variable variante regular en una matriz, necesitamos utilizar una variable ARRAY como se muestra en el siguiente ejemplo.
Las funciones de matriz aceptan un argumento que contiene valores separados por comas. Estos valores se asignan como un elemento de la matriz.
Sub variantArray() Dim varData As Variant varData = Array("Mon Bel", "+61 112334123", 567, "06-09-1972") MsgBox "Detalles de la persona " & varData(0) & " is " & " Phone No " & varData(1) & " ,Id " & varData(2) & " ,DOB " & varData(3) End Sub
Tienes que identificar una variable de matriz utilizando un índice, por lo tanto, en el ejemplo anterior, los valores se recuperan como varData(0) varData(2) varData(3).
#2) Borrar
Esta función borrará todos los valores introducidos para una matriz de tamaño fijo y liberará el espacio de memoria para una matriz dinámica.
Sintaxis: Borrar arrayname
Erase tiene diferente comportamiento para diferentes tipos de datos como se indica a continuación.
- Para un numérico fijo: Todos los valores se ponen a cero.
- Para un tipo de datos de cadena fija: Todos los valores se ponen a cero.
- Para una matriz dinámica: Libera la memoria utilizada por el array.
Ejemplo:
Sub eraseExample() Dim NumArray(3) As Integer Dim decArray(2) As Double Dim strArray(2) As String NumArray(0) = 12345 decArray(1) = 34.5 strArray(1) = "Erase Function" Dim DynaArray() ReDim DynaArray(3) MsgBox " Values before Erase " & (NumArray(0)) & "," & (decArray(1)) & " , " & (strArray(1)) Erase NumArray Erase decArray Erase strArray Erase DynaArray ' Free the memory ' AllMsgBox " Values after Erase " & NumArray(0) & "," & decArray(1) & " , " & strArray(1) End Sub
Resultado antes de utilizar la función Borrar
Resultado después de usar Borrar
#3) IsArray
Esta función se utiliza para determinar si la variable de entrada dada es una matriz o no. Devuelve true si la variable introducida es verdadera, en caso contrario devuelve false.
Sintaxis : IsArray (variablename)
Ejemplo:
Sub isArrayTest() Dim arr1, arr2 As Variant arr1 = Array("Ene", "Feb", "Mar") arr2 = "12345" MsgBox ("Is arr1 an Array : " & IsArray(arr1)) MsgBox ("Is arr2 an Array : " & IsArray(arr2)) End
El resultado del primer Msgbox
El resultado del segundo msgbox
#4) Lbound
Devuelve el subíndice más bajo de la matriz especificada como argumento de la función Lbound.
Sintaxis: LBound( ArrayName, [Dimension] )
ArrayName es el nombre del array.
Dimensión es el valor entero opcional, si la matriz tiene múltiples dimensiones, entonces usted puede especificar a qué dimensión desea determinar el Lbound.
Ejemplo:
Sub lboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declara variables de array. Dim Arraywithoutlbound(10) Result1 = LBound(ArrayValue, 1) ' Devuelve 1. Result2 = LBound(ArrayValue, 3) ' Devuelve 10. Result3 = LBound(Arraywithoutlbound) MsgBox "El subíndice más bajo en el primer array " & Result1 & " el subíndice más bajo en el tercer array " & Result2 & " El más bajosubíndice en Arraywithoutlbound " & Result3 End Sub
#5) Ubound
Devuelve el subíndice superior de la matriz especificada como argumento en la función Ubound.
Sintaxis: UBound( ArrayName, [Dimension] )
ArrayName es el nombre del array.
Dimensión es el valor entero opcional; si la matriz tiene varias dimensiones, puede especificar en qué dimensión desea determinar el Ubound.
Ejemplo:
Sub UboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declarar variables de array. Dim ArraywithoutUbound(10) Result1 = UBound(ArrayValue, 1) Result2 = UBound(ArrayValue, 3) Result3 = UBound(ArraywithoutUbound) MsgBox "Subíndice más bajo en primer array " & Result1 & " subíndice más bajo en 3er array " & Result2 & " Subíndice más bajo enArraywithoutlbound " & Result3 End Sub
#6) Dividir
Devuelve una matriz con un número de subcadenas derivadas de la cadena completa dada.
Sintaxis: Split(expresión, [ delimitador, [ límite, [ comparar ]])
- Expresión: Se trata de la cadena completa que se utilizará para producir subcadenas.
- Delimitador: Utilizando el delimitador especificado, se generarán subcadenas. Si no se menciona, se considerará el espacio como delimitador.
- Límite: Número de subcadenas a devolver.
- Compara: Una vez obtenida la subcadena, puede utilizar diferentes opciones de comparación para comprobar el resultado.
Ejemplo: En el siguiente ejemplo, estamos utilizando delimitador como - y límite como 3.
Por lo tanto, la función de división separará toda la cadena en subcadenas basadas en el delimitador. Pero también hemos mencionado que el límite es 3, por lo que las subcadenas no se formarán después del límite 3. Por lo tanto, el último delimitador - se omitirá.
Sub splitExample() Dim MyString As String Dim Result() As String Dim DisplayText As String MyString = "This is the example for-VBA-Split-Function" Result = Split(MyString, "-",3) MsgBox Result(0) & vbNewLine & Result(1) & vbNewLine & Result(2) & vbNewLine & Result(3) End Sub
#7) Únete
Esto es justo lo contrario de la división, Join creará una cadena combinando varias subcadenas.
Sintaxis: Join(sourcearray, [ delimiter ])
Sourcearray: Matriz unidimensional de cadenas que quieres unir en una sola.
Delimitador: El delimitador especificado se añadirá después de cada cadena durante la unión.
Ejemplo:
Sub joinExample() Dim Result As String Dim dirarray(0 To 2) As String dirarray(0) = "D:" dirarray(1) = "SoftwareTestingHelp" dirarray(2) = "Arrays" Result = Join(dirarray, "\") MsgBox "Date after joining " & Result End Sub
Los 3 valores se unen y se coloca \ entre cada palabra, como hemos mencionado \ como delimitador.
#8) Filtro
El filtro nos permitirá buscar una coincidencia especificada a partir de un array. En función de los criterios de filtrado, se devolverá el subconjunto de un array de cadenas.
Sintaxis: Filter(sourcearray, match, [ include, [ compare ]])
Ejemplo:
Sub filterExample() Dim Mystring As Variant Mystring = Array("Software Testing", "Testing help", "Software help") filterString = Filter(Mystring, "help") MsgBox "Found " & UBound(Mystring) - LBound(Mystring) + 1 & " words matching the criteria " End Sub
Este ejemplo buscará la palabra "help" en toda la cadena del array utilizando la función de filtro.
Preguntas frecuentes
Q # 1) ¿Cómo obtener la longitud de una matriz en VBA?
Contesta: Para obtener la longitud de un array, utilizamos la función Ubound. Esta función nos dará el subíndice superior de un array especificado.
P #2) ¿Cómo declarar una matriz en VBA?
Respuesta: Se declara un array unidimensional como se muestra a continuación.
Dim arrayname(lowerbound To UpperBound) As DataType
Ejemplo: Dim Myarray(0 To 2) As Integer
Se declara un array bidimensional como se muestra a continuación.
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Ejemplo: Dim marks(1 To 3, 0 To 2) As Integer
P #3) ¿Cómo convertir Range a Array?
Contesta: Podemos utilizar la función Transpose para convertir el rango en un array. Este código creará Mys[10]
Sub Example() Dim Mys As Variant Mys = Application.Transpose(Range("A1:A10")) End Sub
P #4) ¿Qué es una variante de matriz en VBA?
Contesta: Una matriz variante aceptará todo tipo de datos para su índice, es decir, puede almacenar diferentes tipos de valores en una sola matriz.
Ejemplo:
Dim arrayData(3) As Variant
arrayData(0) = "Vikas Vipal"
arrayData(1) = 411234567890#
Las formas de cambiar el tamaño de la matriz durante el tiempo de ejecución y también preservar los valores utilizando redim preservar se discutieron con ejemplos. Por último, aprendimos métodos Array que nos ayudarán en la realización de varias operaciones.