martes, abril 07, 2015

Calcular fecha de vencimiento en día hábil

Como muchas otras, también esta nota se originó en la consulta de un lector. Éste necesitaba computar fechas de vencimiento pero de manera tal que si la fecha de vencimiento caía en un feriado, la fecha fuera corregida al día hábil anterior (para el día posterior, ver esta nota). En sus propias palabras:

supongamos que la fecha inicial es 1 de abril del 2015, y en 30 días la persona tiene que pagar, esto quiere decir el 1 de mayo de 2015, PERO la fecha de pago no puede caer ni en dias festivos ni en fines de semana. se que existe la formula DIA.LAB.INTL pero no me sirve porque me omite todos los fines de semana o todos los domingos, para esto la fecha de pago tiene que ir antes (en caso de ser festivo o fin de semana); supongamos, si cae en domingo la fecha pasa para el viernes de esa misma semana, no para el lunes
Como se trata de días corridos, el proceso de cálculo tiene que ser el siguiente:
  1. partimos de la fecha inicial y le sumamos 30;
  2. evaluamos el resultado para saber si cae en un fin de semana o día festivo (para los días festivos necesitaremos un rango que los contenga);
  3. si el resultado cae en día hábil, el cálculo queda concluido;
  4. si el resultado cae en feriado, calculamos cuál es el día hábil anterior más cercano.
Este último punto es el más problemático ya que puede darse la situación de dos o más días festivos corridos.

Consideremos este ejemplo:


  • En el rango F4:F8 tenemos la lista de feriados (arbitrarios, a los únicos efectos del ejemplo); 
  • en la celda C4 el período en días corridos al vencimiento; 
  • en la celda C5 la fecha inicial; 
  • en la celda C6 el cálculo de la fecha de vencimiento sin correcciones que calculamos con la trivial fórmula =C5+C4. 
  • Para mayor comodidad he definido un nombre que contiene los días de la semana lo que permite calcular el día de semana de cada fecha, como en la celda D5 con esta fórmula =INDICE(rngSemana,DIASEM(C5,2)).
Como podemos ver el vencimiento cae un sábado, por lo cual debemos corregir al viernes anterior, es decir, un día atrás. Si este fuera siempre el caso nuestra fórmula sería relativamente sencilla: si el día de la semana es sábado, restar un día del resultado; si es domingo, restar dos.

El cálculo se complica si el resultado coincide con un feriado. En este caso debemos encontrar la primer fecha anterior que no es ni feriado ni fin de semana.

Consideremos ahora este caso:


La fecha inicial es el 13/05/2015 y por lo tanto la fecha de vencimiento tendría que ser el 12/06/2015 que es viernes. Pero como podemos ver en la lista de feriados, el viernes 12/06/2015 y también el jueves 11/06/2015 son feriados, por lo que el resultado de nuestro cálculo deberá ser el miércoles 10/06/2015.

La fórmula en la celda C7, donde obtenemos el resultado correcto, es ésta:

=MAX((C5+C4-{7;6;5;4;3;2;1;0})*(ESERROR(COINCIDIR(C5+C4-{7;6;5;4;3;2;1;0},Feriados,0)))*(DIASEM(C5+C4-{7;6;5;4;3;2;1;0},2)<6))

Vamos a explicar esta fórmula paso por paso.

C5+C4 - La fecha inicial más 30 días;

{7;6;5;4;3;2;1;0} - un vector vertical cuyos miembros son números enteros del 0 al 7. Dependiendo de las definiciones del sistema, en lugar del punto y coma (;)  tendremos que usar \ (por ejemplo: {7\6\5\4\3\2\1\0}). También podemos crear el vector vertical usando comas y la función TRANSPONER, por ejemplo: TRANSPONER({7,6,5,4,3,2,1,0}).

C5+C4-{7;6;5;4;3;2;1;0} - esta expresión crea un vector de fechas, en nuestro caso del 05/06/15 al 12/06/15. Podemos visualizarlo usando la auditoría de fórmulas, donde las fechas aparecen con el correspondiente número de serie

(ESERROR(COINCIDIR(C5+C4-{7;6;5;4;3;2;1;0},Feriados,0))) - crea un vector del mismo tamaño con valores VERDADERO si la fecha no se encuentra en la tabla de los feriados (COINCIDIR dá en ese caso el error #N/A) y FALSO si se trata de un feriado.

(DIASEM(C5+C4-{7;6;5;4;3;2;1;0},2)<6) - crea un vector de valores VERDADERO si la fecha cae entre lunes y viernes (incluidos) y FALSO si cae en el fin de semana.

Al multplicar los últimos tres vectores entre si creamos un vector de valor 0 (cuando alguno de los valores es FALSO) o el número de serie de la fecha (cuando los tres valores correspondientes son VERDADERO). Podemos visualizar estas operaciones en esta tabla que muestra en cada fila un elemento de cada vector



Finalmente, la función MAX extrae el valor máximo del producto de los tres vectores (los valores que aparecen en la columna H en la imagen), que es la fecha del primer día hábil anterior a la fecha de vencimiento sin correcciones.

El archivo con el ejemplo puede descargarse aquí

Ver post con una versión mejorada.

miércoles, marzo 25, 2015

Calculando el día del año con Excel

Dada una fecha Excel cuenta con funciones para calcular el día del mes, la semana del año, el mes o el año de la fecha. Por ejemplo si queremos saber en qué semana del año cae la fecha 25 de marzo del 2015, usamos la función NUM.DE.SEMANA

Excel no tiene una función para calcular el día del año de una determinada fecha (un valor entre 1 y 365 o 366, si el año es bisiesto). Por ejemplo le 25/03/2015 es el día número 84 del año.
Para calcular el número de día del año de una fecha podemos usar esta fórmula:

=B3-FECHA(AÑO(B3),1,0)
Para calcular cuántos días faltan hasta el fin del año, modificamos la fórmula de esta manera:

=FECHA(AÑO(B3),12,31)-B3

viernes, marzo 20, 2015

Resolver sistemas de ecuaciones lineales con Excel

Estábamos tomando un café a la mañana cuando Eduardo (si, el compañero de trabajo que siempre me viene a consultar sobre temas de Excel) me pregunta:

- Che, ¿te acordás algo del tema de sistemas de ecuaciones lineales?
- No mucho, ¿por qué?
- Porque mi hijo está estudiando el tema en el colegio y cada tanto me pide ayuda; y ¿qué querés que te diga?, no me acuerdo nada.
- Bueno, fijate en la Internet, seguro que hay cantidades industriales de sitios que tratan el tema como Wikipedia.
- Si, ya me fijé. Pero no tengo paciencia para ponerme a aprender todo de nuevo. Todo lo que necesito es ayudarlo a resolver las ecuaciones.
- Ah! bueno...Podés usar Excel para resolver sistemas de ecuaciones lineales.
- ¿Usar Excel para resolver sistemas de ecuaciones lineales? ¿Cómo?
- Te explico

Hay tres métodos para resolver sistemas de ecuaciones lineales:

  • algebraicos
  • gráficos
  • matriciales
Con Excel podemos resolver sistemas de ecuaciones lineales usando el método matricial. Para ésto Excel nos ofrece dos funciones MMULT que nos permite multiplicar matrices y MINVERSA que calcula la inversa de una matriz.
Para resover de sistemas de ecuaciones lineales con el método matricial se pueden emplean dos procedimientos: el de la matriz inversa y el método de eliminación gaussiana. En esta nota vamos a mostrar como hacerlo con el método de la matriz inversa (sin detenernos en la consideraciones teóricas que dejamos libradas a la iniciativa del lector).

Supongamos que tenemos este sistema de ecuaciones lineales


5x+1y+8z=46
4x-2y=12
6x+7y+4z=50

Queremos encontrar los valores de las incógnitas "x", "y" y "z". El primer paso es crear en Excel una matriz con los valores de los coeficientes de las ecuaciones (el rango B2:D4) y una con los términos independientes (el rango F2:F4)


Para encontrar la solución del sistema, si existe, calculamos primero la inversa de la matriz B2:D4 y luego multiplicamos ésta por la matriz F2:F4.
Para obtener la matriz inversa usamos la función MINVERSA. Esta función, como otras funciones matriciales, dan resultados en un rango de celdas por lo que debemos primero seleccionar el rango donde obtendremos los resultados y luego introducir la función apretando simultáneamente las teclas Ctrl-Mayúsculas-Enter



El siguiente paso es multiplicar la matriz inversa (el rango B7:D9 en nuestro ejemplo) por la matriz F2:F4. Para realizar la multiplicacion de matrices usamos la función MMULT. Recordemos que para multiplicar dos matrices debe cumplirse la condición que el número de columnas de la primer matriz debe ser  igual al número de filas de la segunda. La dimensión de la matriz resultante es el número de filas de la primera (3) por el número de columnas de la segunda (1). Es decir, antes de introducir la función MMULT debemos seleccionar un rango de tres filas por una columna e introducir la función con Ctrl-Mayúsculas-Enter



Los valores de la matriz F7:F9 son las soluciones del sistema de ecuaciones,  x = 4; y = 2; z = 3.

Podemos solucionar el sistema en un único paso anidando la función MINVERSA dentro de la fórmula con MMULT