martes, 7 de abril de 2015

Días por meses

Archivo de Excel utilizado: dias_por_meses.xlsm
Dada una fecha inicial y una fecha final vamos a calcular cuantos días hay en cada mes de entre los meses de ese intervalo. Por ejemplo, entre el 20-enero-2016 y el 5-abril-2016 el resultado sería el siguiente:
  • para enero-2016: 12 días
  • para febrero-2016: 29 días ya que es bisiesto
  • para marzo-2016: 31 días
  • para abril-2016: 5 días
En este cálculo se incluyen los dos extremos, esto es, se incluye el día inicial y el día final. El número de días totales es de 77 que se obtienen en Excel restando el día final memos el día inicial y sumando 1. Se ha de sumar 1 ya que hemos decidido incluir los dos extremos.




Esto se puede calcular con fórmulas de Excel, lo cual hacemos en la Hoja2 de archivo proporcionado, pero también hemos querido crear una función personalizada, una macro, que calcule esto.

La función es la siguiente 

=dias_del_mes(fecha inicial;fecha final;mes)

Tiene tres argumentos, los dos primeros son obvios, y en el tercero se ha de indicar una fecha correspondiente al mes que queremos analizar. Da igual la fecha que usemos, lo importante es el mes. Así, por ejemplo, si deseamos calcular los días correspondientes al mes de enero-2016 pondremos cualquier fecha válida de ese mes, tanto da poner el día 1, el 31 o cualquier otro de enero de 2016.

La macro es la siguiente.


Function dias_del_mes(fechaInicio, fechaFin, fechaMes)
Dim inicioMes As Date
Dim finMes As Date
finMes = Application.WorksheetFunction.EoMonth(fechaMes, 0)
'veamos una forma curiosa de calcular el inicio de mes correspondiente a fecha_mes
inicioMes = Application.WorksheetFunction.EoMonth(finMes - 45, 0) + 1
If fechaInicio >= inicioMes And fechaInicio <= finMes Then
  If Year(fechaInicio) = Year(fechaFin) And Month(fechaInicio) = Month(fechaFin) Then
    dias_del_mes = fechaFin - fechaInicio + 1
  Else
    dias_del_mes = finMes - fechaInicio + 1
  End If
ElseIf fechaInicio < inicioMes And fechaFin > finMes Then
  dias_del_mes = finMes - inicioMes + 1
ElseIf fechaFin >= inicioMes And fechaFin <= finMes Then
  dias_del_mes = fechaFin - inicioMes + 1
Else
  dias_del_mes = 0
End If
End Function

5 comentarios:

  1. Hola. Tengo un un problema para resolver en excel una función de fecha. el problema es el siguiente: en B3 me aparece un mes: enero o febrero uno cual quiera de los doce y en B4 quiero que me devuelva los dias que tiene ese mes, ejemplo: si es enero en B3 que devuelva en B4 31, si es febrero en B3 que devuelva en B4 28 y si es bisiesto 29, si es marzo en B3 que devuelva en B4 31 etc...
    Muchas Gracias

    ResponderEliminar
    Respuestas
    1. Hola Antonio.
      En la celda B3 pon un día cualquiera de febrero de 2016. Por ejemplo: 05/02/2016
      Luego, debes proporcionar a esa celda un formato de celda personalizado que nos permita ver el mes y el año, por ejemplo, el siguiente: mmmm-aaaa
      En la celda C3 escribe la siguiente fórmula: =FIN.MES(B3;0)
      Y debes proporcionar a la celda C3 un formato de celda que nos permita ver los días que corresponden a la fecha resultante, por ejemplo, pon el siguiente formato de celda personalizado: dd
      Y con esto en la celda C3 verás el número 29 que corresponde a los días del mes de febrero de 2016, ya que es una año bisiesto.
      Un saludo.

      Eliminar
  2. Hola Adolfo, muchas gracias por los aportes, pero he encontrado un error al adaptar la formula en un cuadro que necesito para verificar las fechas de incapacidades de una nomina, en la hoja dos del libro que compratio, cuando coloco dos fechas, una inicial y una final del mismo mes, no da el resultado correcto, Creo que hay que restarle los dias del mes.

    ResponderEliminar
    Respuestas
    1. Hola YEP.
      Tenías toda la razón, existía un error en la macro. Ahora ya está solucionado. Por favor, comprueba que está correcto.
      Gracias por avisar.

      Eliminar
    2. Hola Adolfo, bueno al parecer es bastante dificil,. yo ensaye con formulas de bastantes formas y no lo pude hacer, adapte tus formulas y tampoco, Ahora reviso nuevamente y no me da. Cuando la fecha inicial y la fecha final son en mese diferentes lo hace correctamente, pero si las fechas son en el mismo mes... la respuesta es errada. Jajajaja... Me doy por vencido... por ahora.

      Eliminar