Function GetBusinessDay(FromDate As Date, Offset As Long, Optional WorkDays As String = "23456", _
Optional ZeroOffsetBehavior As Long = 1, Optional HolidayTblName As String = "", _
Optional HolidayDateField As String = "")
Dim DaysCounter As Long
Dim TestDate As Date
Dim Holidays As String
Dim rs As DAO.Recordset
FromDate = DateValue(FromDate)
If HolidayTblName <> "" Then
If Left(HolidayTblName, 1) <> "[" Then HolidayTblName = "[" & HolidayTblName & "]"
If Left(HolidayDateField, 1) <> "[" Then HolidayDateField = "[" & HolidayDateField & "]"
Set rs = CurrentDb.OpenRecordset("SELECT " & HolidayDateField & " FROM " & HolidayTblName)
Do Until rs.EOF
Holidays = Holidays & Format(rs.Fields(0).Value, "|yyyy-mm-dd|")
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End If
Select Case Offset
Case 0
If InStr(1, WorkDays, Weekday(FromDate)) > 0 And _
InStr(1, Holidays, Format(FromDate, "|yyyy-mm-dd|")) = 0 Then
GetBusinessDay = FromDate
ElseIf ZeroOffsetBehavior = 0 Then
GetBusinessDay = FromDate
ElseIf ZeroOffsetBehavior < 0 Then
TestDate = FromDate
Do Until InStr(1, WorkDays, Weekday(TestDate)) > 0 And _
InStr(1, Holidays, Format(TestDate, "|yyyy-mm-dd|")) = 0
TestDate = DateAdd("d", -1, TestDate)
Loop
GetBusinessDay = TestDate
Else
TestDate = FromDate
Do Until InStr(1, WorkDays, Weekday(TestDate)) > 0 And _
InStr(1, Holidays, Format(TestDate, "|yyyy-mm-dd|")) = 0
TestDate = DateAdd("d", 1, TestDate)
Loop
GetBusinessDay = TestDate
End If
Case Is > 0
TestDate = FromDate
Do Until DaysCounter = Offset
TestDate = DateAdd("d", 1, TestDate)
If InStr(1, WorkDays, Weekday(TestDate)) > 0 And _
InStr(1, Holidays, Format(TestDate, "|yyyy-mm-dd|")) = 0 Then
DaysCounter = DaysCounter + 1
End If
Loop
GetBusinessDay = TestDate
Case Else
TestDate = FromDate
Do Until DaysCounter = Offset
TestDate = DateAdd("d", -1, TestDate)
If InStr(1, WorkDays, Weekday(TestDate)) > 0 And _
InStr(1, Holidays, Format(TestDate, "|yyyy-mm-dd|")) = 0 Then
DaysCounter = DaysCounter - 1
End If
Loop
GetBusinessDay = TestDate
End Select
End Function