在计算中不包括周末

时间:2018-10-29 15:36:21

标签: sql vba date ms-access weekday

我已经能够在Google上搜索一些可以从计算中删除周末和假期的代码,我更关心删除周末。

下面的代码运行完美,我认为您可以使用WorkdayDiff(),但是由于它基于DateAdd(),因此我认为它会更加复杂。

基本上,我有一个可以改变长度的表,并且它可以为我计算到期日,同样,如果可以的话,我希望它也能排除周末和节假日。我非常感谢您的帮助!

主要目标:如果在这些日期中包含星期六和/或星期日,则另外减去1或2天。

Private Sub Command2_Click()
    DoCmd.SetWarnings False
    DoCmd.OpenQuery "Delete_A", acViewNormal, acEdit
    DoCmd.OpenQuery "Append_A", acViewNormal, acEdit
    DoCmd.OpenQuery "Append_Date", acViewNormal, acEdit

    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    Dim dat As Date
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("select * from Table1 order by ID desc")
    With rst
        If Not .EOF Then
            .MoveFirst
            Do Until .EOF
                If Not IsNull(!Due_date) Then
                    dat = !Due_date
                Else
                    dat = DateAdd("d", -!Duration, dat)
                    .Edit
                    !Due_date = dat
                    .Update
                End If
                .MoveNext
            Loop
        End If
        .Close
    End With
    Set rst = Nothing
    Set dbs = Nothing


    DoCmd.OpenQuery "Delete_A_Exp", acViewNormal, acEdit
    DoCmd.OpenQuery "Append_A_Exp", acViewNormal, acEdit
    'DoCmd.RunMacro "A4_Export"
End Sub

1 个答案:

答案 0 :(得分:0)

您可以使用以下功能替换DateAdd,以从日期中添加或减去一定数量的工作日。

Public Function WorkdayAdd(AmountOfDays As Long, InputDate As Date) As Date
    Dim increment As Long
    If AmountOfDays < 0 Then
        Increment = -1
    Else
        Increment = 1
    End If
    Do Until AmountOfDays = 0
         InputDate = InputDate + Increment
         If WeekDay(InputDate) <> vbSunday And WeekDay(InputDate)<> vbSaturday Then
             'Implement check if InputDate is a holiday here
              'If Not IsHoliday(InputDate) Then
                   AmountOfDays = AmountOfDays - Increment
              'End If
         End If
    Loop
    WorkdayAdd = InputDate
End Function

IsHoliday函数可以很简单,如下所示(假设有一个名为HolidayTable的表,其中包含HolidayDate列,其中充满了假日)。

Public Function IsHoliday(inputDate As Date) As Boolean
    TempVars!HolidayDate = Int(InputDate) 'No time part
    IsHoliday = DCount("HolidayDate", "HolidayTable", "HolidayDate = TempVars!HolidayDate") <> 0
    TempVars.Remove "HolidayDate"
End Function