【问题标题】:How to get the Week of the month (1:6)如何获得当月的一周 (1:6)
【发布时间】:2022-01-08 06:26:53
【问题描述】:

我们可以找到不同的方法来确定一个月的星期几,尽管 1:4 和/或 1:5 的页面很多,但 1:6 左右的方法却很少。

因此,为了给您一些背景信息,我正在使用 Excel 中的数据透视表,它从 Power Query 源获取其值。 在 Power Query 中,有一个函数 Date.WeekOfMonth 接受日期并返回 1 到 6 之间的数字。 在这个定义中,周从星期日开始,到星期六结束。 因此,例如,2021 年 10 月的前两天 - 即周五和周六在 10 月的第一周,而 2021 年 10 月的第 3 天从第二周开始,然后是 2021 年 10 月的最后一天,即10 月 31 日,是第 6 周中唯一的一天。

我手头有一个自动化任务,我需要从 Power Query 生成的数据透视表中提取数据,因此我必须在 VBA 中实现一段代码,它计算周数相同。 不幸的是,我找不到任何准备好的 sn-p,所以在实施后我认为它可能值得分享。 (任何 cmets 和建议表示赞赏)

【问题讨论】:

    标签: excel vba date powerquery week-number


    【解决方案1】:

    DatePart 函数非常适合这一点。使用DatePart 并将间隔设置为“周”,您可以找到给定日期的周。然后减去该月第一天之前的周数(将第一天设置为周 = 1)。

    Function WeekNumOfDate(D As Date) As Integer
        WeekNumOfDate = DatePart("ww", D) - DatePart("ww", DateSerial(Year(D), Month(D), 1)) + 1
    End Function
    

    这是能够设置FirstDayOfWeek 参数的函数的第二个版本:

    Function WeekNumOfDate(D As Date, Optional FirstDayOfWeek As VbDayOfWeek = vbSunday) As Integer
        WeekNumOfDate = DatePart("ww", D, FirstDayOfWeek) - DatePart("ww", DateSerial(Year(D), Month(D), 1), FirstDayOfWeek) + 1
    End Function
    

    作为使用FirstDayOfWeek 的示例:将FirstDayOfWeek 设置为vbThursday,日期“2021 年 11 月 5 日”将返回为第 2 周,而默认情况下将计为第 1 周。11 月 1 日至2021 年 3 月 3 日为第 1 周,然后 4 日至 10 日为第 2 周。

    【讨论】:

    • 不错。您能否通过添加第二个可选参数(例如Optional ByVal FirstDayOfWeek As VbDayOfWeek = vbSunday)将其扩展到一周的其他第一天?
    • 这很好,非常感谢。但是,在使用datePart 时会出现警告here。 “某些日历年的最后一个星期一可以返回为第 53 周,而它应该是第 1 周。”
    • @VBasic2008 是的,好建议,我已经添加了具有该功能的函数的第二个版本。
    • 干得好。非常感谢。
    【解决方案2】:

    它在VBA中的实现是:

    Function WeekOfMonth(My_Date As Date)
       
    If Day(My_Date) > Day(My_Date - 1) And Weekday(My_Date) > Weekday(My_Date - 1) Then
            
        WeekOfMonth = WeekOfMonth(My_Date - 1)
        
    ElseIf Day(My_Date) > Day(My_Date - 1) And Weekday(My_Date) < Weekday(My_Date - 1) Then
            WeekOfMonth = WeekOfMonth(My_Date - 1) + 1
    
    Else
        WeekOfMonth = 1
        
    End If
    End Function
    

    注意,虽然上面的函数是递归的,但它的时间和空间复杂度是N阶的表达式,这里不能超过31。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      相关资源
      最近更新 更多