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