VBA – Matrices
In this Article
- VBA Ficha rápida de matrices
- Ejemplos rápidos de Arrays VBA
- ¿Beneficios de la matriz/array? – ¡Rapidez!
- Crear / declarar una Matriz (Dim)
- Establecer los valores de los arrays
- Asignar un rango a un Array
- arreglos 2D / Multidimensionales
- Ejemplos de Arrays multidimensionales
- Longitud / Tamaño de la Matriz
- Recorrer un array en bucle
- Otras Tareas de la Matriz
- El uso de matrices en Access VBA
En VBA, un Array es una única variable que puede contener múltiples valores. Piensa en un array como un rango de celdas: cada celda puede almacenar un valor. Las matrices pueden ser unidimensionales (piense en una sola columna), bidimensionales (piense en múltiples filas y columnas) o multidimensionales. Se puede acceder a los valores de las matrices por su posición (número de índice) dentro de la matriz.
VBA Ficha rápida de matrices
Arrays
arr(1) = “one”
arr(2) = “two”
arr(3) = “three”
Dim cell As Range, i As Integer
i = LBound(arr)
For Each cell In Range(“A1:A3”)
i = i + 1
arr(i) = cell.value
Next cell
For i = LBound(arr) To UBound(arr)
MsgBox arr(i)
Next i
sName = Join(arr, “:”)
Ejemplos rápidos de Arrays VBA
Veamos un ejemplo completo antes de sumergirnos en los detalles:
Sub Ejemplo_Array()
Dim strNames(1 To 4) As String
strNames(1) = "Carlos"
strNames(2) = "Juan"
strNames(3) = "Nancy"
strNames(4) = "Jose"
MsgBox strNames(3)
End Sub
Aquí hemos creado el array de cadenas unidimensional: strNames con tamaño cuatro (puede contener cuatro valores) y hemos asignado los cuatro valores. Por último mostramos el tercer valor en un cuadro de mensaje. En este caso, el beneficio de usar un Array es pequeño: sólo se requiere una declaración de variable en lugar de cuatro. Sin embargo, veamos un ejemplo que mostrará el verdadero poder de un array:
Sub Ejemplo_Array2()
Dim strNames(1 To 60000) As String
Dim i As Long
For i = 1 To 60000
strNames(i) = Cells(i, 1).Value
Next i
End Sub
Aquí hemos creado un Array que puede contener 60.000 valores y hemos rellenado rápidamente el array desde la Columna A de una hoja de cálculo.
¿Beneficios de la matriz/array? – ¡Rapidez!
Puede pensar en los Arrays de forma similar a las hojas de cálculo de Excel:
- Cada celda (o elemento de un array) puede contener su propio valor
- Se puede acceder a cada celda (o elemento de un array) por su posición de fila y columna.
- Worksheet Ej. cells(1,4).value = «Fila 1, Columna 4»
- Array Ej. arrVar(1,4) = «Fila 1, Columna 4»
Entonces, ¿por qué molestarse con los Arrays? ¿Por qué no leer y escribir valores directamente en las celdas de Excel? Una palabra: velocidad Leer/escribir en las celdas de Excel es un proceso lento. ¡Trabajar con Arrays es mucho más rápido!
Crear / declarar una Matriz (Dim)
Nota: Los Arrays pueden tener múltiples «dimensiones». Para mantener las cosas simples, comenzaremos trabajando solamente con arrays unidimensionales. Más adelante en el tutorial te introduciremos a los arrays multidimensionales.
Arrays estáticos
Los Arrays estáticos son arrays que no pueden cambiar de tamaño. Por el contrario, los Arrays Dinámicos pueden cambiar de tamaño. Se declaran de forma ligeramente diferente. Primero, veamos los arrays estáticos.
Nota: Si tu array no va a cambiar de tamaño, utiliza un array estático.
Declarar una variable array estática es muy similar a declarar una variable normal, excepto que debes definir el tamaño de la matriz. Hay varias formas de establecer el tamaño de un array. Puedes declarar explícitamente las posiciones inicial y final de un array:
Sub Array_Estatico1()
'Crear un array con las posiciones 1,2,3,4
Dim arrDemo1(1 To 4) As String
'crear un array con las posiciones 4,5,6,7
Dim arrDemo2(4 To 7) As Long
'crear un array con las posiciones 0,1,2,3
Dim arrDemo3(0 To 3) As Long
End Sub
O puedes introducir sólo el tamaño del array:
Sub Array_Estatico2()
'Crear un array con las posiciones 0,1,2,3
Dim arrDemo1(3) As String
End Sub
¡Importante! Note que por defecto, los Arrays comienzan en la posición 0. Así que Dim arrDemo1(3 ) crea un array con las posiciones 0,1,2,3.
Puedes declarar la Opción Base 1 en la parte superior de tu módulo para que el array comience en la posición 1:
Opción Base 1
Sub Array_Estatico3()
'crear un array con las posiciones 1,2,3
Dim arrDemo1(3) As String
End Sub
Sin embargo, encuentro que es mucho más fácil (y menos confuso) declarar explícitamente las posiciones de inicio y fin de los arrays.
Array dinámico
Arreglos dinámicos son arrays cuyo tamaño puede ser cambiado (o cuyo tamaño no necesita ser definido). Hay dos maneras de declarar un Array Dinámico.
Arrays variantes
La primera forma de declarar un Array Dinámico es estableciendo el array como tipo Variant.
Dim arrVar() As Variant
Con un Array Variante, no es necesario definir el tamaño del array. El tamaño se ajustará automáticamente. Sólo recuerde que el Array comienza en la posición 0 (a menos que añada la opción Base 1 en la parte superior de su módulo)
Sub Array_Variante()
Dim arrVar() As Variant
'Define los valores (Tamaño = 0,1,2,3)
arrVar = Array(1, 2, 3, 4)
'Cambiar los valores (Tamaño = 0,1,2,3,4)
arrVar = Array("1a", "2a", "3a", "4a", "5a")
'Salida Posición 4 ("5a")
MsgBox arrVar(4)
End Sub
Arrays dinámicos no variantes
Con los arrays no variantes, debes definir el tamaño del array antes de asignar los valores al mismo. Sin embargo, el proceso para crear el array es ligeramente diferente:
Sub Array_Dinamico1()
Dim arrDemo1() As String
'redimensiona el array con las posiciones 1,2,3,4
ReDim arrDemo1(1 To 4)
End Sub
Primero declara el array, similar al array estático, excepto que omite el tamaño del array:
Dim arrDemo1() As String
Ahora cuando quieras establecer el tamaño del array utilizas el comando ReDim para dimensionar el array:
'redimensiona el array con las posiciones 1,2,3,4
ReDim arrDemo1(1 To 4)
ReDim redimensiona el array. Lee a continuación la diferencia entre ReDim y ReDim Preserve.
ReDim vs. ReDim Preserve
Cuando se utiliza el comando ReDim se borran todos los valores existentes del array. En cambio, puedes utilizar ReDim Preserve para conservar los valores del array:
'Redimensiona el array con las posiciones 1,2,3,4 (Preservando los valores existentes)
ReDim Preserve arrDemo1(1 to 4)
Declaración de arrays simplificada
Puede que te sientas abrumado después de leer todo lo anterior. Para mantener las cosas simples, trabajaremos principalmente con arrays estáticos por el resto del artículo.
Establecer los valores de los arrays
Establecer valores de arrays es muy fácil. Con un array estático, debes definir cada posición del array, una a la vez:
Sub Ejemolo_Array()
Dim strNames(1 to 4) as String
strNames(1) = "Shelly"
strNames(2) = "Steve"
strNames(3) = "Neema"
strNames(4) = "Jose"
End Sub
Con un Array Variant puedes definir todo el array con una sola línea (sólo es práctico para arrays pequeños):
Sub Ejemplo_Array_1Linea()
Dim strNames() As Variant
strNames = Array("Shelly", "Steve", "Neema", "Jose")
End Sub
Si intentas definir un valor para una posición del array que no existe, recibirás un error de Subscript Out of Range:
strNames(5) = "Shannon"
En la sección ‘Asignar Rango a Array’ A continuación te mostraremos cómo usar un bucle para asignar rápidamente un gran número de valores a arrays.
Obtener el valor del array
Puedes obtener valores de arrays de la misma manera. En el ejemplo siguiente escribiremos los valores del array en las celdas:
Range("A1").Value = strNames(1)
Range("A2").Value = strNames(2)
Range("A3").Value = strNames(3)
Range("A4").Value = strNames(4)
Asignar un rango a un Array
Para asignar un Rango a un Array puedes utilizar un bucle:
Sub Rango_a_Array()
Dim strNames(1 To 60000) As String
Dim i As Long
For i = 1 To 60000
strNames(i) = Cells(i, 1).Value
Next i
End Sub
Esto hará un bucle a través de las celdas A1:A60000, asignando los valores de las celdas al array.
Llenar rango con datos del Array
También puede utilizar un bucle para asignar un array a un rango:
For i = 1 To 60000
Cells(i, 1).Value = strNames(i)
Next i
Esto hará lo contrario: asignar los valores del array a las celdas A1:A60000
arreglos 2D / Multidimensionales
Hasta ahora hemos trabajado exclusivamente con arrays unidimensionales (1D). Sin embargo, los arrays pueden tener hasta 32 dimensiones. Piense en un arreglo 1D como una sola fila o columna de celdas de Excel, un arreglo 2D como una hoja de trabajo completa de Excel con múltiples filas y columnas, y un arreglo 3D es como un libro de trabajo completo, que contiene múltiples hojas, cada una con múltiples filas y columnas (También puede pensar en un arreglo 3D como un cubo de Rubik).
Ejemplos de Arrays multidimensionales
Ahora vamos a demostrar ejemplos de trabajo con arrays de diferentes dimensiones.
Ejemplo de array 1D
Este procedimiento combina los ejemplos anteriores de arrays en un solo procedimiento, demostrando cómo podrías usar los arrays en la práctica.
Sub Ejemplo_Array_1d()
Dim strNames(1 To 60000) As String
Dim i As Long
'asignar valores a la matriz
For i = 1 To 60000
strNames(i) = Cells(i, 1).Value
Next i
'Enviar los valores de la matriz al rango
For i = 1 To 60000
Sheets("Hoja1").Cells(i, 1).Valor = strNames(i)
Next i
End Sub
Ejemplo de Array 2D
Este procedimiento contiene un ejemplo de un array 2D:
Sub Ejemplo_Array_2d()
Dim strNames(1 To 60000, 1 To 10) As String
Dim i As Long, j As Long
'Asigna los valores a la matriz
For i = 1 To 60000
For j = 1 To 10
strNames(i, j) = Cells(i, j).Value
Next j
Next i
'salida de los valores de la matriz al rango
For i = 1 To 60000
For j = 1 To 10
Sheets("Output").Cells(i, j).Value = strNames(i, j)
Next j
Next i
End Sub
Ejemplo de Array 3D
Este procedimiento contiene un ejemplo de array 3D para trabajar con múltiples hojas:
Sub Ejemplo_Array_3d()
Dim strNames(1 To 60000, 1 To 10, 1 To 3) As String
Dim i As Long, j As Long, k As Long
'asignar valores a la matriz
For k = 1 To 3
For i = 1 To 60000
For j = 1 To 10
strNames(i, j, k) = Sheets("Hoja" & k).Cells(i, j).Value
Next j
Next i
Next k
'salida de los valores de la matriz al rango
For k = 1 To 3
For i = 1 To 60000
For j = 1 To 10
Sheets("Salida" & k).Cells(i, j).Value = strNames(i, j, k)
Next j
Next i
Next k
End Sub
Longitud / Tamaño de la Matriz
Hasta ahora, te hemos presentado los diferentes tipos de arrays y te hemos enseñado a declarar los arrays y a obtener/establecer valores de arrays. A continuación nos centraremos en otros temas necesarios para trabajar con arrays.
Funciones UBound y LBound
El primer paso para obtener la longitud / tamaño de un array es utilizar las funciones UBound y LBound para obtener los límites superior e inferior del array:
Sub Limtes_Superior_Inferior()
Dim strNames(1 To 4) As String
MsgBox UBound(strNames)
MsgBox LBound(strNames)
End Sub
Restando los dos (y sumando 1) obtendrá la longitud:
GetArrLength = UBound(strNames) - LBound(strNames) + 1
Función de Longitud de Matriz
Esta es una función para obtener la longitud de un array de una sola dimensión:
Public Function Obtener_Longitud_Array(a As Variant) As Long
If IsEmpty(a) Then
Obtener_Longitud_Array = 0
Else
Obtener_Longitud_Array = UBound(a) - LBound(a) + 1
End If
End Function
¿Necesitas calcular el tamaño de un array 2D? Consulta nuestro tutorial: Calcular el Tamaño de un Array.
Recorrer un array en bucle
Hay dos formas de recorrer un array. La primera es recorrer los enteros correspondientes a las posiciones numéricas del array. Si conoces el tamaño del array puedes especificarlo directamente:
Sub Ejemplo_Array_Bucle1()
Dim strNames(1 To 4) As String
Dim i As Long
strNames(1) = "Shelly"
strNames(2) = "Steve"
strNames(3) = "Neema"
strNames(4) = "Jose"
For i = 1 To 4
MsgBox strNames(i)
Next i
End Sub
Sin embargo, si no conoce el tamaño del array (si el array es dinámico), puede utilizar las funciones LBound y UBound de la sección anterior:
Sub Ejemplo_Array_Bucle2()
Dim strNames(1 To 4) As String
Dim i As Long
strNames(1) = "Shelly"
strNames(2) = "Steve"
strNames(3) = "Neema"
strNames(4) = "Jose"
For i = LBound(strNames) To UBound(strNames)
MsgBox strNames(i)
Next i
End Sub
Bucle For Each Array
El segundo método es con un bucle For Each. Este bucle recorre cada elemento del array:
Sub Ejemplo_Array_Bucle3()
Dim strNames(1 To 4) As String
Dim elemento
strNames(1) = "Shelly"
strNames(2) = "Steve"
strNames(3) = "Neema"
strNames(4) = "Jose"
For Each elemento In strNames
MsgBox elemento
Next elemento
End Sub
El bucle For Each Array funcionará con arrays multidimensionales además de con arrays unidimensionales.
Bucle a través de un Array 2D
También puede utilizar las funciones UBound y LBound para recorrer un array multidimensional. En este ejemplo haremos un bucle a través de un array 2D. Observe que las funciones UBound y LBound le permiten especificar qué dimensión del arreglo debe encontrar los límites superior e inferior (1 para la primera dimensión, 2 para la segunda dimensión).
Sub Ejemplo_Array_Bucle4()
Dim strNames(1 To 4, 1 To 2) As String
Dim i As Long, j As Long
strNames(1, 1) = "Shelly"
strNames(2, 1) = "Steve"
strNames(3, 1) = "Neema"
strNames(4, 1) = "Jose"
strNames(1, 2) = "Shelby"
strNames(2, 2) = "Steven"
strNames(3, 2) = "Nemo"
strNames(4, 2) = "Jesse"
For j = LBound(strNames, 2) To UBound(strNames, 2)
For i = LBound(strNames, 1) To UBound(strNames, 1)
MsgBox strNames(i, j)
Next i
Next j
End Sub
Otras Tareas de la Matriz
Borrar Array
Para borrar un array completo, utiliza la sentencia Erase:
Erase strNames
Ejemplo de uso:
Sub Ejemplo_Array()
Dim strNames(1 to 4) as String
strNames(1) = "Shelly"
strNames(2) = "Steve"
strNames(3) = "Neema"
strNames(4) = "Jose"
Erase strNames
End Sub
Alternativamente, también puedes ReDim el array para redimensionarlo, borrando parte del array:
ReDim strNames(1 a 2)
Esto redimensiona el array al tamaño 2, borrando las posiciones 3 y 4.
Contar la matriz
Puedes contar el número de posiciones en cada dimensión de un array usando las funciones UBound y LBound (discutidas anteriormente). También puede contar el número de posiciones introducidas (o posiciones que cumplen ciertos criterios) haciendo un bucle a través del array. Este ejemplo recorrerá un array de objetos y contará el número de cadenas no vacías que se encuentran en el array:
Sub Recorrer_Array_y_contar()
Dim strNames(1 To 4) As String
Dim i As Long, n As Long
strNames(1) = "Shelly"
strNames(2) = "Steve"
For i = LBound(strNames) To UBound(strNames)
If strNames(i) <> "" Then
n = n + 1
End If
Next i
MsgBox n & " valores encontrados."
End Sub
Eliminar duplicados
En algún momento, puede querer eliminar los duplicados de un Array. Desafortunadamente, VBA no tiene una función incorporada para hacer esto. Sin embargo, hemos escrito una función para eliminar duplicados de un Array (es demasiado larga para incluirla en este tutorial, pero visite el enlace para saber más).
Filtro
La función de filtro de VBA le permite filtrar una matriz. Lo hace creando un nuevo array con sólo los valores filtrados. Abajo hay un ejemplo rápido, pero asegúrese de leer el artículo para ver más ejemplos para diferentes necesidades.
Sub Filtrar_Comparar()
'Definir el array
Dim strNames As Variant
strNames = Array("Steve Smith", "Shannon Smith", "Ryan Johnson")
'Filtrar el array
Dim strSubNames As Variant
strSubNames = Filter(strNames, "Smith")
'Contar el Array filtrado
MsgBox "Encontrados " & UBound(strSubNames) - LBound(strSubNames) + 1 & " nombres."
End Sub
Función IsArray
Puedes comprobar si una variable es un array utilizando la función IsArray:
Sub Ejemplo_EsArray()
'crear un array con las posiciones 1,2,3
Dim arrDemo1(3) As String
'Crea una variable de cadena regular
Dim str As String
MsgBox IsArray(arrDemo1)
MsgBox IsArray(str)
End Sub
Unir Array
Puedes «unir» rápidamente un array entero con la función Join:
Sub Unir_Array()
Dim strNames(1 To 4) As String
Dim joinNames As String
strNames(1) = "Shelly"
strNames(2) = "Steve"
strNames(3) = "Neema"
strNames(4) = "Jose"
joinNames = Join(strNames, ", ")
MsgBox joinNames
End Sub
Dividir una cadena en una matriz
La función VBA Split dividirá una cadena de texto en un array que contiene valores de la cadena original. Veamos un ejemplo:
Sub Array_Split()
Dim Nombres() As String
Dim nombresUnidos As String
nombresUnidos = "Shelly,Steve,Nema,Jose"
Nombres = Split(nombresUnidos, ",")
MsgBox Nombres(1)
End Sub
Aquí dividimos esta cadena de texto «Shelly,Steve,Nema,Jose» en un array (tamaño 4) utilizando el delimitador de coma (,»).
Const Array
Un Array no puede puede ser declarado como una constante en VBA. Sin embargo, usted puede trabajar alrededor de esto mediante la creación de una función para utilizar como un Array:
' Definir una constante Array
Function Array_Constante()
Array_Constante = Array(4, 12, 21, 100, 5)
End Function
' Recupertar valores de la constante Array
Sub Recuperar_valores()
MsgBox Array_Constante(3)
End Sub
Copiar Array
No hay una forma incorporada para copiar un Array usando VBA. En su lugar, necesitarás usar un bucle para asignar los valores de un array a otro.
Sub CopiarArray()
Dim Arr1(1 To 100) As Long
Dim Arr2(1 To 100) As Long
Dim i As Long
'Crear Array1
For i = 1 To 100
Arr1(i) = i
Next i
'CopiarArray1 a Array2
For i = 1 To 100
Arr2(i) = Arr1(i)
Next i
MsgBox Arr2(74)
End Sub
Transponer
No hay ninguna función VBA incorporada que permita transponer un array. Sin embargo, hemos escrito una función para Transponer un Array 2D. Lea el artículo para aprender más.
Función de Retorno de Array
Una pregunta común que tienen los desarrolladores de VBA es cómo crear una función que devuelva un array. La mayoría de las dificultades se resuelven utilizando Arrays de Variantes. Hemos escrito un artículo sobre el tema: Array de retorno de la función VBA.
El uso de matrices en Access VBA
La mayoría de los ejemplos de la matriz anterior funcionan exactamente igual en Access VBA como lo hacen en Excel VBA. La única diferencia importante es que cuando usted desea poblar una matriz utilizando los datos de Access, tendría que bucle a través del objeto RecordSet en lugar del objeto Range.
Sub Rango_a_Array_Access()
On Error Resume Next
Dim strNames() As String
Dim i As Long
Dim iCount As Long
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tblClients", dbOpenDynaset)
With rst
.MoveLast
.MoveFirst
iCount = .RecordCount
ReDim strNames(1 To iCount)
For i = 1 To iCount
strNames(i) = rst.Fields("ClientName")
.MoveNext
Next i
End With
rst.Close
Set rst = Nothing
Set dbs = Nothing
End Sub
Array Tutorials | |
---|---|
Array Mega-Guide | yes |
Get Array Size | |
Clear Array | |
Filter Array | |
Transpose Array | |
Function Return Array | |
Remove Duplicates | |