jueves, 13 de enero de 2011

VBA: Cálculo del día de regreso.

Días atrás un lector solicitaba ayuda a través de un comentario en el blog. Deseaba calcular cuál sería el día de reincorporación teniendo en cuenta los días totales de vacaciones (15 días en el ejemplo planteado) y sus días de descanso semanal (martes y miércoles), conociendo el primer día o inicio de sus vacaciones:

...estoy tratando de hacer un programa que calcule los dias de vacaciones de una persona que descansa dos dias en la semana (mar. mier.)sin contar estos y tomara 15 dias de descanso, que me diga el dia que debe presentarse al termino de estos...


Para ello definiremos una función personalizada o UDF que nos permitirá encontrar dicho día de retorno. Esta función la incluiremos dentro del Editor de VBA (al que accedemos presionando Alt+F11), insertando un Módulo.
El código será:

'función que calcula el día de regreso teniendo en cuenta
'los 15 días vacaciones y los dos días de descanso por semana.


Function fechareincorporacion(fechainicio As Date)
Dim dsemana As Date
vacaciones = 15
d = 0
x = 1
Do
dsemana = Application.WorksheetFunction.Weekday(fechainicio + d, 2)
If dsemana = 2 Or dsemana = 3 Then
x = x + 0
Else: x = x + 1
End If
d = d + 1

Loop Until x = 15

If Application.WorksheetFunction.Weekday(fechainicio + d, 2) = 2 Or _
Application.WorksheetFunction.Weekday(fechainicio + d, 2) = 3 Then
fechareincorporacion = fechainicio + d + 2
Else
fechareincorporacion = fechainicio + d
End If

End Function


Veamos la solución en un ejemplo. Queremos calcular qué día deberá regresar un trabajador que comienza sus vacaciones el día 24/12/2010, sabiendo que ni martes ni miércoles trabaja.
Si realizamos un conteo manual tendríamos:

VBA: Cálculo del día de regreso.


Observamos en el conteo manual que sólo cuentan los días de la semana que no sean martes o miércoles, es decir, que al aplicarles la función =DIASEM(fecha;[tipo]), no es ni 2 ni 3; por tanto al ir sumando hasta 15 (total días vacaciones) llegamos a la fecha buscada de reincorporación 13/01/2011.
Si introducimos en alguna celda la nueva función creada
=fechareincorporación(fechainicio)
calculada sobre la fecha dada
=fechareincorporación(24/12/2010)
obtendríamos exactamente aquella fecha (13/01/2011) calculada a mano.

No hay comentarios:

Publicar un comentario en la entrada