如何获得一个月中的第几周 (1:6)

How to get the Week of the month (1:6)

我们可以找到不同的方法来确定一个月中的星期几,尽管 1:4 and/or 1:5 上的页面很多,但 [=21] 周围的页面很少=]方法。

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

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

它在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

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

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 日”将 return 作为第 2 周,而它将默认计为第 1 周。2021 年 11 月 1 日至 3 日为第 1 周,然后 4 日至 10 日为第 2 周。