Excel:给定一周中的工作日数

时间:2018-07-24 04:37:36

标签: excel vba excel-vba

我的数据

    A               B       C
1   Created Date    Week    No. of WorkDays
2   6/20/2018 11:36 06-w4   5
3   6/26/2018 12:56 06-w5   5
4   7/6/2018 23:01  07-w1   5
5   6/18/2018 18:11 06-w4   5
6   6/15/2018 12:01 06-w3   5
7   6/1/2018 13:31  06-w1   1
8   6/8/2018 12:17  06-w2   5
9   6/1/2018 13:32  06-w1   1
10  7/30/2018 13:32 07-w5   2

我有一个Week函数,它说明问题是在第1周还是第2周中创建的。但是根据我的计算,我需要考虑那一周的工作日,我该如何做。我正在计算编号。现在手动设置该周的工作日数。

例如:6月第1周:工作日数是1,因为6月1日是星期五,而6月2日是星期六。同样,对于7月第5周,它是2天,因为7月29日是星期日,7月30日和31日是工作日。

我当前的“周”公式为

=CONCATENATE(TEXT(A1,"MM"),"-w",WEEKNUM(A1,1)-WEEKNUM(DATE(YEAR(A1),MONTH(A1),1),1)+1) 

我正在尝试使用工作日功能,但是它没有提供我想要的结果。

请帮助我。

3 个答案:

答案 0 :(得分:2)

如果A列中的日期始终是工作日,则可以使用以下方法: 如果该日期也可以是周末,则需要前一周的工作日。如果您想参加下周的工作日,则还必须多花些时间。

=MIN(5,IF(MONTH(A2-WEEKDAY(A2,3))<MONTH(A2),7-WEEKDAY(DATE(YEAR(A2),MONTH(A2),1),1),IF(MONTH(A2+5-WEEKDAY(A2,2))>MONTH(A2),WEEKDAY(DATE(YEAR(A2),MONTH(A2)+1,0),2),5)))
  • 第一分钟:最多5个工作日
  • 第一个IF():检查A2中日期之前或当天的星期一是否在上个月
  • 如果是这样:则以7减去月份的第一个工作日(星期日为1)
  • 如果不是这样:第二个IF:检查本周的星期五是否在下个月
  • 如果是这样:以本月最后一个工作日(星期一为1)
  • 如果不是这样:在月中的星期几,返回5

这当然不考虑公众假期,仅考虑周末。

答案 1 :(得分:0)

尝试包含#个或工作日(例如,星期五为1个工作日),

=NETWORKDAYS.INTL(A2, A2+5-WEEKDAY(A2,2), 1)

NETWORKDAYS.INTL允许创建一个可选的假期列表。

答案 2 :(得分:0)

编写自己的VBA公式-结果如下

    A               B       C               D
1   Created Date    Week    No. of WorkDays No. of Days - Formula
2   6/20/2018 11:36 06-w4   5               5
3   3/2/2018 12:56  03-w1   2               2
4   7/6/2018 23:01  07-w1   5               5
5   6/18/2018 18:11 06-w4   5               5
6   6/15/2018 12:01 06-w3   5               5
7   6/1/2018 13:31  06-w1   1               1
8   6/8/2018 12:17  06-w2   5               5
9   6/1/2018 13:32  06-w1   1               1
10  7/30/2018 13:32 07-w5   2               2

公式

=CalculateWorkdaysInWeek(A2)

VBA代码

Function CalculateWorkdaysInWeek(WeekRange As Range) As Variant
    'Assume Week 2, 3 & 4 will always have 5 days
    Dim WeekNo As Double
    'Check if Week is 1 or 5
    WeekNo = (Application.WorksheetFunction.WeekNum(WeekRange, 1) - _
    Application.WorksheetFunction.WeekNum(DateSerial(Year(WeekRange), Month(WeekRange), 1))) + 1

    Dim NoOfWeekDays As Integer
    If WeekNo = 1 Then
        FirstWeekDay = 7 - Weekday(DateSerial(Year(WeekRange), Month(WeekRange), 1), vbSunday)
        If FirstWeekDay > 5 Then
            FirstWeekDay = 5
        End If
        NoOfWeekDays = FirstWeekDay
    ElseIf WeekNo = 5 Then
        'Check the last day of the month as Monday as Start
        LastWeekDay = Weekday(DateSerial(Year(WeekRange), Month(WeekRange) + 1, 0), vbMonday)
        If LastWeekDay > 5 Then
            LastWeekDay = 5
        End If
        NoOfWeekDays = LastWeekDay
    Else ' Week 2,3 & 4 Return 5
        NoOfWeekDays = 5
    End If

    CalculateWorkdaysInWeek = NoOfWeekDays
End Function