Encontrar en qué columna está el máximo: BYCOL + BUSCARX vs TOMAR + SI
A partir de una tabla de datos donde cada fila tiene valores distribuidos en varias columnas con cabeceras compuestas (ej: "Madrid - Ventas", "Barcelona - Ventas"), alguien necesita encontrar en qué columna se encuentra el valor máximo de toda la matriz.
John propone una primera solución con DIVIDIRTEXTO + INDICE + MIN + SI:
``
=DIVIDIRTEXTO(
INDICE(E3:J3;
MIN(SI(MAX(E4:J12)=E4:J12; COLUMNA(E3:J3)-COLUMNA(D3)))
) - 1;
" - "
)
`
Hugo contraataca con una versión más directa usando TOMAR y BYCOL:
`
=TEXTOANTES(
TOMAR(
SI(BYCOL(--(E4:J12=MAX(E4:J12)); SUMA); D3:I3)
;; -2);
" - "
)
`
Pero John señala un problema: el TOMAR(;;-2) asume que los valores mayores están al final, lo cual no siempre es así. Entonces ofrece una versión más robusta con BUSCARX:
`
=DIVIDIRTEXTO(
BUSCARX(1; --BYCOL(E4:J12=MAX(E4:J12); O); D3:I3);
" - "
)
`
La clave aquí es BYCOL(E4:J12=MAX(E4:J12); O): genera un vector booleano por columna (¿contiene esta columna el máximo?), y BUSCARX encuentra la primera columna con VERDADERO y devuelve su cabecera. El -- convierte booleanos a números y O` (OR) agrega por columna.
El problema: no cuánto es el máximo, sino dónde está
Tienes una tabla donde cada fila reparte sus valores entre varias columnas, y las cabeceras son compuestas: "Madrid - Ventas", "Barcelona - Ventas"... Encontrar el valor máximo de toda la matriz es trivial con MAX. Lo que pedía este miembro de la comunidad era otra cosa: saber en qué columna está ese máximo, y devolver su cabecera.
El caso derivó en un pequeño duelo entre John y Hugo, con una lección muy útil por el camino: la primera solución que funciona no siempre es la que aguanta.
Primer intento: MIN + SI + COLUMNA
John abre con un enfoque clásico:
`` =DIVIDIRTEXTO( INDICE(E3:J3; MIN(SI(MAX(E4:J12)=E4:J12; COLUMNA(E3:J3)-COLUMNA(D3))) ) - 1; " - ") ``
La idea: SI(MAX(...)=rango; COLUMNA(...)) devuelve el número de columna allí donde está el máximo y FALSO en el resto. MIN se queda con el primero, INDICE recupera la cabecera y DIVIDIRTEXTO la parte por el separador " - ".
Funciona, pero arrastra aritmética de columnas (COLUMNA(E3:J3)-COLUMNA(D3)) que hay que ajustar a mano si mueves la tabla.
Segundo intento: TOMAR + BYCOL
Hugo contraataca con algo más directo:
`` =TEXTOANTES( TOMAR( SI(BYCOL(N(E4:J12=MAX(E4:J12)); SUMA); D3:I3) ;; -2); " - ") ``
Aquí BYCOL colapsa la matriz a un vector: por cada columna, suma cuántas celdas son el máximo. N convierte los VERDADERO/FALSO en unos y ceros (el original usaba el truco de la doble negación, dos signos menos seguidos, que hace exactamente lo mismo). Después TOMAR se queda con la cabecera resultante.
El fallo que se le escapó
Y aquí llega el matiz que da valor al caso. John señala el problema: TOMAR con un índice negativo asume que el resultado está al final, y eso solo es cierto si da la casualidad de que el máximo está en las últimas columnas. Cambia los datos y la fórmula devuelve la cabecera equivocada, sin dar error. De los fallos peores: silencioso.
La solución robusta: BYCOL + BUSCARX
John cierra con la versión que sí aguanta cualquier reparto de datos:
`` =DIVIDIRTEXTO( BUSCARX(1; N(BYCOL(E4:J12=MAX(E4:J12); O)); D3:I3); " - ") ``
La clave está en BYCOL(E4:J12=MAX(E4:J12); O): genera un vector booleano con una pregunta por columna, ¿contiene esta columna el máximo?. O (la función OR) agrega por columna, así que basta con que una celda lo sea. N pasa ese vector a unos y ceros, y BUSCARX busca el primer 1 y devuelve directamente la cabecera correspondiente.
Sin aritmética de columnas, sin suposiciones sobre la posición y sin depender de dónde caiga el máximo.
Funciones clave
BYCOL: aplica una función columna a columna y devuelve un vector con un resultado por columna. La pieza central de las dos soluciones buenas.O: como agregador dentro deBYCOL, responde "¿alguna celda de esta columna cumple?".N: convierte VERDADERO/FALSO en 1/0. Equivalente al truco de la doble negación, pero se lee mejor.BUSCARX: busca el 1 en el vector y devuelve la cabecera de esa misma posición.DIVIDIRTEXTOyTEXTOANTES: separan la cabecera compuesta por el " - ".TOMAR: útil, pero cuidado con asumir que lo que buscas está al principio o al final.
La lección
Las tres fórmulas devolvían el resultado correcto con los datos de ejemplo. Solo una lo sigue devolviendo cuando los datos cambian. Es un recordatorio de que probar una fórmula con un único juego de datos no demuestra gran cosa, sobre todo cuando la fórmula esconde una suposición sobre el orden.
Conclusión
BYCOL convirtiendo una matriz en un vector de preguntas, y BUSCARX localizando la respuesta: dos funciones y el problema resuelto de forma que no se rompe. Este ida y vuelta entre miembros, donde alguien encuentra el agujero de la solución de otro, es exactamente lo que pasa cada semana en la comunidad de Influexcel.
Más contenido de Excel en InflueXcel
- Cuenta clientes y cervezas en Excel 🍺 Caso "La Taberna: El Poney Pisador" (Nivel 1) Tutorial🍺 Noche cerrada en Bree. Frodo, Sam, Merry y Pippin cruzan la puerta de El Poney Pisador huyendo de los Jinetes Negros: la sala está a reven
- SUMAR.SI.CONJUNTO en acción con El Señor de los Anillos 🃏 El 21 de La Comarca TutorialLo que practicamos en este caso: • Contar cartas por palo con CONTAR.SI • Sumar valores con condiciones (SUMAR.SI / SUMAR.SI.CONJUNTO) • Apl
- Reto de Excel: El cumpleaños de Bilbo 🎂 | CONTAR.SI y SUMAR.SI desde cero (Nivel 1) TutorialEn La Comarca se celebra el cumpleaños número 111 de Bilbo Bolsón: cerveza, pasteles, fuegos artificiales… y algún curioso escondido tras el
- ¡Excel PowerQuery Hack! Conexiones con rutas relativas en 10 minutos! Tutorial¿Harto de ajustar las conexiones en PowerQuery cada vez que compartes tu archivo de Excel? 🙄 Convierte las conexiones de PowerQuery con ruta
- Mejora un 90% el rendimiento de Power Query con SQLite TutorialPower Query es una herramienta potente para consolidar, combinar y calcular datos, pero cuando trabajamos con millones de registros y calcul
- Reorganizar tablas mensuales: cruzar por persona buscando en vertical y en horizontal CasoNuevo caso interesante de la comunidad. Juan tenía varias tablas mensuales (a veces más de una en el mismo mes) y quería reorganizarlas por
- Un dato de todas las hojas, escrito una sola vez CasoEsta semana surgió en la comunidad un reto muy habitual cuando un libro tiene muchas hojas: mostrar el valor de la celda B3 de cada hoja, in
- Un índice de hojas que se genera solo: HYPERLINK en rangos desbordados CasoEsta semana surgió en la comunidad un pequeño "expediente X". Un miembro llegó tras ver un vídeo con una idea clara en la cabeza: montar una
- Reformatear un código alfanumérico al teclear: de NN1234567 a NN-12345-67 CasoEsta semana surgió en la comunidad una duda muy práctica: cómo conseguir que al escribir un código tipo NN1234567 (dos letras seguidas de si
- Reclasificación contable: duplicar cada fila con una conversión distinta por columna, en un único bloque CasoInteresante reto contable planteado esta semana por un miembro de la comunidad. Juan parte de una tabla de apuntes contables (rango C7:P10)