VBA – Matrices

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on marzo 14, 2022

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

Descripción
Código VBA
Crear
Dim arr(1 To 3) As Variant
arr(1) = “one”
arr(2) = “two”
arr(3) = “three”
Crear desde Excel
Dim arr(1 To 3) As Variant
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
Leer todos los elementos
Dim i as Long
For i = LBound(arr) To UBound(arr)
MsgBox arr(i)
Next i
Borrar
Erase arr
Array a String
Dim sName As String
sName = Join(arr, “:”)
Aumentar Tamaño
ReDim Preserve arr(0 To 100)
Establecer valor
arr(1) = 22

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"

Error array fuera de indice

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

Array constante

 

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-Guideyes
Get Array Size
Clear Array
Filter Array
Transpose Array
Function Return Array
Remove Duplicates
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