Contar dias habiles

Hola Cesar, buenas tardes. Leí una respuesta que diste acerca de una función "Días laborables con sábados".
Quiero usarla para calcular los periodos vacacionales de mis trabajadores.
Tengo una inquietud. ¿Si la fecha final cae en domingo (día de descanso que no cuenta como día de vacaciones)? Cuando el ultimo día cae en festivo le suma un día: Bien.
Pero ¿qué instrucción le agrego cuando la fecha final es domingo y le agregue otro día?
Por ejemplo: Tengo 6 días hábiles de vacaciones.
Día inicial: 3 febrero
Día festivo: 5 febrero
Día de descanso (domingo): 9 febrero
La fecha final es: 10 febrero, por lo tanto, sus días de vacaciones son 3, 4, 5, 6, 7, 8 y 10 febrero = 6 días
Gracias por tu orientación y Saludos
[email protected]

1 Respuesta

Respuesta
1
Como vas.
Pues creo que funciona bien para el caso que tu das, en el caso de que el 5 no sea festivo el trabajador entraría a trabajar el 10 y en el caso de que el 5 si fuera festivo entraría el 11.
Lo que tu preguntas es válido y un poco complicado de explicar (lo de agregar días una y otra vez) es por eso que en mi respuesta anterior en la parte de abajo adicioné un procedimiento que valida que la respuesta final no sea domingo ni festivo (Al final de este mensaje vuelvo a pegar la función y el procedimiento un poco mejorados y con comentarios) y este procedimiento se corre tantas veces como sea necesario para que no pase esto... a ver si me explico, supongamos que hacemos un cálculo cuyo día final nos cae un Viernes que es festivo y que el Sábado también es festivo. En este caso la función de la parte de arriba diría que el día de la respuesta es el Viernes festivo pero antes de arrojar la solución se valida la respuesta con el procedimiento, entonces primero se pasa al Sábado y el procedimiento se vuelve a llamar a si mismo (esto se llama recursividad) pero como el Sábado también es festivo la respuesta pasa a ser el Domingo... y otra vez... como el domingo es día de descanso entonces la respuesta pasa a ser el Lunes y así hasta que la respuesta sea un día hábil.
Function DiaLab_conSabados(inicial As Date, dias As Integer, festivos As Range) As Date
'Función elaborada por Cesar Mera
'Version 2.0 18/02/2003
Dim final As Date
If festivos.Columns.Count > 1 Then 'Si el rango de fechas de festivos es mayor a
'una columna se arroja el valor de 0
DiaLab_conSabados = final
Exit Function
End If
If WeekDay(inicial) = 1 Then inicial = inicial + 1 'Valida que el primer día no sea Domingo
final = inicial + DateDiff("d", inicial, inicial + dias) 'Calcula la fecha final en dias comunes
dia = inicial
Do While dia <= final 'Este loop cuenta cuantos domingos hay en el numero de dias comunes
'y le aumenta ese numero de días a la fecha final
If WeekDay(dia) = 1 Then final = final + 1
dia = dia + 1
Loop
If WeekDay(final) = 1 Then final = final + 1 'Valida que la fecha final no sea un Domingo
'de ser asi aumenta un día a la fecha final
For Each Row In festivos.Rows 'Cuenta el numero de festivos entre la fecha
If IsDate(Row) Then 'inicial y final y agrega esos días a la fecha final
If inicial <= Row And final >= Row Then
final = final + 1
If WeekDay(final) = 1 Then final = final + 1
End If
End If
Next Row
Call valida(final, festivos) 'Valida que la respuesta no sea ni un Domingo ni un festivo
'aumenta fechas hasta que la respuesta sea día hábil
DiaLab_conSabados = final
End Function
Sub valida(final As Date, festivos As Range)
Dim Esfestivo As Boolean
For Each Row In festivos.Rows
If IsDate(Row) And Row = final Then
Esfestivo = True
End If
Next Row
If WeekDay(final) = 1 Or Esfestivo Then 'Si la respuesta es Domingo o festivo
final = final + 1 'aumenta un día a la respuesta
Call valida(final, festivos) 'y vuelve a hacer la verificación
End If
End Sub
Pruébala dándole diferentes escenarios a ver si te sirve, sino me cuentas y miramos a ver como la arreglamos, si te sirve te agradezco finalices la pregunta de acuerdo a la calidad y oportunidad de la respuesta.
La voy a probar en un ratillo. Si tengo dudas te aviso.
Estoy sorprendido por tu rapidez en atenderme...
Yo soy experto en Recursos Humanos. Lo que se te ofrezca mi buen Cesarin... estoy a tus ordenes.
Hola Cesar.
La función me da el día en que debe regresar a trabajar.
Ahora necesito el ultimo día de vacaciones del trabajador.
Lo solucione así:
En A1 esta la fecha inicial.
En A2 estan los dias que estara de vacaciones.
En Z1:z10, esta el rango de los dias festivos.
En A3 esta la funcion que me da la fecha en que se presenta a trabajar.
En A4 puse: +DIASEM(A3,1).
En A5 puse: +si(a4=2,2,1) (Si regresa el lunes, el ultimo dia seria sabado)
En A6 puse: A3-A5, que es el ultimo dia de vacaciones del trabajador...
¿Qué opinas?
Veo que le has trabajado bastante al tema, tu solución funciona perfecta excepto en los eventos en que el día Sábado sea un Festivo cuando el cálculo arrojó que debía regresar el Lunes... (eso es un caso muy extraño pero puede ocurrir).
Tomé el mismo código y le adicioné una variable que se llama regreso (el día que tu necesitas)... al final de todo el cuento anterior regreso equivale a un día menos del calculado anteriormente y luego llama otro procedimiento que en vez de correr días hacia adelante lo hace hacia atrás, es como desandar lo andado pero intenté de otras maneras y se me complicó el asunto.
Pruébalas y me cuentas o me calificas la respuesta de acuerdo a la calidad y oportunidad de la misma.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas