POWERQUERY: FUNCIONES PERSONALIZADAS (Caso Práctico)
Conocer cómo crear tus propias funciones te permite conseguir transformaciones imposibles utilizando la UI de PowerQuery. Adéntrate en una de las partes más interesantes del código M!
Crear funciones personalizadas en Power Query suele intimidar porque no es una opción precargada en la interfaz: hay que escribirla a mano en el editor avanzado. En esta sesión partimos de lo más sencillo (una función que calcula el trimestre) y vamos subiendo la dificultad hasta resolver un caso real que surgió en el grupo: consolidar varios ficheros cuya información viene partida en dobles cabeceras dentro de cada registro. La idea es trabajar paso a paso, como quien levanta una pared ladrillo a ladrillo, para no perderse en el camino.
La sintaxis de una función personalizada
Toda función en Power Query empieza con una estructura let ... in, muy parecida a la función LET de Excel. En let vamos generando las variables que necesitamos y en in elegimos qué devuelve la función.
Para convertir una consulta en función, se empieza declarando los parámetros entre paréntesis, seguidos de =>:
- Abrir un nuevo origen: Otros orígenes → Consulta en blanco.
- Entrar al editor avanzado.
- Escribir los parámetros, por ejemplo
(mes as number) =>. - Dentro de
let, calcular el resultado en una variable (por convención,output). - En
in, devolver esa variable.
Indicar el tipo de dato del parámetro (as number, as table) no es obligatorio, pero ayuda a prevenir errores.
Primeras funciones: trimestre e IVA
La función trimestre toma el número de mes y lo convierte en su trimestre. La fórmula es redondear hacia arriba el mes dividido entre tres con Number.RoundUp(mes / 3). Así, los meses 1, 2 y 3 devuelven el primer trimestre, el 4 ya devuelve el segundo, etc. Una vez creada, se puede invocar desde una columna personalizada con función trimestre pasándole el campo periodo, en lugar de repetir la fórmula completa cada vez.
La función tax calcula el impuesto sobre un importe: Number.Round(importe * 0.21, 2), multiplicando por el 21 % y redondeando a dos decimales. Igual que antes, se invoca desde una columna personalizada pasándole los euros.
La ventaja es clara: tener una serie de cálculos ya hechos de forma fácil y reutilizable, igual que haríamos con una función LAMBDA en Excel.
Funciones que imitan a las dinámicas de Excel
Las funciones de Power Query no solo manejan datos sueltos: también trabajan con tablas, columnas y listas. Aprovechando esto, recreamos varias funciones dinámicas de Excel:
tomar: Excel tieneTOMAR, que con un número positivo coge las primeras filas y con uno negativo las últimas. Power Query no tiene una única función equivalente, sino dos separadas (Table.FirstNyTable.LastN). La solución es una función con dos parámetros (tablayfilas) y un condicional:if filas > 0 then Table.FirstN(tabla, filas) else Table.LastN(tabla, filas * -1). El signo negativo se invierte para pasar siempre un número positivo aTable.LastN.listar: convierte una tabla en una lista de listas, donde cada columna pasa a ser una lista independiente. Usa la función nativaTable.ToColumns(tabla).apilarV: simula la funciónAPILARVde Excel, poniendo una lista debajo de otra. UsaList.Combine({lista1, lista2}); las listas en Power Query se escriben entre llaves{}.controlT: a partir de una lista de columnas genera una tabla, el equivalente alCtrl+Tde Excel. UsaTable.FromColumns(columnas).
Acotar funciones nativas que tienen muchos parámetros a nuestro uso habitual (uno o dos argumentos) nos permite trabajar de forma más ágil y construir nuestra propia librería.
El caso práctico: consolidar ficheros con doble cabecera
El reto real eran varios ficheros con una estructura incómoda: cada registro venía partido en dos pares de filas (nombre de campo / valor). El objetivo: consolidarlos en una tabla plana. Combinando las funciones anteriores, el tratamiento de cada fichero queda así:
tomar(datos, 2)para quedarse con las dos primeras filas ytomar(datos, -2)para las dos siguientes, generando dos bloques.listarsobre cada bloque para convertirlos en listas de columnas.apilarVpara unir ambas listas en una sola.controlT(Table.FromColumns) para reconstruir una tabla con todos los pares alineados.Table.PromoteHeaderspara usar la primera fila como encabezado.- Anular dinamización de otras columnas (
unpivot), dejando fija la referencia (el número de albarán) para que se repita en cada fila.
Un truco para depurar: el registro de pasos
En lugar de encadenar variables secuenciales, se puede envolver todo el bloque let en un registro usando corchetes [ ... ], separando cada paso con comas. Al devolver ese registro completo, Power Query muestra todos los pasos a la vez y se puede inspeccionar el resultado de cada uno por separado. Es muy útil mientras se desarrolla y para localizar dónde está fallando algo. Cuando la función ya está lista, basta con devolver solo el último paso (output[tabla_formateada]).
De consulta a función reutilizable
Todo ese tratamiento se encapsula en una función formateo(archivo as binary) que recibe el binario de cada fichero, lo interpreta como un libro de Excel (Excel.Workbook) y aplica todos los pasos. Después, al obtener datos de una carpeta, en lugar de consolidar directamente se añade una columna personalizada que invoca formateo sobre la columna de binarios. Cada fichero queda transformado y ya se puede expandir y consolidar en una única tabla. Si llega un fichero nuevo a la carpeta, basta con actualizar para que se incorpore automáticamente.
Conclusión
Crear funciones personalizadas en Power Query es más sencillo de lo que parece: paréntesis, parámetros, => y a trabajar los datos. Desde cálculos básicos como el trimestre o el IVA hasta recrear funciones dinámicas de Excel y combinarlas para resolver una consolidación compleja, la clave está en avanzar paso a paso. Construir tu propia librería de funciones reduce el coste de mantenimiento, te da confianza en cada paso y te permite resolver casos que las opciones estándar de Power Query no cubren de forma directa.
Más contenido de Excel en InflueXcel
- Acumular el saldo en PIVOTARPOR: una función de agregación distinta por columna CasoNuevo caso que empieza con una suposicion razonable y acaba en una contraprueba del propio autor. Juan trae un libro mayor en bruto y quiere
- CONTAR.SI no acepta ELEGIRCOLS: por qué las funciones .SI exigen una referencia y no una matriz CasoHay errores de Excel que te mandan a buscar en la dirección equivocada, y este es de manual. Joan Recasens llega al grupo con una fórmula qu
- Dar formato a la última fila de una tabla que crece (y el techo del formato condicional) CasoUn miembro de la comunidad llega con una tabla cuyo rango real va de la columna embalaje a la columna total, y cuya columna de numeración co
- Colorear la fila entera según el técnico asignado: la referencia mixta que casi nadie aplica bien CasoEsta semana surgió una duda que parece de principiante y en realidad esconde el concepto peor entendido del formato condicional. Johann Frar
- Del VBA a una sola fórmula: calcular el RFC mexicano con LET, MAP y expresiones regulares CasoHector llega al grupo con un problema que no se ve todos los días: tiene resuelto el cálculo del RFC mexicano, pero lo tiene en VBA, y quier
- Un rango desbordado como serie de un gráfico: el nombre tiene que ser de ámbito Hoja CasoMiki llega al grupo con un caso de esos que no dan error, simplemente no funcionan. Quiere un gráfico que crezca solo: si mañana hay más dat
- Tabla de clasificación de una liga que se ordena sola: tres formas de montarla CasoDe madrugada, Hector lanzó al grupo una petición que suena sencilla y que acabó generando tres enfoques radicalmente distintos. Tiene un lib
- Conciliación contable: una sola fórmula por hoja que cuadra, descuadra y avisa CasoEsta semana alguien preguntó en el grupo si tenía sentido montarse un fichero para conciliaciones bancarias. La respuesta llegó en forma de
- Contar valores únicos respetando filtros manuales: SUBTOTALES + MAP al rescate CasoMiki lanza una pregunta que parece sencilla pero esconde un buen reto: ¿cómo contar valores únicos en una columna cuando hay filtros manuale
- Timeline chart dinámico en Excel con etiquetas que no se pisan TutorialUn timeline en Excel se ve muy bien hasta que añades el cuarto evento y las etiquetas empiezan a solaparse. Colocarlas a mano funciona una v