【问题标题】:counting how many weeks of the year date ranges cover/occur in计算一年中日期范围覆盖/发生的周数
【发布时间】:2018-07-07 08:58:29
【问题描述】:

我在工作表中有许多记录,每条记录都有开始和结束日期。 每行都有一个记录号,有些行的记录号与其他行相同(该表列出了使用该案例的案例和日期。有些案例只有 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 干杯,纳特

【问题讨论】:

    标签: excel date formula week-number


    【解决方案1】:

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

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

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

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

    arg4 Long 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
    

    使用示例:


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

    【讨论】:

    • 好的,我正在尝试让它工作,但不断收到#NAME?在数据表中,“案例编号”在 C 列中,日期在 K:L 列中。我想让函数结果出现在另一个工作表中(每个“案例编号”都有一行编译数据
    • 您是否将代码放入标准模块中?您可以在不同的工作表中使用它,只要第二个参数的范围包括工作表名称,例如=GetWeekCount(F1,Sheet3!A1:C6)
    • 我已经去了VBA项目,并选择了插入>模块,并将代码放在那里...在工作表中显示结果,我按照你说的做了,并放了范围.. .我假设输入的范围应该从案例编号到数据表中的第二个日期列...?
    • 发生了什么?
    • 目前我拥有的行数是 739,但会不断添加。但是,尽管我解释得不好,你还是帮了我 :) 我为 rng 值创建了一个动态命名范围,并将其输入为 rng 参考,这很有效。非常感谢您的帮助 QHarr! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多