Buscar próximo menor condicionado

3 envíos / 0 nuevos
Último envío
CDO602
Imagen de CDO602
Offline
última acción: Hace 5 años 4 meses
alta: 18/11/2018 - 21:02
Puntos: 35
Buscar próximo menor condicionado

¡Buenas tardes a todos!

Estoy haciendo una tabla para llevar un control de los insumos consumidos y el rendimiento de los mismos en las sucursales de la empresa. La idea es que el archivo esté en la red para que cada tienda pueda cargar el contenido por si mismo por lo que la tabla tendría los siguientes datos: Columna A: Fecha; Col. B: sucursal; Col. C: Equipo impresor; Col. D: Insumo y Col. E: Contador. El contador, es el número de impresiones que dice la impresora lleva realizadas al momento. En la Col. F necesitaría que busque el contador PRÓXIMO anterior (menor) pero que se cumplan las condiciones que las Columnas B, C y D sean iguales. Así en la columna G se restaría el contador actual al anterior y sabríamos la duración del insumo. Tiene que buscar el próximo anterior y NO el menor, ya que del mismo insumo, con el paso del tiempo, se van a reemplazar varias unidades y siempre debe compararse con el último cambiado.

Desde ya, ¡muchas gracias a todos!

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 3 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Lo que pides es un poquito

Lo que pides es un poquito complicado, pero se puede hacer sin necesidad de malabares con macros y eso. Aun así, necesitamos una fórmula matricial.

Lo que yo haría es utilizar esta fórmula en la columna F:

{=SI(CONTAR.SI.CONJUNTO($B$2:$B$34;B2;$C$2:$C$34;C2;$E$2:$E$34;"<"&E2)=0;"-";MAX(($B$2:$B$34=B2)*($C$2:$C$34=C2)*($E$2:$E$34<E2)*($E$2:$E$34)))}

 

Ten en cuenta que esto hay que introducirlo de la siguiente manera:

-Escribe la fórmula sin las llaves { y }
-Mientras aún estás editando, pulsa las teclas Control + Mayús + Entrar (Control + Shift + Enter)
-Arrastra la fórmula a todas las filas.

Ahora te explico un poco qué hace esta fórmula. Como ves, es un SI. Hay tres partes: la condición, lo que hace si se cumple, y lo que hace si no se cumple. Esto es porque cuando tienes el primer valor de cada serie (el primer valor de sucursal+equipo), no hay ningún valor anterior, por lo que no debe calcular nada. En este caso pongo un "-".

¿Cómo sabemos que es el primer valor? Pues con CONTAR.SI.CONJUNTO. Esta función cuenta las celdas en las que se dan las condiciones que le pongas. En nuestro caso hemos puesto tres condiciones:

Que los datos de la columna B sean iguales que los de la celda B de nuestra fila

Que los datos de la columna C sean iguales que los de la celda C de nuestra fila

Que los valores de la columna E sean menores que los de la celda E de nuestra fila

Si se dan estos tres casos es porque son líneas con la misma sucursal, el mismo equipo y un contador menor. La condición es que si esta fórmula da como resultado 0 es porque la línea en la que estamos es la primera para esa combinación de sucursal y equipo. Por lo tanto, si se cumple esto, en la celda se escribe un guión.

 

En el caso de que no se cumpla, entramos con la segunda parte de la fórmula, que es para lo que necesitamos que sea fórmula matricial (por eso la introdujiste con Ctrl+Mays+Enter).

Si te fijas, hay una función MAX, y muchas cosas dentro. MAX elige el valor máximo de los valores que haya dentro. En nuestro caso tenemos 4 paréntesis.

En el primero tenemos $B$2:$B$34=B2. Esto es en la fila 2. En la fila 15 será =B15. Esto lo que hace es que te devuelve una lista de valores VERDADERO o FALSO, según cada celda de $B$2:$B$34 sea igual al valor de B2 o no.

Si te fijas, lo mismo ocurre con el siguiente paréntesis, pero para la columna C. Y para la columna E es lo mismo, pero en vez de igualar, compara que sea menor.

El resultado serán tres listas de valores VERDADERO o FALSO, según el caso. Como estamos comparando de la B2 a la B34, nos salen 33 valores en cada paréntesis. Finalmente, se multiplica por un último paréntesis que simplemente es el valor de los datos en la columna E, sin igualdades ni nada.

Los valores de cada lista se multiplican cada uno con el correspondiente de las demás listas. Y aquí entra el por qué de los VERDADERO/FALSO. Cuando multiplicas, VERDADERO actúa como un 1 y FALSO actúa como un 0.

Si en cada fila las tres primeras comparaciones son verdaderas, devuelve el valor de la columna E. Si alguna no coincide, devuelve 0. Como una de las comparaciones solo es verdadera cuando el valor de E es menor que el de la fila donde ponemos la fórmula, entonces si obtenemos el MAX de todos estos valores, será el máximo que sea menor que el contador actual, que era lo que queríamos.

 

Sé que es complicado. Prueba, y si lo prefieres, prepara un ejemplo y súbelo para que quede un poco más claro.

 

Un saludo

CDO602
Imagen de CDO602
Offline
última acción: Hace 5 años 4 meses
alta: 18/11/2018 - 21:02
Puntos: 35
¡Eres un genio! Lo logré

¡Eres un genio! Lo logré utilizando tu fórmula, pero realizándole la siguiente corrección: al final de cada rango el segundo indicador le saqué le signo "$" para que no quede fijo y el valor ubicado fue el mismo de la columna que debe buscar (así busca desde esa columna para abajo) ya que de la otra manera me traía valores de otras celdas posteriores. Así quedó la fórmula:

=SI(CONTAR.SI.CONJUNTO($B$2:B2;B2;$C$2:C2;C2;$D$2:D2;D2;$E$2:E2;"<"&E2)=0;"-";MAX(($B$2:B2=B2)*($C$2:C2=C2)*($D$2:D2=D2)*($E$2:$E2<E2)*($E$2:E2)))

Adjunto el archivo con la fórmula aplicada.

Muchas gracias por la respuesta y por la explicación.

¡Saludos!

 

AdjuntoTamaño
File control_de_insumos.xlsx10.27 KB