Rellenar un campo con fecha anterior que no sea fin de semana ni feriado

Tengo un informe que me trae fechas en blanco que tengo que completar. El campo se llama "fecha resolución". Lo tengo que completar cuando está vacío con la fecha del día hábil anterior a "hoy", o sea, teniendo en cuenta que no sea fin de semana ni feriado. Como me habían explicado por acá me quedó así la query Siinm(diasemana(fecha())=2;fecha()-3;fecha()-1) que me funciona perfecto para los fines de semana, pero no para los feriados... No sé si esto se podría arreglar desde la consulta.

Entonces escribí

Dim rs As Recordset

Dim vFecha As Date

Dim var As Integer

Set db = CurrentDb

Set rs = db.OpenRecordset("Select FECHARESOLUCIONCPI from realizado")

Set rsx = db.OpenRecordset("feriados")

rs.MoveFirst

Do While Not rs.EOF

var = 0

vFecha = Date()

k = 0

Do While FECHARESOLUCIONCPI Is Null

rsx.MoveFirst

If Weekday(vFecha, 0) <> 6 And Weekday(vFecha, 0) <> 7 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!FECHARESOLUCIONCPI = var - k

rs.Update

rs.MoveNext

Loop

End Function

Obviamente no funciona, si me pueden ayudar

Respuesta
1

He tenido problemas similares en mis macros, yo también andaba jugando con la función weekday() para evitar los fines de semana pero hay una función para calcular esto: workday(), miratela creo te servirá para tu problema, aunque si quieres evitar los feriados tendrás que indicarle a la función los días feriados(en una lista de fechas).

1 respuesta más de otro experto

Respuesta
2

Se podría añadir a tu expresión la validación del feriado, usando DCont() o DLookup() para ver si el día anterior es feriado o no, pero quedaría un tanto farragosa.

Es preferible crear una función en VBA y usarla para obtener el día hábil anterior. Así a lo rápido, podrías hacer ésta (que pegarás en un módulo independiente):

'---------------------------------------------------------------------------------------
' Procedimiento: fncDiaHabilAnterior
' Autor        : Sveinbjorn El Rojo
' Fecha        : 20/11/2019
' Propósito    : Devuelve el día hábil anterior a una fecha pasada como parámetro,
'                sin contar fines de semana ni festivos
'---------------------------------------------------------------------------------------
Public Function fncDiaHabilAnterior(lafecha As Date) As Date
    Dim fTemp As Date
    'Calculamos el día anterior
    fTemp = lafecha - 1
    'Comprobamos de que no sea fin de semana o festivo
    Do Until fncEsHabil(fTemp) = True
        fTemp = fTemp - 1
    Loop
    'Devolvemos el resultado
    fncDiaHabilAnterior = fTemp
End Function
'---------------------------------------------------------------------------------------
' Procedimiento: fncEsHabil
' Autor        : Sveinbjorn El Rojo
' Fecha        : 20/11/2019
' Propósito    : Dice si un día es hábil o no (sábado, domingo o festivo)
'                Para los festivos requiere una tabla "Feriados" con un campo "Feriado"
'                en el que se incluyen los festivos
'---------------------------------------------------------------------------------------
Private Function fncEsHabil(lafecha As Date) As Boolean
    fncEsHabil = True
    'Si laFecha es sábado o domingo, no es hábil
    If Weekday(lafecha) = vbSaturday Or Weekday(lafecha) = vbSunday Then
        fncEsHabil = False
    Else 'si no es sábado ni domingo, hay que ver si es festivo
        If DCount("*", "Feriados", "feriado=#" & lafecha & "#") > 0 Then fncEsHabil = False
    End If
End Function

Y usarla de esta forma:

en una consulta:  fncDiaHabilAnterior(Fecha())

En un cuadro de texto: = fncDiaHabilAnterior(Fecha())

en código VBA: Me.txt...= fncDiaHabilAnterior(Date)

Un saludo.


bit.ly/ForoNkSv

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas