Macro para calcular días laborables en OpenOffice Calc

Calcular días laborables

Varios usuarios han preguntado en distintos foros el modo de calcular los días laborables de un rango de celdas que contienen fechas. No es sencillo, pues en cada país, región e incluso ciudad son distintos los días festivos, y a veces, se consideran festivos los sábados y a veces no.

Calc incorpora la función DÍAS.LAB que permite calcular cuantos días laborables existen entre dos fechas, teniendo en cuenta una lista de días festivos que se indica en un rango de celdas, pero que tiene varios inconvenientes:

  • La lista de días a calcular deben de ser días seguidos; no pueden haber saltos. Si en nuestra lista tenemos los días 1,2,3,4,5,11,12,14,20, no funcionará, pues DÍAS.LAB no calculará cuántos de esos 9 días son laborables, sino cuántos desde el día 1 al día 20 son laborables.
  • La lista de días a calcular debe estar ordenada. Si en nuestra lista tenemos los días 1,2,4,5,6,7,3 no funcionará, pues DÍAS.LAB calculará los días laborables entre en día 1 y el 3, no entre el 1 y el 7.
  • DÍAS.LAB considera los sábados y domingos como festivos siempre.

Se pueden utilizar fórmulas que calculen los días laborales de un rango de fechas, pero siempre va a ser muy complicado dar con la fórmula correcta, sino imposible.

Pero con una macro puede ser muy sencillo. La siguiente macro permite calcular los días laborables de un rango de celdas, con saltos entre sus fechas, e incluso aunque no estén ordenadas. Permite definir si los sábados se consideran festivos, y permite indicar un rango de celdas que contengan las fechas que son festivos.

Function DiasLaborables( RangoDias, RangoFestivos, _
Optional SabadosSonFestivos As Boolean) As Long
    Dim Festivos As Long, Dias As Long, x, y
   
    If IsMissing(SabadosSonFestivos) Then SabadosSonFestivos = False
   
    For Each x In RangoDias
        Dias = Dias+1
        If Weekday (x)=1 Then
            Festivos=Festivos+1
        ElseIf SabadosSonFestivos AND Weekday(x)=7 Then
            Festivos=Festivos+1
        Else
            For Each y In RangoFestivos
                If x=y Then
                    Festivos = Festivos+1
                    Exit For
                EndIf
            Next
        EndIf
    Next

    DiasLaborables = Dias - Festivos
   
End Function

Suponiendo que dispongamos de un rango de celdas con fechas, por ejemplo, B3:B75, que los festivos estén declarados en el rango de celdas X3:X30, y que los sábados no sean considerados festivos, podemos insertar en una celda la siguiente fórmula:

=DiasLaborables( B3:B75; X3:X30 )

Si los sábados deben ser considerados festivos, podemos insertar en una celda la siguiente fórmula:

=DiasLaborables( B3:B75; X3:X30; VERDADERO )

 

No hay reacciones, todavía


Form is loading...