Como sacar los fines de semana y los días feriado de la macro ?

¿Cómo arreglo esta macro para sacar los días feriados y fines de semana?

Les paso el código que escribí para sacar la diferencia entre dos fechas sin contar feriados ni fines de semana, pero no me funciona porque pareciera que los fines de semana si me los está contando

Function DiferenciaFechas()
Dim db As Database
Dim rs As Recordset
Dim vFecha As Date
Dim var As Integer
Set db = CurrentDb
Set rs = db.OpenRecordset("Select Fecha1, Fecha2, Dias from Tabla1 where Dias=0 or Dias is null")
Set rsx = db.OpenRecordset("feriados")
rs.MoveFirst
Do While Not rs.EOF
var = 0
vFecha = rs!Fecha1
k = 0
Do While vFecha < rs!Fecha2
rsx.MoveFirst
If Weekday(vFecha, 0) <> 6 And Weekday(vFecha, 0) <> 7 Then
'If IsNull(DLookup("[Feriado]", "[Feriados]", "[Feriado]=cDate('" & vFecha & "')")) = True Then
Do While Not rsx.EOF
If Day(vFecha) = Day(rsx!feriado) And Month(rsx!feriado) = Month(vFecha) Then
k = k + 1
End If
rsx.MoveNext
Loop
var = var + 1
End If

vFecha = vFecha + 1
Loop
rs.Edit
rs!Dias = var - k
rs.Update
rs.MoveNext
Loop
End Function

Les agradecería si me pueden ayudar para corregir lo que está mal.

2 Respuestas

Respuesta
2

Lo puedes hacer de mil maneras diferentes. Si tengo la tabla de Festivos, que es más sencillo que escribir tantas funciones.

Y tengo un formulario donde escribo la fecha inicial y la fecha final. Este es un ejemplo que hice ese año, y como la instrucción es la misma ¿para qué cambiar las fechas? Lo importante es ver la mecánica.

Dejo que muestre los sábados, domingos y festivo, aunque no haría falta, pero queda bonito... Puedes ver que el cursor está en Fecha Fin. Cuando pulso Enter

Y el código es simple

Private Sub FechaFin_AfterUpdate()
Dim i As Byte, c As Byte
i = FechaFin - FechaIni
For c = 1 To i
If Format(FechaIni + c, "dddd") = "domingo" Then
Domingos = Nz([Domingos], 0) + 1
ElseIf Format(FechaIni + c, "dddd") = "sábado" Then
Sabados = Nz([Sabados], 0) + 1
ElseIf DCount("*", "festivos", "fecha=FechaIni+" & c & "") = 1 Then
Festivos = Nz([Festivos], 0) + 1
End If
Next
Lectivos = i - Nz([Domingos]) - Nz([Sabados]) - Nz([Festivos])
Total = Lectivos & " " & "días laborables, " & Nz([Sabados], 0) & " sábado(s)," & Nz([Domingos]) & " domingo(s) y " & Nz([Festivos], 0) & " día(s) festivo(s)"
End Sub

Pero como te decía, hay mil formas de hacerlo. Todo depende de lo que quieras que muestre.

Respuesta
1

Esto requiere de más código, elaboré las funciones para calcular días laborales en Colombia donde algunos festivos son trasladables al día lunes de la semana siguiente. Las funciones no requieren tablas de festivos y permiten pasar como parámetro si el día sábado se considera laboral. Este formulario es un ejemplo de uso.

Con estas funciones puede actualizar una tabla que contenga la fecha inicial y fecha final, algo como:

En este ejemplo se realizó la actualización del campo dias, pero realmente esta columna sobra porque se puede hacer con la función y una consulta de selección

Ejemplo llamada de la función desde la cuadricula de diseño de consulta para actualizar el campo dias.

Las funciones se diseñaron para Colombia pero se pueden adaptar fácilmente a otro país. No las expongo acá porque son al rededor de 20. La ventaja radica en que no necesita crear tabla de festivos y sirven también para Excel, Word, reemplaza la función DIA.LAB() de Excel. Si le interesa puede solicitarlas a [email protected] indicando el país de origen y anotando en la asunto el nombre de la consulta.

Hay cosas simples que nos llevan a cometer errores, nunca utilizo Format(fecha,"dddd") para obtener el nombre del día y hacer cálculos con fechas, debido a que las funciones deben servir para otros idiomas, inglés, francés, alemán etc., en donde obtengo el nombre del día diferente. Es mejor obtener el número del día de la semana, algo como:

Supongamos que lafecha="19/03/2021" tipo cadena

FOR x=1 TO ndias

IF weekday(cdate(lafecha)+x)=1 OR weekday(cdate(lafecha)+x)=7 THEN

   finsemana=finsemana+1  'Es decir sábado o domingo

END IF

NEXT x

Ahora supongamos lafecha es de tipo fecha

FOR x=1 TO ndias

IF weekday(lafecha+x)=1 OR weekday(lafecha+x)=7 THEN

   finsemana=finsemana+1  'Es decir sábado o domingo

END IF

NEXT x

Por ejemplo weekday(date+1)   da como resultado 1, es decir lunes, en donde date=21/03/2021 domingo.

¿Por qué no utilizo tablas o array para los festivos?

Porque tendría que estar cambiando las fechas cada año debido a los festivos trasladables y esto se presta para errores y porque deben servir para Access, Excel, Word y Visual Basic .NET. Las funciones me permitieron elaborar el calendario de Colombia y 23 países más hasta el año 2200 sin tener que cambiar nada cada período, excepto que un país por acuerdo de ley adicione o modifique un festivo se editaría el código.

Ejemplos uso de las funciones en agenda calendario en VB.

Si quiere el código con un ejemplo en Access y el manual puede solicitarlo a [email protected] 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas