Como continuación del artículo anterior, donde mencionaba el uso de Arrays de arrays (jagged arrays-array escalonada o array irregular), pondré hoy un ejemplo del uso de la técnica, que nos permitirá replicar la función M de Power Query: Table.SelectColumns, o la lnueva función de Excel: ELEGIRCOLS
El desarrollo de nuestra función UDF nos llevará a obtener, en un solo rango, juntas, los campos elegidos... empleando el método de construir una Array de arrays (de columnas o campos de una tabla).
Veamos el código de nuestra UDF insertado en un módulo estándar...
para depurar errores que pudieran aparecer, en cuanto a las dimensiones de las arrays y/o rangos, he numerado las líneas del código, y añadido un control de errores con la función de VBA: Erl
He empleado las mismas técnicas descritas en el post anterior, donde básicamente se identifican y extraen las columnas/campos indicados en el primer argumento de nuestra UDF.
A partir del segundo argumento, será el rango de celdas o Tabla, recuperamos el encabezado para localizar las posiciones de las columnas, y por extensión, los valores asociados a cada campo...
Finalmente devolvemos a la hoja de cálculo la matriz resultante...
El desarrollo de nuestra función UDF nos llevará a obtener, en un solo rango, juntas, los campos elegidos... empleando el método de construir una Array de arrays (de columnas o campos de una tabla).
Veamos el código de nuestra UDF insertado en un módulo estándar...
Function fxSelectColumns(ByRef arrCampos() As Variant, rngDatos As Range)
On Error GoTo trato_errores
'generamos una array de arrays (cada campo será una array)
10 Dim arrJagged() As Variant
20 x = 0
30 For a = LBound(arrCampos) To UBound(arrCampos)
40 ReDim Preserve arrJagged(x) As Variant
50 col = Application.Match(arrCampos(a, 1), rngDatos.Offset(-1, 0).Resize(1, rngDatos.Columns.Count), 0)
''' simplificamos y reducimos dimensiones
60 Dim txt As String, arrTmp As Variant
70 txt = Join(Application.Transpose(rngDatos.Columns(col)), "|")
80 arrTmp = Split(txt, "|")
'''
90 arrJagged(x) = arrTmp 'rngDatos.Columns(col)
100 x = x + 1
110 Next a
120 fxSelectColumns = Application.Transpose(arrJagged)
Exit Function
trato_errores:
Debug.Print Err.Description & "_ línea" & Erl()
End Functionpara depurar errores que pudieran aparecer, en cuanto a las dimensiones de las arrays y/o rangos, he numerado las líneas del código, y añadido un control de errores con la función de VBA: Erl
He empleado las mismas técnicas descritas en el post anterior, donde básicamente se identifican y extraen las columnas/campos indicados en el primer argumento de nuestra UDF.
A partir del segundo argumento, será el rango de celdas o Tabla, recuperamos el encabezado para localizar las posiciones de las columnas, y por extensión, los valores asociados a cada campo...
Finalmente devolvemos a la hoja de cálculo la matriz resultante...

No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.