Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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()
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()
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()
End Sub
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()
Msgbox Ubound(pets)
ReDim pets(1 to 3)
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()
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()
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()
For i = 1 to 100
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()
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
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()
ReDim pets(1 To 5)
pets(2) = "dog"
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()
ReDim pets(1 To 5, 1 To 2)
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
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.
Puede usar la declaración ReDim para borrar todos los valores de matriz guardados.
Sub Macro1()
pets(1) = "dog"
Msgbox Ubound(pets)
ReDim pets(1 to 3)
End Macro
Sub Macro1()
Dim pets(1 to 2) As String
pets(1) = "cat"
Erase pets
End Sub
Macro
Sub Macro1()
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.
La siguiente función definida por el usuario (udf) devuelve valores de matriz, pero debe ingresarla
como una fórmula de matriz.
Function ArrTest
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 ()
Pulse Intro
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 ()
Sub Macro1()
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 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()
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.
Esta macro recupera los valores 65537 del rango de celdas A1: A65537 y lo hace súper rápido.
Sub Macro1()
pets = Worksheets("Sheet1").Range("A1:A65537").Value
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()
pets = Range("Table1").Value
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
Sub Macro1()
dogs = pets
MsgBox dogs(1) & vbNewLine & dogs(2)
End Sub
array14
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()
pets(1, 2) = "Boxer"
pets(2, 2) = "Beagle"
dogs = Application.Index(pets, 0, 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()
pets(1, 2) = "Boxer"
pets(2, 2) = "Beagle"
dogs = Application.Index(pets, 2, 0)
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.
Macro2 crea y llena una nueva matriz y luego ejecuta Macro1 utilizando la matriz como un
argumento.
End Sub
Sub Macro2()
Call Macro1(pets)
End Sub
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.
Func1 = Application.Transpose(val)
End Function
temp = rng.Value
Func2 = Func1(temp)
End Function
array17
Dim i As Single
For i = 1 To 60000
chk = LBound(val, i)
Next i
On Error GoTo 0
CountDim = i - 1
End Function
Function Test()
Test = CountDim(arr)
End Function
array18
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
CountWords = UBound(Text) + 1
End Function
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.
Las fórmulas de matriz le permiten hacer cálculos avanzados que no son posibles con fórmulas
regulares.
¿Alguna vez ha intentado ingresar una fórmula de matriz en celdas combinadas? Entonces está
familiarizado con este mensaje de error: […]
Comentarios (9)