OK, here's my first attempt at it
I used a User Defined Function called TAT()
Look at the attachment worksheet 'test' and see
Option Explicit
'1) our office work 24 hour's with some TAT off time window.
'2) our TAT stop on Friday 5:30 pm and start again on Sunday 10:30 PM.
'3) any ticket which come after 17:30 on Friday will start TAT on 22:30 Sunday.
'4) For all day's our TAT stop from 6:30 AM to 7:30 AM and 16:30 to 21:30 for which all
' TAT is not counted between these window
'also any request which arrive between off time will start TAT ON time window.
Const t0000 As Long = 0
Const t0630 As Long = 390
Const t0730 As Long = 450
Const t1630 As Long = 990
Const t1730 As Long = 1050
Const t2130 As Long = 1290
Const t2230 As Long = 1350
Const t2400 As Long = 1440
Function TAT(S As Date, E As Date) As Double
Dim dateStart As Date, timeStart As Date, dateEnd As Date, timeEnd As Date ' start/end dates times
Dim dowStart As VbDayOfWeek, dowEnd As VbDayOfWeek
Dim i As Long, cnt As Long
Dim cumTAT As Double
dateStart = Int(S)
timeStart = S - dateStart
dowStart = Weekday(dateStart)
dateEnd = Int(E)
timeEnd = E - dateEnd
dowEnd = Weekday(dateEnd)
'3) any ticket which come after 17:30 on Friday will start TAT on 22:30 Sunday.
If (dowStart = vbFriday) And (timeStart >= TimeSerial(17, 30, 0)) Then
timeStart = TimeSerial(22, 30, 0)
dateStart = DateSerial(Year(dateStart), Month(dateStart), Day(dateStart) + 2) + timeStart ' add 2 to get Sunday
dowStart = Weekday(dateStart)
ElseIf (dowStart = vbSaturday) Then
timeStart = TimeSerial(22, 30, 0)
dateStart = DateSerial(Year(dateStart), Month(dateStart), Day(dateStart) + 1) + timeStart ' add 1 to get Sunday
dowStart = Weekday(dateStart)
ElseIf (dowStart = vbSunday) And (TimeSerial(22, 30, 0)) Then
timeStart = TimeSerial(22, 30, 0)
dateStart = DateSerial(Year(dateStart), Month(dateStart), Day(dateStart) ) + timeStart ' already synday
dowStart = Weekday(dateStart)
End If
'same day
If dateStart = dateEnd Then
TAT = OneDay(S, E)
Exit Function
End If
cumTAT = 0#
'partial first day
cumTAT = OneDay(S, 0) ' 0 = special flag for 24:00:00 of same day
'partial last day
cumTAT = cumTAT + OneDay(0, E)
'inside days
cnt = 1
For i = dateStart + 1 To dateEnd - 1
cumTAT = cumTAT + OneDay(DateSerial(Year(S), Month(S), Day(S) + cnt), 0)
cnt = cnt + 1
Next i
TAT = cumTAT
End Function
'4) For all day's our TAT stop from 6:30 AM to 7:30 AM and 16:30 to 21:30 for which all
' TAT is not counted between these window
'
'Zone 1 = 0000 <= 0630
'Zone 2 = 0630 <= 0730
'Zone 3 = 0730 <= 1630
'Zone 4 = 1630 <= 2130
'Zone 5 = 2130 <= 0000
Function OneDay(S As Date, E As Date) As Double
Dim minStart As Long, minEnd As Long
Dim cumOneDay As Double
If S = 0 Then
minStart = 0
Else
minStart = Round(24 * 60 * (S - Int(S)), 0)
End If
If E = 0 Then
minEnd = t2400
Else
minEnd = Round(24 * 60 * (E - Int(E)), 0)
End If
'if S in Zone 2 or Zone 4 then move to end of zone
'S in Zone 2
If t0630 < minStart And minStart <= t0730 Then
minStart = t0730
'S in Zone 4
ElseIf t1630 < minStart And minStart <= t2130 Then
minStart = t2130
End If
'if E in Zone 2 or Zone 4 then move to Start of zone
'E in Zone 2
If t0630 < minEnd And minEnd <= t0730 Then
minEnd = t0630
'E in Zone 4
ElseIf t1630 < minEnd And minEnd <= t2130 Then
minEnd = t1630
End If
'S in Zone 1
If minStart <= t0630 Then
'Zone 1
If minEnd <= t0630 Then
cumOneDay = minEnd - minStart
'Zone 3
ElseIf t0730 <= minEnd And minEnd <= t1630 Then
cumOneDay = minEnd - minStart - 60
'Zone 5
ElseIf t2130 <= minEnd And minEnd <= t2400 Then
cumOneDay = minEnd - minStart - 60 - 300
End If
'S in Zone 3
ElseIf t0730 <= minStart And minStart <= t1630 Then
'Zone 3
If t0730 <= minEnd And minEnd <= t1630 Then
cumOneDay = minEnd - minStart
'Zone 5
ElseIf t2130 <= minEnd And minEnd <= t2400 Then
cumOneDay = minEnd - minStart - 300
End If
'S in Zone 5
ElseIf t2130 <= minStart And minStart <= t2400 Then
cumOneDay = minEnd - minStart
End If
OneDay = cumOneDay
End Function