计算没有假期和周末的工作日数

时间:2018-11-20 20:04:46

标签: ms-access access-vba ms-access-2007

如何计算两个日期之间的工作天数,而不计算周六,周日和节假日。

我有一个包含以下字段的表格: enter image description here

我有下表,我想要的是在称为expr1的列中计算工作日的差额。

在Visual Basic中输入代码,并在模块中调用工作日

enter image description here

用每列的名称替换变量。

Function WorkingDays(ByVal FECHA_DE_VALIDACION_FA As Date, ByVal FECHA_IMPRESIÓN As Date) As Long
    While FECHA_DE_VALIDACION_FA <= FECHA_IMPRESIÓN
        Select Case True
            Case Weekday(FECHA_DE_VALIDACION_FA, vbMonday) > 5
            Case DCount("*", "Holidays", "Holiday = #" & Format(fromDate, "mm/dd/yyyy") & "#") > 0
            Case Else: WorkingDays = WorkingDays + 1
        End Select
        FECHA_DE_VALIDACION_FA = FECHA_DE_VALIDACION_FA + 1
    Wend
End Function

然后他们告诉我,在使用生成器的查询中,调用了Workdays函数,但没有得到结果。

enter image description here enter image description here

我接受并运行查询,但出现错误。

1 个答案:

答案 0 :(得分:0)

正如Tony在评论中所建议的那样,您首先需要构建一个包含假期日期的表,因为这些日期可能会逐年变化。

然后,最简单的方法可能不是递增使用DateDiff之类的功能,而是递增地计算两个日期之间的天数,如果日期是星期六或星期日或成员,则不增加计数器假期表中的数据,例如:

Function WorkingDays(ByVal fromDate As Date, ByVal toDate As Date) As Long
    While fromDate <= toDate
        Select Case True
            Case Weekday(fromDate, vbMonday) > 5
            Case DCount("*", "Holidays", "Holiday = #" & Format(fromDate, "mm/dd/yyyy") & "#") > 0
            Case Else: WorkingDays = WorkingDays + 1
        End Select
        fromDate = fromDate + 1
    Wend
End Function

以上假设您有一个名为Holidays的表,其中包含一个名为Holiday的字段,其中要排除所有假期。

上面的函数计算包括两个提供的日期在内的工作日数。

例如,假设您的Holidays表包含以下日期:

Holidays

然后该函数将返回以下内容:

?WorkingDays(#2018-12-24#, #2019-01-04#)
 7 

要使用该代码,请打开VBA IDE( Alt + F11 ),插入新的模块( Alt I M ),然后将代码粘贴到模块中并保存该模块。

然后,您可以在表达式生成器可用的任何地方调用该函数。