Está en la página 1de 15

Trabajando con ARRAY VARIABLES

Las matrices existen en la memoria RAM interna de su computadora, mientras que los libros de
trabajo existen en su disco duro.

Trabajar con datos de la memoria RAM interna de su computadora es mucho más rápido.

Declarar una variable de matriz

Una variable puede almacenar un valor, una variable de matriz puede almacenar varios valores.

La siguiente línea declara mascotas como una variable de matriz de cadena. Los paréntesis
muestran que esta es una variable de matriz.

Sub Macro1()

Dim pets() As String

End Sub

También puede especificar cuántos valores desea almacenar en la matriz. La macro a continuación
declara mascotas variables como una cadena de cadenas, puede almacenar valores 6. 0 a 5.

Sub Macro1()

Dim pets(5) As String

End Sub

Si desea comenzar con 1 en lugar de 0, también puede hacerlo. Esta variable puede almacenar
valores 5, 1 a 5.

Sub Macro1()

Dim pets(1 to 5) As String

End Sub

Dimensionar una variable de matriz

También puede cambiar la cantidad de valores que una variable de matriz puede almacenar en
cualquier momento en la macro, utilizando la instrucción ReDim.

Sub Macro1()

Dim pets(1 to 2) As String


pets(1) = "dog"

Msgbox Ubound(pets)

ReDim pets(1 to 3)

Msgbox pets(1) & " " & Ubound(pets)

End Macro

Tenga en cuenta que esto borra todos los valores de matriz guardados anteriores.

matrices n-dimensionales

Las matrices de ejemplo que se muestran arriba tienen una dimensión, pero es posible tener hasta
dimensiones 60000. Probablemente va a utilizar una o dos dimensiones la mayor parte del tiempo.

Arreglos tridimensionales 1

Puede asignar valores a una matriz en su macro o función definida por el usuario. La siguiente
macro te muestra cómo.

Sub Macro1()

Dim pets(1 to 2) As String

pets(1) = "dog"

pets(2) = "cat"

End Sub

En esta macro se pueden almacenar valores de 2. mascotas (de 1 a 2). El número de índice en la
variable pets le dice a Excel dónde guardar el valor en la matriz. mascotas(índice)

También puede tomar valores de una hoja de trabajo y guardarlos en una matriz.

Sub Macro1()

Dim pets(1 to 2) As String


pets(1) = Worksheets("Sheet1").Range("A1").value

pets(2) = Worksheets("Sheet1").Range("A2").value

End Sub

Si tiene muchos valores, esta macro podría hacer el trabajo, pero este método es relativamente
lento.

Sub Macro1()

Dim pets(1 to 100) As String

For i = 1 to 100

pets(i) = Worksheets("Sheet1").Range("A" & i).value

Next i

End Sub

Hay una forma más rápida de transferir valores de una hoja de trabajo a una matriz que les
contaré más adelante en esta publicación.

Arreglos tridimensionales 2

Esta macro le muestra cómo llenar una matriz dimensional 2. El primer argumento es el número
de fila y el segundo es el número de columna, mascotas (fila,visión de conjunto)

Sub Macro1()

Dim pets(1 to 2, 1 to 2)

pets(1,1) = "dog"

pets(1,2) = 5

pets(2,1) = "cat"

pets(2,2) = 9

End Sub

Esta imagen es una presentación visual de la variable array. Los números en cursiva muestran la
posición de cada valor en la matriz.

array2
Arreglos tridimensionales 3

También es posible tener matrices con tres dimensiones. La mejor analogía que se me ocurre es
que si el primer argumento es el número de fila, el segundo argumento es el número de columna,
el tercer argumento es como hojas de cálculo.

Sub Macro1()

Dim pets(1 to 2, 1 to 2, 1 to 2)

pets(1,1,1) = "dog"

pets(1,2,1) = 5

pets(2,1,1) = "cat"

pets(2,2,1) = 9

pets(1,1,2) = "snake"

pets(1,2,2) = 3

pets(2,1,2) = "fish"

pets(2,2,2) = 4

End Sub

Tamaño de la matriz

Cada elemento o valor tiene un número de índice que indica su posición en la matriz. Las matrices
siempre tienen un límite inferior y superior, la instrucción Lbound devuelve el límite inferior y la
instrucción Ubound devuelve el límite superior. Estas funciones son muy útiles. Si el límite inferior
es 1 y el límite superior es 5, la matriz contiene 5 valores.

Matriz 1-dimensional

La siguiente macro utiliza las instrucciones LBound y Ubound para determinar el tamaño de la
variable de matriz.

Sub Macro1()

Dim pets(1 To 10)

Msgbox "LBound: " & LBound(pets) & " Ubound: " & Ubound(pets)

End sub
Matriz 2-dimensional

Esta macro le muestra cómo calcular el tamaño de una variable de matriz bidimensional.

Sub Macro1()

Dim pets(1 To 5, 1 To 3)

MsgBox "Lower limit 1-dim: " & LBound(pets, 1) & " Upper limit 1-dim:" &
UBound(pets, 1) & " Lower limit 2-dim: " & LBound(pets, 2) & " Upper limit 2-dim: "
& UBound(pets, 2)

End Sub

array2

Matriz 3-dimensional

Sub Macro1()

Dim pets(1 To 5, 1 To 3, 1 To 2)

MsgBox "Lower limit 1-dim: " & LBound(pets, 1) & " Upper limit 1-dim:" &
UBound(pets, 1) & " Lower limit 2-dim: " & LBound(pets, 2) & " Upper limit 2-dim: "
& UBound(pets, 2) & " Lower limit 3-dim: " & LBound(pets, 3) & " Upper limit
3-dim: " & UBound(pets, 3)

End Sub

Manipular una matriz

Puede cambiar las dimensiones de una matriz y mantener todos los valores. Pero necesita declarar
la variable de la matriz con paréntesis vacíos o obtendrá este error de compilación: "La matriz ya
está dimensionada"

Sub Macro1()

Dim pets() As String

ReDim pets(1 To 5)

pets(2) = "dog"

ReDim Preserve pets(1 To UBound(pets) + 1)

MsgBox "Lbound(pets): " & LBound(pets) & " Ubound(pets): " & UBound(pets)
& "pets(2): " & pets(2)

End Sub
Solo puede ReDim la última dimensión, la siguiente matriz tiene 2 dimensiones, los límites son de
1 a 5 y de 1 a 2.

Sub Macro1()

Dim pets() As String

ReDim pets(1 To 5, 1 To 2)

ReDim Preserve pets(1 to Ubound(pets,1) , 1 To UBound(pets,2) + 1)

MsgBox "Lbound(pets,1): " & LBound(pets,1) & " Ubound(pets,1): " &
UBound(pets,1) & vbNewLine & "Lbound(pets,2): " & LBound(pets,2) & "
Ubound(pets,2): " & UBound(pets,2)

End Sub

La declaración ReDim Preserve cambia la última dimensión de la matriz bidimensional en la macro


anterior. Los límites ahora son de 2 a 1 y de 5 a 1, esta imagen te lo muestra.

Excel es realmente lento cuando se trata de manipular matrices, es mejor tratar de minimizar la
cantidad de veces que usas ReDim Preserve adivinando cuantos elementos necesitas.

Borrar una matriz

Puede usar la declaración ReDim para borrar todos los valores de matriz guardados.

Sub Macro1()

Dim pets(1 to 2) As String

pets(1) = "dog"

Msgbox Ubound(pets)

ReDim pets(1 to 3)

Msgbox pets(1) & " " & Ubound(pets)

End Macro

También puede utilizar la función Borrar

Sub Macro1()
Dim pets(1 to 2) As String

pets(1) = "cat"

Erase pets

End Sub

Transferir valores de matriz a una hoja de trabajo

Macro

Esta macro devuelve una matriz a la hoja de cálculo Sheet1

Sub Macro1()

Dim pets(1 to 2) As String

pets(1) = "dog"

pets(2) = "cat"

Worksheets("Sheet1").Range("A1:B1") = pets

End Macro

Como puede ver, retorna estos valores horizontalmente. Es posible devolver valores verticalmente
también, se Transponer más adelante en este post.

Función definida por el usuario

La siguiente función definida por el usuario (udf) devuelve valores de matriz, pero debe ingresarla
como una fórmula de matriz.

Function ArrTest

Dim pets(1 to 2) As String

pets(1) = "dog"

pets(2) = "cat"

ArrTest = pets

End Macro

Estos son los pasos sobre cómo ingresar una fórmula de matriz:
Seleccionar celda A1: B1

Tipo = ArrTest ()

Mantener presionado CTRL + MAYÚS

Pulse Intro

Si ingresa el udf correctamente, la barra de fórmulas muestra {= ArrTest ()}

Si no ingresa este udf como una fórmula de matriz, es posible que muestre el primer valor de la
matriz en todas las celdas, la barra de fórmulas muestra = ArrTest ()

Transponer una matriz

Una matriz unidimensional siempre se muestra horizontalmente en la hoja de trabajo, para


cambiar que puede usar el método Transponer y reorganizar los valores verticalmente.

Sub Macro1()

Dim pets(1 to 2) As String

pets(1) = "dog"

pets(2) = "cat"

Worksheets("Sheet1").Range("A1:A2") = Application.Transpose(pets)

End Sub

Si su matriz es mayor que 65536, la declaración de transposición devolverá un error, esta macro
no funcionará.

Sub Macro1()

Dim pets(1 To 65537) As String

Dim i As Single

For i = 1 To 65537

pets(i) = i

Next i

Worksheets("Sheet1").Range("A1:A65537") = Application.Transpose(pets)

End Sub
La instrucción Transpose devuelve el error en tiempo de ejecución '13': no coincide el tipo.

Sin embargo, hay una solución alternativa para superar este límite de matriz. La siguiente macro
devuelve una matriz verticalmente al rango de celdas A1: A65537 y Transpose ni siquiera se usan.
La desventaja es que no puede cambiar el tamaño de la primera dimensión con ReDim Preserve.

Sub Macro1()

Dim pets(1 To 65537, 1 To 1) As Single

For i = 1 To 65537

pets(i, 1) = i

Next i

Worksheets("Sheet1").Range("A1:A65537") = pets

End Sub

Tenga en cuenta que si usa Transpose con una matriz mayor que 65536 en Excel 2013 o 2016, no
se muestra ningún error.

Obtener datos de una hoja de trabajo

Esta macro recupera los valores 65537 del rango de celdas A1: A65537 y lo hace súper rápido.

Sub Macro1()

Dim pets() As Variant

pets = Worksheets("Sheet1").Range("A1:A65537").Value

MsgBox "LBound(pets,1):" & LBound(pets, 1) & " Ubound(pets,1): " &


UBound(pets, 1) & vbNewLine & "LBound(pets,2): " & LBound(pets, 2) & "
UBound(pets,2): " & UBound(pets, 2)

End Sub

Devuelve una matriz 2-dimensional incluso si solo toma una columna de datos.
Copiar datos de una tabla definida en Excel

También puede copiar valores de una tabla definida en Excel a una matriz.

Sub Macro1()

Dim pets() As Variant

pets = Range("Table1").Value

MsgBox "LBound(pets,1):" & LBound(pets, 1) & " Ubound(pets,1): " &


UBound(pets, 1) & vbNewLine & "LBound(pets,2): " & LBound(pets, 2) & "
UBound(pets,2): " & UBound(pets, 2)

End Sub

Rango ("Tabla1"). El valor devuelve todos los valores excepto los encabezados, use Tabla1
[#Todos] si desea todos los valores. Si desea copiar solo la columna "Nombre" a una matriz, utilice
Table1 [Nombre].

array13

Copiar una matriz

Para copiar una matriz completa simplemente use el signo igual.

Sub Macro1()

Dim pets(1 To 2) As Variant

Dim dogs() As Variant

pets(1) = "Labrador Retriever"

pets(2) = "Golden Retriever"

dogs = pets
MsgBox dogs(1) & vbNewLine & dogs(2)

End Sub

array14

Copie una columna a una nueva matriz

La instrucción Application.Index le permite copiar una sección de una matriz.

dogs = Application.Index (pets, 0, 1) copia la columna 1 de la matriz de mascotas a una nueva


matriz llamada perros.

Copiar una columna a una nueva matriz crea una matriz 2-dimensional, pero si copia una fila, la
nueva matriz es 1-dimensional, vea los siguientes dos ejemplos de macro a continuación.

Sub Macro1()

Dim pets(1 To 2, 1 To 2) As Variant

Dim dogs() As Variant

pets(1, 1) = "Labrador Retriever"

pets(2, 1) = "Golden Retriever"

pets(1, 2) = "Boxer"

pets(2, 2) = "Beagle"

dogs = Application.Index(pets, 0, 1)

MsgBox dogs(1, 1) & vbNewLine & dogs(2, 1)

End Sub

array15
Copiar una fila a una nueva matriz

Copiar una fila (valores horizontales) de una matriz crea una nueva matriz con solo una dimensión.

Sub Macro1()

Dim pets(1 To 2, 1 To 2) As Variant

Dim dogs() As Variant

pets(1, 1) = "Labrador Retriever"

pets(2, 1) = "Golden Retriever"

pets(1, 2) = "Boxer"

pets(2, 2) = "Beagle"

dogs = Application.Index(pets, 2, 0)

MsgBox dogs(1) & vbNewLine & dogs(2)

End Sub

array16

Como habrás sospechado, hay un problema con la función INDICE. No puede manejar matrices de
más de 65536 valores y Microsoft parece no hacer nada al respecto, el error ha estado ahí desde
Excel 2007.

Enviar una matriz a una macro

Macro2 crea y llena una nueva matriz y luego ejecuta Macro1 utilizando la matriz como un
argumento.

Sub Macro1(val() As String)

MsgBox val(1) & vbNewLine & val(2)

End Sub
Sub Macro2()

Dim pets(1 To 2) As String

pets(1) = "Labrador Retriever"

pets(2) = "Golden Retriever"

Call Macro1(pets)

End Sub

Pasar una matriz a una función

Las siguientes dos funciones demuestran cómo pasar matrices entre funciones. Función definida
por el usuario Func2 copia valores de una hoja de trabajo a una matriz, luego pasa la matriz a
Func1. Func1 transpone los valores y los devuelve. Func2 luego devuelve los valores a una hoja de
cálculo.

Function Func1(val() As Variant)

Func1 = Application.Transpose(val)

End Function

Function Func2(rng As Range)

Dim temp() As Variant

Dim temp1() As Variant

temp = rng.Value

Func2 = Func1(temp)

End Function

array17

También puede enviar una matriz desde una macro a un udf.

Determine el número de dimensiones en una matriz


Función definida por el usuario CountDim cuenta el número de dimensiones en una matriz.

Function CountDim(val() As Variant)

Dim i As Single

On Error Resume Next

For i = 1 To 60000

chk = LBound(val, i)

If Err <> 0 Then Exit For

Next i

On Error GoTo 0

CountDim = i - 1

End Function

Function Test()

Dim arr(1 To 10, 1 To 5, 1 To 3, 1 To 5, 1 To 3)

Test = CountDim(arr)

End Function

La prueba de función devuelve 5, hay cinco dimensiones en esta matriz:

array18

Dividir una cadena de texto

La función de división le permite separar una cadena de texto usando un delimitador. Devuelve
una matriz dimensional 1 (0 en n) y eso lo hace interesante en este contexto.

array20

Function CountWords(rng As Range)

Text = Split(rng, " ")

CountWords = UBound(Text) + 1
End Function

Excel VBA Reference

Esta extensa lista de referencia de vba proporciona información detallada que incluye sintaxis,
argumentos, valores de retorno y ejemplos para Visual Basic para aplicaciones.

Cómo ingresar una fórmula matricial

Las fórmulas de matriz le permiten hacer cálculos avanzados que no son posibles con fórmulas
regulares.

Cómo ingresar fórmulas matriciales en celdas combinadas

¿Alguna vez ha intentado ingresar una fórmula de matriz en celdas combinadas? Entonces está
familiarizado con este mensaje de error: […]

Comentarios (9)

También podría gustarte