una matriz matrices dinamico crear con como array arrays excel vba range

arrays - matrices - Crear una matriz a partir de un rango en VBA



vba array function (4)

Además de las soluciones propuestas, y en caso de que tenga un rango de 1D a 1D array, prefiero procesarlo a través de una función como la siguiente. La razón es simple: si por alguna razón su rango se reduce a 1 rango de elementos, hasta donde yo sé el comando Rango (). El valor no devolverá una matriz de variantes sino solo una variante y no podrá asignar una variante variable a una matriz variante (previamente declarada).

Tuve que convertir un rango de tamaño variable en una matriz doble, y cuando el rango era de 1 tamaño de celda, no podía usar una construcción como range (). Value, así que procedo con una función como la siguiente.

Public Function Rng2Array(inputRange As Range) As Double() Dim out() As Double ReDim out(inputRange.Columns.Count - 1) Dim cell As Range Dim i As Long For i = 0 To inputRange.Columns.Count - 1 out(i) = inputRange(1, i + 1) ''loop over a range "row" Next Rng2Array = out End Function

Tengo un problema aparentemente básico pero no puedo encontrar ningún recurso para solucionarlo.

En pocas palabras, solo quiero cargar el contenido de un rango de celdas (todas una columna) en una matriz.

Soy capaz de lograr esto por medio de

DirArray = Array(Range("A1"), Range("A2"))

Pero por alguna razón, no puedo crear la matriz cuando se expresa de esta manera:

DirArray = Array(Range("A1:A2"))

Mi rango real es mucho más largo (y puede variar en longitud), por lo que no quiero tener que enumerar individualmente las celdas de esta manera. ¿Alguien puede decirme cómo cargar correctamente un rango completo en una matriz?

Con el último código:

MsgBox UBound(DirArray, 1)

Y

MsgBox UBound(DirArray)

Devuelve 0, mientras que con el primero devuelven 1.


Si lo hacemos así:

Dim myArr as Variant myArr = Range("A1:A10")

La nueva matriz tendrá dos dimensiones. Con lo cual no siempre es cómodo trabajar de alguna manera:

Para alejarnos de las dos dimensiones, al obtener una sola columna para el arreglo, podemos usar la función incorporada de Excel "Transponer". Con él, los datos se convierten en una dimensión:

Si tenemos los datos en una fila, una sola transposición no hará el trabajo. Necesitamos usar la función Transponer dos veces:


Simplemente defina la variable como una variante y haga que sean iguales:

Dim DirArray As Variant DirArray = Range("a1:a5").Value

No es necesario el comando Array.


Usar Value2 brinda un beneficio de rendimiento. Según el blog de Charles Williams

Range.Value2 funciona de la misma manera que Range.Value, excepto que no comprueba el formato de celda y no lo convierte a Fecha o Moneda. Y probablemente por eso es más rápido que .Value al recuperar números.

Asi que

DirArray = [a1:a5].Value2

Lectura adicional

  • Range.Value : devuelve o establece un valor de Variante que representa el valor del rango especificado.
  • Range.Value2 : la única diferencia entre esta propiedad y la propiedad Value es que la propiedad Value2 no utiliza los tipos de datos Moneda y Fecha.