Tabla de clasificación de una liga que se ordena sola: tres formas de montarla
De madrugada, Hector lanzó al grupo una petición que suena sencilla y que acabó generando tres enfoques radicalmente distintos. Tiene un libro con una hoja por jornada y una hoja "Tabla General" donde la clasificación se alimenta con fórmulas escritas a mano, celda a celda, del tipo SUMA('J1'!B2;'J 2'!B3;...) repetidas equipo por equipo. Lo que pedía: que la tabla se ordene sola por puntos, que desempate por diferencia de goles y, si sigue el empate, por goles a favor.
Antes de que llegara ninguna fórmula, un miembro le hizo notar un detalle del planteamiento: con 11 equipos son 10 jornadas (o 20 si hay ida y vuelta), no 11, porque un equipo no juega contra sí mismo.
A partir de ahí salieron tres soluciones que resuelven el mismo problema desde alturas muy diferentes.
1. Ordenar la tabla que ya existe
El enfoque menos invasivo: si la tabla ya está calculada, lo único que falta es ordenarla. Y eso es una sola función.
``
=ORDENAR(B2:J12;{9;8;6};-1)
`
La clave está en la constante matricial del segundo argumento. ORDENAR no se limita a una columna: acepta una matriz de columnas y con ella construye el orden anidado de una sola vez. Aquí ordena por la columna 9 (puntos), desempata por la 8 (diferencia de goles) y, si persiste el empate, por la 6 (goles a favor).
El tercer argumento admite el mismo truco. En este caso todas las columnas van descendentes (-1), pero si cada criterio necesitara un sentido distinto, se pasa otra matriz de órdenes con tantos elementos como columnas de ordenación tenga la primera.
2. Reconstruir la tabla con MAP y LAMBDA
Raúl Ramos fue un paso más allá: en vez de ordenar la tabla manual, la calcula entera desde los resultados de las jornadas, de modo que las fórmulas escritas a mano desaparecen.
Primero apila todas las jornadas y se queda solo con los partidos ya disputados:
`
=LET(_pj;--ESNUMERO(APILARV('J1:J 10'!$B$2:$B$6));FILTRAR(APILARV('J1:J 10'!$A$2:$D$6);_pj>0))
`
Y a partir de ahí recorre cada equipo con MAP y LAMBDA, sumando por separado lo que hizo como local y como visitante. Los partidos ganados, por ejemplo:
`
=MAP($G$18#;LAMBDA(_cr;
LET(
_lc;FILTRAR(_juegos;ELEGIRCOLS(_juegos;1)=_cr;{0\0\0\0});
_vt;FILTRAR(_juegos;ELEGIRCOLS(_juegos;3)=_cr;{0\0\0\0});
_pg1;SUMA(--(ELEGIRCOLS(_lc;2)>ELEGIRCOLS(_lc;4)));
_pg2;SUMA(--(ELEGIRCOLS(_vt;4)>ELEGIRCOLS(_vt;2)));
_pg1+_pg2
)))
`
Los empates, los perdidos y los goles siguen el mismo patrón cambiando el operador o las columnas que se comparan. Fíjate en el tercer argumento de FILTRAR: {0\0\0\0} es el valor de respaldo cuando no hay coincidencias, y evita que un equipo sin partidos rompa la cadena.
Lo más ingenioso de su libro está en el final. Cada columna de la tabla es un rango derramado con nombre definido (Equipo, PJ, PG, GF, PTS...), y para ordenar el bloque entero construye la dirección del rango como texto y la resuelve con INDIRECTO:
`
=ELEGIRFILAS(DIRECCION(FILA(Equipo);COLUMNA(Equipo));1)&":"&ELEGIRFILAS(DIRECCION(FILA(PTS);COLUMNA(PTS));-1)
`
`
=ORDENAR(INDIRECTO(S16);{9;8;6};-1)
`
ELEGIRFILAS(...;1) toma la primera celda del rango derramado y ELEGIRFILAS(...;-1) la última, así que el rango se estira solo cuando entran equipos nuevos. Añadió además una columna de verificación que compara su resultado contra la tabla manual original: =SI(O18#=O2:O12;"✅";"❌").
3. Una sola fórmula para todo
Leo se lo llevó al extremo: toda la clasificación, cálculos incluidos, en una única fórmula en Tabla General!C6.
`
=LET(
C;ELEGIRCOLS;
V;APILARV;
H;APILARH;
todo3D;APILARV(Ini:Fin!A2:D6);
f;FILTRAR(todo3D;C(todo3D;2)<>"");
gl;C(f;2);
gv;C(f;4);
d;gl-gv;
equip;V(C(f;1);C(f;3));
p;SI.CONJUNTO(d>0;3;d=0;1;1;0);
g;V(p;SI.CONJUNTO(p=3;0;p=1;1;1;3));
gf;V(gl;gv);
gc;V(gv;gl);
tbl;AGRUPARPOR(equip;H(N(equip>0);N(g=3);N(g=1);N(g=0);gf;gc;gf-gc;g);SUMA;;0);
H(SECUENCIA(FILAS(tbl));ORDENAR(tbl;{9;8;6};-1))
)
`
Hay dos ideas que merecen mirarse con calma.
La primera es APILARV(Ini:Fin!A2:D6), una referencia 3D: en lugar de nombrar las hojas una a una, apila ese mismo rango de todas las hojas comprendidas entre Ini y Fin. Leo añadió al libro dos hojas vacías con esos nombres que funcionan como topes, y lo dejó escrito en la propia hoja: las jornadas nuevas se crean entre Ini y Fin, y entran en el cálculo sin tocar la fórmula.
La segunda es el doble apilado que convierte cada partido en dos filas. equip apila los locales sobre los visitantes, y g apila los puntos del local sobre los del visitante invertidos (SI.CONJUNTO(p=3;0;p=1;1;1;3)): donde el local ganó 3, el visitante recibe 0, y viceversa. Con eso, un AGRUPARPOR por equipo suma de golpe partidos jugados, ganados, empatados, perdidos, goles a favor, en contra, diferencia y puntos, sin distinguir ya si el equipo jugaba en casa o fuera.
Un detalle honesto del hilo: Leo publicó primero el filtro como FILTRAR(todo3D;C(todo3D;2)) y él mismo se corrigió al rato, porque filtrar por "distinto de 0" no es lo correcto cuando lo que hay es una celda vacía. La versión buena es la de arriba, con <>"". El fichero adjunto conserva la primera versión, así que si lo abres, ese es el único cambio que hay que hacerle.
Sobre los tres enfoques planea la misma advertencia: ORDENAR, FILTRAR, AGRUPARPOR, MAP` y las referencias derramadas son funciones de Microsoft 365. El propio Hector preguntó al final del hilo si funcionaría en Office 2016, y la respuesta es que no.
Su reacción resume bien el hilo: "cuando parece que no puede uno sorprenderse más, solo es suficiente con mandar una duda al grupo".
Montar la clasificación de una liga en Excel es uno de esos problemas que parecen triviales hasta que te sientas a hacerlo. Ordenar por puntos es fácil. Lo que complica todo es el desempate: si dos equipos empatan a puntos manda la diferencia de goles, y si también coinciden ahí, los goles a favor. Añade que los datos están repartidos en una hoja por jornada y que la tabla debe actualizarse sola conforme se juegan partidos, y lo trivial se convierte en un rompecabezas.
Esto es exactamente lo que planteó un miembro de la comunidad, y las tres respuestas que recibió son una lección de que en Excel casi nunca hay una única altura correcta desde la que atacar un problema.
El problema
El libro de partida tenía una hoja por jornada y una hoja "Tabla General" alimentada con fórmulas escritas a mano, celda a celda, sumando posiciones concretas de cada jornada equipo por equipo. Funcionaba, pero era frágil: cada jornada nueva obligaba a tocar fórmulas, y la tabla no se reordenaba sola.
Un apunte que salió antes que ninguna fórmula, y que conviene recordar al diseñar cualquier calendario: con 11 equipos son 10 jornadas, no 11. Un equipo no juega contra sí mismo.
Solución paso a paso
Ordenar lo que ya está calculado. Si la tabla ya existe, el problema entero se reduce a una función:
=ORDENAR(B2:J12;{9;8;6};-1)La constante matricial del segundo argumento es la clave. ORDENAR no se limita a una columna: acepta una matriz de columnas y con ella construye el orden anidado de una sola pasada. Primero la columna 9 (puntos), luego la 8 (diferencia de goles), luego la 6 (goles a favor). El tercer argumento admite el mismo truco: si un criterio necesitara ir ascendente y otro descendente, se pasa otra matriz de órdenes con tantos elementos como columnas de ordenación.
Reconstruir la tabla desde los resultados. El segundo enfoque elimina las fórmulas manuales calculando la clasificación desde cero. Se apilan todas las jornadas, se filtran los partidos ya disputados, y se recorre cada equipo con MAP y LAMBDA, sumando por separado su papel como local y como visitante:
=MAP($G$18#;LAMBDA(_cr;
LET(
_lc;FILTRAR(_juegos;ELEGIRCOLS(_juegos;1)=_cr;{0\0\0\0});
_vt;FILTRAR(_juegos;ELEGIRCOLS(_juegos;3)=_cr;{0\0\0\0});
SUMA(N(ELEGIRCOLS(_lc;2)>ELEGIRCOLS(_lc;4)))+SUMA(N(ELEGIRCOLS(_vt;4)>ELEGIRCOLS(_vt;2)))
)))El tercer argumento de FILTRAR, {0\0\0\0}, es el valor de respaldo cuando no hay coincidencias: evita que un equipo todavía sin partidos rompa la cadena.
El remate de este enfoque es elegante: cada columna de la tabla es un rango derramado con nombre definido, y la dirección del bloque completo se construye como texto para resolverla después con INDIRECTO. ELEGIRFILAS(rango;1) da la primera celda y ELEGIRFILAS(rango;-1) la última, así que el rango a ordenar se estira solo cuando entran equipos nuevos.
Todo en una sola fórmula. El tercer enfoque resuelve la clasificación entera en una única celda con LET, y contiene las dos ideas más reutilizables del caso.
La primera es la referencia 3D: APILARV(Ini:Fin!A2:D6) apila ese rango de todas las hojas comprendidas entre Ini y Fin. Creando dos hojas vacías con esos nombres a modo de topes, cada jornada nueva que se inserte entre ellas entra en el cálculo sin tocar la fórmula.
La segunda es el doble apilado. Cada partido se convierte en dos filas: una para el local y otra para el visitante, con los puntos invertidos mediante SI.CONJUNTO, de forma que donde el local suma 3 el visitante suma 0. A partir de ahí, un solo AGRUPARPOR por equipo obtiene partidos jugados, ganados, empatados, perdidos, goles a favor, en contra, diferencia y puntos, sin tener que distinguir ya si el equipo jugaba en casa o fuera.
Funciones clave
ORDENAR: acepta una matriz de columnas como índice de ordenación y resuelve el orden anidado de una vez.APILARV: admite referencias 3D, es decir, un rango tomado de todas las hojas entre dos hojas tope.AGRUPARPOR: agrega varias columnas de métricas por una clave, aquí el nombre del equipo.MAPyLAMBDA: recorren una lista de equipos aplicando el mismo cálculo a cada uno.FILTRAR: su tercer argumento define el valor de respaldo cuando no hay coincidencias.ELEGIRFILAScon índice negativo: devuelve la última fila de un rango derramado, útil para construir rangos que crecen solos.
Conclusión
El mismo enunciado admitió una solución de una línea, otra que reconstruye la tabla equipo por equipo y otra que lo hace todo en una celda. Ninguna es la buena en abstracto: depende de si quieres tocar poco lo que ya tienes o de si prefieres un libro que no haya que mantener nunca más.
Conviene tener presente que ORDENAR, FILTRAR, AGRUPARPOR, MAP y los rangos derramados son funciones de Microsoft 365 y no están disponibles en versiones como Office 2016. Casos como este nacen a diario en la comunidad de Influexcel, donde alguien plantea un problema real y varios miembros lo resuelven desde ángulos distintos.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Error #CALC con MAP y AGRUPARPOR: solución con REDUCE+APILARV CasoNuevo reto de Excel resuelto por la comunidad: un usuario necesita aplicar AGRUPARPOR de forma iterativa sobre un rango de códigos de cuenta
- Readmisión de pacientes en 48h: Power Query, LAMBDA/MAP y AGRUPARPOR CasoAndrés Rojas plantea un reto real de datos clínicos: a partir de una tabla con más de un millón de registros de urgencias (IdPaciente, Fecha
- Filtro multicriteria dinámico con LET, FILTRAR y LAMBDA CasoHector comparte con la comunidad una fórmula avanzada para filtrar una tabla de productos/servicios por múltiples criterios opcionales (clav
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- Optimización de REDUCE+APILARV con LAMBDA recursiva en bisección CasoAlejandro plantea un reto de rendimiento interesante: tiene una fórmula LET enorme que calcula la permanencia de carga en puerto por matrícu
- Reto de agrupación y pivotado: AGRUPARPOR vs ARCHIVOMAKEARRAY vs MAP CasoLeandro trae un reto de internet al grupo: a partir de una tabla con claves repetidas y valores, generar una tabla pivotada donde cada clave
- Generar la serie de Fibonacci con REDUCE, APILARV y LAMBDA CasoInteresante ejercicio compartido en la comunidad: generar los primeros N números de la serie de Fibonacci usando exclusivamente fórmulas de
- Filtrar una tabla por una lista de valores: una LAMBDA propia y su inversa TutorialTe pasan una lista de 30 números de albarán y hay que sacar esas filas de una tabla de miles. Con el autofiltro es marcar casillas una a una
- Saldo acumulado por mes: tres enfoques (REDUCE+BYROW, PIVOTARPOR+acumulado, MMULT) CasoJuan plantea una pregunta que parece sencilla y se acaba convirtiendo en tres clases magistrales sobre cómo recorrer una matriz mes a mes. T
- SI.ERROR falla con textos de más de 255 caracteres: alternativa con ESERROR CasoUn caso que pilló desprevenida a la comunidad: al usar FILTRAR sobre una columna que contiene textos largos (más de 255 caracteres), las fil