我在工作表中有许多记录,每个记录都有开始和结束日期。 每行都有一个记录号,有些行的记录号与其他行相同(工作表列出了案例的使用日期和日期。某些案例只有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 干杯,纳特
答案 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
用法示例:
标准模块(不是类,也不在工作表窗格中):