如何获得一个月中的第几周 (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 周。
我们可以找到不同的方法来确定一个月中的星期几,尽管 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 周。