日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

用Excel自定義函數(shù)計(jì)算工作日2

 luodream 2009-03-01
用Excel自定義函數(shù)計(jì)算工作日
文章來源:PCM    作者:其他   2006-10-20

 

▲用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é)果如下圖所示。

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多