jueves, 5 de diciembre de 2013

Ordenar rango de celdas de texto con una matricial.

Hace ya bastante tiempo conté la manera de ordenar valores numéricos en un rango de celdas (ver). Hoy vamos a aplicar una técnica similar para ordenar un conjunto de celdas con texto.
En particular aprenderemos la particularidad de la función CONTAR.SI respecto a esta ordenación.

Nuestro objetivo será ordenar en sentido ascendente, esto es de A a Z, este conjunto de celdas:

Ordenar rango de celdas de texto con una matricial.



Para esto es fundamental comprobar los valores resultantes de aplicar CONTAR.SI sobre un rango de celdas con texto, veamos la imagen siguiente donde he colocado las cinco vocales...

Ordenar rango de celdas de texto con una matricial.


Observamos que la función:
=CONTAR.SI($A$2:$A$6;">="&A2)
con el operador mayor o igual que nos devuelve el número de elementos ordenados posteriores a la celda condicionada...
De igual forma
=CONTAR.SI($A$2:$A$6;"<="&A2)
nos dice el número de elementos en el rango a evaluar anteriores a la celda condicionada...

Dicho de otro modo el operador mayor o igual a me da una ordenación alfabética en sentido descendente (de Z a A), y el operador menor o igual a en sentido ascendente (de A a Z).
Así que ya tenemos la primera parte de nuestra fórmula matricial.


Si volvemos sobre nuestro listado original a ordenar en sentido ascendente, y para trabajar de una manera más sencilla, le asignaremos un nombre definido 'listado':
listado =Hoja1!$A$2:$A$20


A continuación seleccionaremos el rango contiguo en B2:B20 y en la celda activa B2 escribiremos nuestra matricial:
=INDICE(listado;COINCIDIR(K.ESIMO.MENOR(CONTAR.SI(listado;"<"&listado);FILA()-1);CONTAR.SI(listado;"<"&listado);0))
tras lo cual presionaremos Ctrl+Mayusc+Enter.

El resultado será nuestro 'listado' ordenado de A a Z:



Veamos la explicación en la imagen siguiente:

Ordenar rango de celdas de texto con una matricial.


Si vemos nuestra matricial, analizándola desde lo más profundo vemos qué obtenemos con
CONTAR.SI(listado;"<"&listado)
esto es, una primera asignación a cada elemento de nuestro rango de un ordinal ascendente (recordemos lo comentado anteriormente sobre CONTAR.SI).


Sobre este rango 'virtual' obtenido aplicamos la función K.ESIMO.MENOR
K.ESIMO.MENOR($D$2:$D$20;FILA()-1)
con el que ordenamos de menor a mayor el rango anterior, para ello nos aprovechamos de la función FILA obteniendo ordenado de arriba hacia abajo la posición menor primera, segunda, tercera, etc.


Sobre este rango, con COINCIDIR tendremos la posición real de ese ordinal dentro de nuestro 'listado' original:
COINCIDIR(E2;$D$2:$D$20;0)


Con la posición real dentro del listado es fácil, empleando la función INDICE, conseguir finalmente las celdas ordenadas:
INDICE(listado;F2)


Este es el proceso que conseguimos con nuestra matricial completa:
=INDICE(listado;COINCIDIR(K.ESIMO.MENOR(CONTAR.SI(listado;"<"&listado);FILA()-1);CONTAR.SI(listado;"<"&listado);0))

No hay comentarios:

Publicar un comentario en la entrada