Macro para calcular días laborables en OpenOffice Calc
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 )