lunes, 9 de julio de 2012

Ordenar Automáticamente una Lista

"Tengo una tabla con cifras de ventas de distintas zonas y me gustaría generar otra tabla idéntica que me ordenara automáticamente de mayor a menor dichas zonas en función de las ventas logradas".

Vamos a ello. Utilizaremos tres funciones, a saber: K.ESIMO.MAYOR, INDICE y COINCIDIR. Partimos del siguiente ejemplo:

Lo que queremos conseguir es que tras realizar las fórmulas necesarias obtengamos una copia de la lista original pero ordenada en base a la cifra de ventas:

Lo primero que vamos a hacer es crear nombres para los dos rangos que utilizaremos dentro de nuestras fórmulas. Para ello seleccionamos el rango B3:B13 y en el cuadro de nombres (a la izquierda de la barra de fórmulas) escribimos el nombre ZONA. Hacemos lo mismo con el rango C3:C13 y le damos el nombre VENTAS.

Nos situamos ahora en la celda G3 y escribimos la siguiente fórmula:
=K.ESIMO.MAYOR(ventas;E3)   y copiamos dicha fórmula hasta la celda G13.


La función K.ESIMO.MAYOR  devuelve el k-ésimo mayor valor de un conjunto de datos. En nuestro ejemplo el conjunto de datos es el rango VENTAS y al indicarle como segundo argumento de la función E3 le estamos pidiendo el primer valor mayor de dicho conjunto (y así sucesivamente en la celda G4, G5, etcétera). De esta manera obtenemos una lista ordenada de mayor a menor de las ventas. Ya sólo nos queda colocar a la izquierda la zona con la que se corresponden dichas ventas.

Nos situamos ahora en la celda F3 y escribimos la fórmula:
=INDICE(zona;COINCIDIR(G3;ventas;0))


La función COINCIDIR nos proporciona el número de fila en el que se encuentra cada cifra de ventas en la tabla original. Introduciendo este dato en la función INDICE como argumento de número de fila ya tenemos resuelto el problema de localizar la zona con la que se corresponde cada cifra de ventas.

Ahora, cada vez que modifiquemos alguna cifra en la tabla original la tabla de la derecha se reorganizará automáticamente. Puede comprobarlo escribiendo, por ejemplo, 400 en Galicia y 600 en Madrid. El resultado será esta otra tabla:

martes, 3 de julio de 2012

Contar Registros Únicos

"Tengo más de 1.000 registros (números) en una columna. Muchos de ellos están repetidos y lo que me gustaría es poder contar, con fórmulas, cuántos son únicos".

Esta es la pregunta de mi querido hermano Santi a quién, evidentemente, le dedico este post (que generoso soy...). Hay diversas soluciones. Una de ellas sería haciendo uso de los Filtros Avanzados, como ya describí en mi post "Copiar Registros Únicos". También podemos generar una Tabla Dinámica y aplicar la función CONTAR para ver el número de registros únicos. Pero buscamos una solución con fórmula (no con herramientas). Para ello vamos a utilizar las siguientes funciones: Y, CONTAR, CONTAR.SI y Fórmulas Matriciales. Partimos del siguiente ejemplo:

Lo que vamos a hacer en el rango C3:C20 es comprobar si cada uno de los valores que hay en el rango B3:B20 es único o no. Para ello vamos a utilizar una fórmula matricial que, como ya sabéis, se caracteriza porque al finalizar pulsamos Ctrl + Shift + Enter. Nos situamos en la celda C3 y escribimos:
=Y(B3<>$B$2:B2) y acabamos pulsando Ctrl+Shift+Enter, lo que convierte esta fórmula en:
{=Y(B3<>$B$2:B2)}   Copiamos C3 hasta C20.

En esta fórmula hay varias cuestiones importantes:

1. Al poner dólares (referencias absolutas) en el primer término del rango B2:B2, quedando como $B$2:B2 conseguimos que cuando copiemos esta fórmula hacia abajo el rango se vaya ampliando, ya que el origen se mantiene fijo ($B$2) mientras que el segundo término se va ampliando a B3, B4, etcétera.

2. Con la fórmula matricial conseguimos comparar una celda contra todas las que le "quedan por encima". Por ejemplo, en la celda C8 la fórmula que aparecerá será:
{=Y(B8<>$B$2:B7)}
Esta fórmula está comprobando si la celda B8 es distinta de B2, B3, B4, B5, B6 y B7. En el caso que esto sea cierto excel devolverá el resultado de VERDADERO (FALSO en el caso contrario) como se observa a continuación:

Una vez hemos conseguido diferenciar los registros únicos la solución es muy sencilla. Preparamos la siguiente salida de datos:

Escribimos las siguientes fórmulas:
En la celda F3, para contar los registros totales  =CONTAR(B3:B20)
En la celda F4, para contar los registros únicos  =CONTAR.SI(C3:C20;VERDADERO)

Como se puede ver, existen 18 registros en total pero sólo 9 son únicos, a saber: 10, 20, 30, 40, 50, 60, 70, 80 y 90.

He propuesto esta solución porque me parece razonablemente sencilla de comprender y desarrollar. Pero se podría solucionar con una única fórmula como propone JLD en su blog.  La fórmula sería: 
{=SUMA(1/CONTAR.SI(B3:B20;B3:B20))}

Por aquello de no apropiarme de lo que no es mío, puedes encontrar la explicación a esta fórmula en:
http://jldexcelsp.blogspot.com.es/2007/08/contar-valores-nicos-en-un-rango-de.html