miércoles, 26 de agosto de 2015

Ordenar con Fórmulas en Base a dos Criterios

"Mi pregunta es la siguiente ¿Cómo solucionar el ordenar con fórmulas una lista con cifras repetidas utilizando una segunda variable? En el ejemplo que nos muestras en Ordenar Automáticamente una Lista con Valores Repetidos me interesa ordenar los casos repetidos teniendo en cuenta el número de empleados de cada zona. Es decir, que quede por delante, en caso de iguales ventas, la zona que menos empleados tenga".

Empecemos recordando el ejemplo en cuestión y añadiéndole, de paso, la columna de número de empleados:
Como se puede comprobar, hay zonas que obtienen idéntica cifra de ventas, como por ejemplo Galicia, Asturias y Madrid o Aragón y País Vasco, etcétera. En el post Ordenar Automáticamente una Lista con Valores Repetidos resolvimos la cuestión de ordenar automáticamente (con fórmulas) esta lista y, por otro lado, resolvimos el problema de encontrarnos con valores repetidos. En este caso lo que buscamos es ordenar por medio de fórmulas esta lista pero en base no a uno si no a dos criterios. Es decir, que primero ordene las zonas en base a la cifra de ventas y que en aquellos casos en los que haya empate sea el número de empleados el criterio a seguir para establecer el orden.
Lo primero que hacemos es crear una columna para realizar un proceso intermedio, a la que llamaremos Proceso1:
La fórmula que he escrito en la celda G3 y que después he copiado hasta G14 es:
=D3+1-(E3/10000)
Lo que hago es sumar a la cifra de ventas el número de empleados pero "ponderándolo". Al dividir la cifra de empleados por un número lo suficientemente grande lo que conseguimos es que al sumárselo a la cifra de ventas no altere la parte entera de dicho número (por lo que la cifra de ventas será el primer elemento de orden) pero pueda establecer una jerarquía con los decimales. El problema aquí es que queremos que aparezca primero la zona con más ventas PERO con MENOS empleados. Para conseguir esto lo que hacemos es restarle a 1 el resultado del cociente que acabo de explicar, o lo que es lo mismo:
1-(E3/10000). Con esta expresión no alteramos la parte entera de las ventas y conseguimos establecer un orden de menor a mayor con los decimales. Así las cosas, aplicamos ahora la función JERARQUIA: En la celda I3 escribimos la fórmula:
=JERARQUIA(G3;$G$3:$G$14)   y la copiamos hasta la celda I14:
Procedemos ahora a identificar cada una de estas cifras con la zona en cuestión. Para ello preparamos la siguiente salida de datos:
Nos situamos en la celda C18 y escribimos:
=INDICE($C$3:$C$14;COINCIDIR($B18;$I$3:$I$14;0))   y copiamos hasta C29:
En D18 escribimos:
=BUSCARV($C18;$C$3:$E$14;2;FALSO)   y copiamos hasta D29.
En E18 escribimos:
=BUSCARV($C18;$C$3:$E$14;3;FALSO)   y copiamos hasta E29:
Problema resuelto!

martes, 21 de julio de 2015

Máximo de un Alfanumérico

"Tengo un listado en el que llevo el seguimiento de varias ordenes. Todas ellas están compuestas por un código único alfanumérico de 7 caracteres. Los tres primeros son siempre el texto GIO y los otros cuatro son números. Necesito hallar el código más alto en función de su número".

Partimos del siguiente ejemplo:

Al tratarse de entradas alfanuméricas (texto y números) excel las considera texto y, en consecuencia, no podemos utilizar directamente la función MAX. Podemos resolver el problema de diferentes maneras. Una muy sencilla es "trocear" las entradas para separar la parte de texto de la de número. Para ello generamos una columna de proceso:
En la celda D6 escribimos la fórmula:
=VALOR(DERECHA(H6;4))   y la copiamos hasta D23.

De esta manera estamos obteniendo los 4 dígitos con la función DERECHA, y convirtiendo dichos dígitos, que hasta aquí excel trata como texto, a números con la función VALOR: 
Nos situamos ahora en la celda B3 y escribimos la siguiente fórmula:
Lo que estamos haciendo es CONCATENAR el texto "GIO", con el que comienzan todos los códigos del listado, con el valor MÁXIMO  de los números:
Podemos concluir aplicando Formato Condicional al rango B6:B23 para que destaque el máximo valor, como se muestra en la imagen.

martes, 30 de junio de 2015

Contar Duplicados en Distintas Hojas

"Tengo una lista con registros en la hoja 1 y otras listas en 6 ó 7 hojas más. Me gustaría saber cuántas veces se repiten los registros de la hoja 1 en cada una de las listas de todas las hojas".

Partimos del siguiente ejemplo. En la HOJA 1 tenemos los siguientes datos originales:
Tenemos además, en nuestro ejemplo, tres hojas con listas con registros. Lo que queremos es contar cuántas veces se repite cada uno de los números de la lista original en cada una de las listas de las distintas hojas:
Lo primero que vamos a hacer es dar nombre a las listas de las hojas 2, 3 y 4. Para ello vamos a la hoja 2 y seleccionamos el rango A1:A19 y vamos a la ficha Fórmulas y pulsamos en Crear desde la selección. En la ventana que se nos abre aceptamos con Fila superior marcado:
De esta manera ya tenemos el nombre LISTA1 creado. Hacemos lo mismo con las listas de las hojas 3 y 4. Volvemos a la primera hoja y preparamos la salida de datos:
Nos situamos en la celda D3 y escribimos la siguiente fórmula (que copiaremos hasta F3 y, posteriormente, hasta F20):

=CONTAR.SI(INDIRECTO(D$2);$B3)

De esta manera, estaremos contando cuántas veces se repiten cada uno de los registros del rango B3:B20 en las distintas listas de las otras hojas (la función INDIRECTO tomará el nombre del rango correspondiente de la fila 2):

lunes, 25 de mayo de 2015

Dígitos Duplicados en Distinto Orden


"Tengo un listado de valores de tres dígitos y necesito detectar cuáles están duplicados en el mismo o distinto orden. Por ejemplo 123, 231, 456, 456, 564, etcétera". 

Partimos del siguiente ejemplo:

Preparamos ahora las siguientes tablas para "manipular" los datos iniciales. Aunque el enunciado habla de 3 dígitos, preparamos tablas para contemplar hasta 6 dígitos:
Nos situamos en E3 y escribimos la fórmula(que copiaremos hasta J3 y, finalmente, hasta J17):
=SI.ERROR(VALOR(EXTRAE($B3;E$2;1));"")
De esta manera estamos extrayendo cada dígito y reconvirtiéndolo en VALOR (ya que la función EXTRAE nos lo devuelve como texto):
 Una vez hecho esto, nos situamos en L3 y escribimos la fórmula:
=SI.ERROR(K.ESIMO.MENOR($E3:$J3;L$2);"")
y copiamos hasta Q2 y finalmente hasta Q17:
De esta manera hemos reordenado de menor a mayor los dígitos. Procedemos ahora a unirlos de nuevo con la función CONCATENAR (&). En S3 escribimos:
y copiamos hasta S17:
Ahora ya podemos proceder a contar los números que se repiten en más de una ocasión y "asociarlos" con sus "originales". Nos situamos en la celda C3 y escribimos la fórmula:
=SI(CONTAR.SI($S$3:$S$17;S3)>1;"Repetido";"")    y copiamos hasta C17:

sábado, 23 de mayo de 2015

Obtención Aleatoria de Valores de un Rango Sin Repetición

"En tu artículo Selección Aleatoria de un Valor de un Rango (2) nos explicaste cómo seleccionar 1 valor de manera aleatoria entre los valores existentes en un determinado rango y entre los que se incluyen celdas en blanco. En mi caso, necesito seleccionar 6 valores de dicho rango y que, además, no se repita ninguno de los seleccionados".

Como suelo decir, no problemo! Partimos de la siguiente lista de valores (y utilizaremos 4 columnas de procesos para conseguir nuestro objetivo):
Empezamos por el Paso 1 generando una lista de valores únicos. Para ello nos situamos en la celda C3 y escribimos la fórmula (que copiamos posteriormente hasta la celda C28):
=SI(B3="";"";SI(CONTAR.SI($B$3:B3;B3)>1;"";B3))
De esta manera ya tenemos nuestro listado original "filtrado" con los valores únicos. A continuación, en la celda D3 escribimos un 1 y en la celda D4 un 2. Seleccionamos ambas, y copiamos hasta la celda D28 para generar un número de orden:
Nos situamos ahora en la celda F3 y procedemos con la siguiente fórmula (que copiamos hasta F28):
=K.ESIMO.MAYOR($C$3:$C$28;D3)
De esta manera ya tenemos ordenada la lista de valores únicos de mayor a menor, dejando las celdas en blanco con el mensaje de error #¡NUM! agrupadas al final de dicha lista:
Seleccionamos ahora el rango E3:E28 y escribimos la fórmula: =ALEATORIO()  y acabamos pulsando Ctrl + Enter:
Ya tenemos todos los ingredientes para poder proceder con la "formulita final". Para ello preparamos la zona de salida de datos en la columna I:
Nos situamos en la celda I4 y escribimos:
=BUSCARV(JERARQUIA(E3;$E$3:DESREF($E$2;CONTAR($F$3:$F$28);));$D$3:$F$28;3;FALSO)

CONTAR nos permite saber cuántas celdas contienen un número (y por tanto no son un error tipo #¡NUM!). Con la función JERARQUIA vamos a obtener el puesto relativo que ocupa E3 dentro del rango dinámico de, en nuestro ejemplo, E3:E17 (ya que el resto de valores aleatorios se corresponden con un valor de error tipo #¡NUM!). Una vez obtenido el puesto relativo, por ejemplo si obtenemos el 5, le pedimos que, por medio de la función BUSCARV, busque dentro del rango D3:F28 en la primera columna dicho valor y nos devuelva su correspondencia en la tercera columna, que en nuestro ejemplo se corresponde con el valor 57.
Si copiamos la fórmula de I4 hasta I9 ya tendremos nuestros seis valores aleatorios sin repetición y evitando las celdas en blanco:
Pulsando F9 obtendremos distintas combinaciones aleatorias