Исключить выходные в расчете - PullRequest
0 голосов
/ 29 октября 2018

Мне удалось прогнать некоторый код, который удалит выходные и праздничные дни из расчетов, я больше беспокоюсь об удалении выходных.

Приведенный ниже код работает отлично, я думаю, что вы можете использовать WorkdayDiff (), но, поскольку он основан на DateAdd (), я думаю, что он будет более сложным.

По сути, у меня есть таблица, которая изменяется по длине, и у меня она рассчитывает сроки исполнения, опять же, я надеюсь, что она также исключит выходные и праздничные дни, если это будет достаточно просто. Я действительно ценю помощь!

Основная цель: отнимите дополнительный 1 или два дня, если в эти даты включены суббота и / или воскресенье.

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 голосов
/ 29 октября 2018

Вы можете использовать следующую функцию для замены 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
...