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 Function
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...
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.