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