计算一年中涵盖/发生日期范围的几周

时间:2018-07-07 08:58:29

标签: excel date formula week-number

我在工作表中有许多记录,每个记录都有开始和结束日期。 每行都有一个记录号,有些行的记录号与其他行相同(工作表列出了案例的使用日期和日期。某些案例只有1行,而其他案例将有几行)

每种情况的日期都不会重叠,但是每个范围之间可能会有差距

例如:

案例#-开始日期-结束日期
案例1-01/01/2018-05/01/2018
案例1-06/01/2018-13/01/2018
案例1-17/03/2018-20/03/2018
案例2-14/02/2018-15/02/2018
案例3-19/05/2018-25/05/2018
案例3-26/05/2018-28/05/2018

我需要知道这些日期范围涵盖了几周。因此,对于案例1,将是4周(第二行的开始日期仍与第一行在同一周内,因此无需对星期数进行两次计数,第三行实际上发生在2个不同的星期内,因此将计为2周)

我可以获取日期的星期数(使用ISOWEEKNUM),但是我需要一个公式,该公式可以查看该案例的所有行号,并且不包括星期数。如果我使用案例1的最早日期,然后使用最晚日期,则周数将为12 ...

如果有人可以帮助我,我将非常感激,我一直无法在搜索中找到任何东西

TIA 干杯,纳特

1 个答案:

答案 0 :(得分:0)

编写用户定义的函数并在工作表中使用它?下面的UDF有四个参数:

arg1 范围 caseNumber:这是包含要获取周数的案例编号的范围。它必须是一个单元格。

arg2 范围 rng:这是不包括要计数的标头的数据范围。

arg3 startDateColumn:所选范围中包含开始日期的列号。不是工作表中的列号。

arg4 endDateColumn:所选范围内的列号,包含结束日期。不是工作表中的列号。

代码进入VBE项目的标准模块中。


Public Function GetWeekCount(ByVal caseNumber As Range, ByVal rng As Range, ByVal startDateColumn As Long, ByVal endDateColumn As Long) As Variant
    Dim arr(), i As Long, j As Long, dict As Object
    If caseNumber.Count <> 1 Then GetWeekCount = CVErr(xlErrValue)
    Set dict = CreateObject("Scripting.Dictionary")
    arr = rng.Value
    For i = LBound(arr, 1) To UBound(arr, 1)
        If arr(i, 1) = caseNumber Then
            For j = CLng(DateValue(arr(i, startDateColumn))) To CLng(DateValue(arr(i, endDateColumn)))
                dict(Application.WorksheetFunction.IsoWeekNum(j)) = 1
            Next j
        End If
    Next i
    If dict.Count > 0 Then
        GetWeekCount = Application.WorksheetFunction.Sum(dict.items)
    Else
        GetWeekCount = 0
    End If
End Function

用法示例:

usage


标准模块(不是类,也不在工作表窗格中):

Standard module