▲用WorkDays函數(shù)計(jì)算兩個日期值之間的工作日數(shù) Function WorkDays(start_date As Date, end_date As Date, holidays As Range, nonholidays As Range) Dim cur_date As Date, date1 As Date, date2 As Date, day_count As Integer, day As Variant date1 = IIf(start_date <= end_date, start_date, end_date) date2 = IIf(start_date <= end_date, end_date, start_date)
cur_date = date1 day_count = 0 Do While cur_date <= date2 If Weekday(cur_date, 2) >= 1 And Weekday(cur_date, 2) <= 5 Then day_count = day_count + 1 End If cur_date = cur_date + 1 Loop For Each day In holidays If day >= date1 And day <= date2 Then If Weekday(day, 2) >= 1 And Weekday(day, 2) <= 5 Then day_count = day_count - 1 End If End If Next For Each day In nonholidays If day >= date1 And day <= date2 Then If Weekday(day, 2) = 6 Or Weekday(day, 2) = 7 Then day_count = day_count + 1 End If End If Next WorkDays = IIf(start_date <= end_date, day_count, -day_count) End Function
說明:在以上代碼中,首先計(jì)算開始日期start_date和終止日期end_date之間非周末的天數(shù),然后通過檢查holidays減去非周末的節(jié)假日天數(shù),再通過檢查nonholidays加上作為工作日的周末的天數(shù),最后即可得到兩個日期相隔的工作日數(shù)。值得注意的是,如果日期start_date大于end_date,結(jié)果將為負(fù)值。
▲用NextWorkDay函數(shù)計(jì)算相隔指定工作日數(shù)之前或之后的日期
Function NextWorkDay(start_date As Date, days As Integer, holidays As Range, nonholidays As Range) Dim cur_date As Date, day_count As Integer, flag As Boolean, day As Variant cur_date = start_date day_count = 0 Do While day_count < Abs(days) cur_date = cur_date + Sgn(days) Select Case Weekday(cur_date, 2) Case 1 To 5 flag = True For Each day In holidays If day = cur_date Then flag = False Next If flag Then day_count = day_count + 1 Case 6, 7 flag = True For Each day In nonholidays If day = cur_date Then flag = False Next If Not flag Then day_count = day_count + 1 End Select Loop NextWorkDay = cur_date
End Function
說明:在以上代碼中,通過日期逐次遞增或遞減的方法檢查所得日期是否為工作日,如果是非周末則檢查holidays,如果是周末則檢查nonholidays,直至累計(jì)到指定的天數(shù)為止。
應(yīng)用舉例 根據(jù)2006年春節(jié)的放假規(guī)定,1月29日-2月4日(農(nóng)歷大年初一至初七)放假,共7天。其中,29日、30日、31日為法定假日,將1月28日(星期六)、29日(星期日)、2月5日(星期日)三個公休日調(diào)至2月1日(星期三)、2日(星期四)、3日(星期五),2月4日(星期六)照常公休,1月28日、2月5日上班。因此在本例中,首先把2006年春節(jié)期間非周末的節(jié)假日存入到區(qū)域A2:A6中。由于1月29日、2月4日本來就是周末,所以該區(qū)域只需存放1月30日、31日、2月1日、2日和3日。接著再把作為工作日的周末存入到區(qū)域B2:B3中,該區(qū)域有1月28日和2月5日兩天。然后據(jù)此在F2單元格中輸入公式“=WorkDays(D2,E2,A2:A6,B2:B3)”,計(jì)算2006年1月6日至2006年3月1日之間的工作日數(shù);并在F6單元格中輸入公式“=NextWorkDay(D6,E6,A2:A6,B2:B3)”,以2006年1月6日為起始日期計(jì)算30個工作日后的日期。結(jié)果如下圖所示。

輸入起止日期工作日立即自動算出
|