'Networkdays2 ' ' start_date: ' end_date: ' holidays: an array or cell range that has holiday dates. ' weekdays: a weekday number or an array of numbers to exclude. ' 0:Sun&Sat, 1:Sun, 2:Mon, 3:Tue, 4:Wed, 5:Thu, 6:Fri, 7:Sat ' ' Return: the number of days between two dates without specific holidays. Function Networkdays2(ByVal start_date As Date, ByVal end_date As Date, _ Optional ByVal holidays As Variant, _ Optional ByVal weekdays As Variant = 0) As Variant Dim nDays As Long, nWeekday As Long, lResult As Long Dim i As Long, n As Long, w(1 To 7) As Boolean Dim iSign As Integer Dim vHolidays As Variant, vDate As Variant, v As Variant Dim dtDate As Date, a() As Date On Error GoTo ErrorHandler If start_date > end_date Then iSign = -1 dtDate = start_date: start_date = end_date: end_date = dtDate End If If IsArray(weekdays) Then For Each v In weekdays w(v) = True Next ElseIf weekdays = 0 Then w(1) = True: w(7) = True Else w(weekdays) = True End If nDays = end_date - start_date + 1 lResult = nDays nWeekday = Weekday(start_date) For i = 1 To 7 If w(i) Then lResult = lResult - _ Int((nDays + (nWeekday + 6 - i) Mod 7) / 7) Next If Not IsMissing(holidays) Then If TypeName(holidays) = "Range" Then Set vHolidays = holidays ElseIf IsArray(holidays) Then vHolidays = holidays Else vHolidays = Array(holidays) End If For Each v In vHolidays vDate = v If IsDate(vDate) Then dtDate = CDate(vDate) For i = 1 To n If a(i) = dtDate Then Exit For Next If i > n Then n = n + 1 ReDim Preserve a(1 To n) a(n) = dtDate If dtDate >= start_date And dtDate <= end_date Then If Not w(Weekday(dtDate)) Then lResult = lResult - 1 End If End If End If End If Next End If If iSign Then lResult = -lResult Networkdays2 = lResult Exit Function ErrorHandler: Networkdays2 = CVar(xlErrValue) Exit Function End Function