【发布时间】:2019-11-18 06:36:04
【问题描述】:
问题
以下 [mcve] 将输出两个日期之间的周数数组。它适用于两个日期在同一年,但是,有些年份有 52 周,并在去年的最后几天开始。而其他人则有 53 周。
52 周的示例是2020 calendar:
第一周从 12 月 30 日开始。
53周的例子是2016 calendar:
仅从 1 月 4 日开始。
代码
以下代码被注释并输出带有周数的数组。
Sub w_test()
Dim Arr() As Variant, ArrDateW() As Variant
'Initial Date
DateI = DateSerial(2015, 5, 5)
'Final Date
DateF = DateSerial(2017, 9, 20)
'Difference in weeks between DateI and DateF
weekDif = DateDiff("ww", DateI, DateF) + k - 1
i = Weekday(DateI)
d = DateI
'If not Sunday, go back to last week, to start the loop
If i <> 1 Then
d = DateAdd("d", -(i - 1), d)
End If
ReDim ArrDateW(weekDif)
ReDim Arr(2)
'Loop on all weeks between two dates to populate array of arrays
For i = 0 To weekDif
'Date
Arr(0) = d
'Trying to solve problem with New Year
If Application.WorksheetFunction.WeekNum(d) = 53 Then
flag = True
End If
If flag = False Then
Arr(1) = Application.WorksheetFunction.WeekNum(d)
Else
Arr(1) = Application.WorksheetFunction.WeekNum(DateSerial(Year(d) + 1, 1, 1))
flag = False
End If
'Year
Arr(2) = Year(d)
'Populate array of arrays
ArrDateW(i) = Arr
'Next Week Number
d = DateAdd("ww", 1, d)
Next i
'To stop with Ctrl+F8
Debug.Print d
End Sub
问题
2015 年有 53 周,但程序输出如下:
而2016 and 2017之间,输出一团糟:
如何修复程序以正确输出这些周数?
【问题讨论】:
-
如果年份是 2015,您是否尝试过使用 arrDateW(33)(2) = 53 的条件初始化?可以用这个变量来完成吗?
-
我想让它充满活力,每年都在工作,就像在 2020 年一样。我已经坚持了几天......而且无法正确思考,所以我问了一个问题接收反馈或答案。
-
按照我的看法,您可以 a) 按年自动化,使条件语言初始化该变量 - 即按年更改循环中变量的值或 b) 使用其他逻辑而不是“一年中的几个星期”。
-
不管怎么说,365[.25] 天永远不会很好地分成 7 天一组。一个多世纪以前,零售商通过将一年分成 4 个季度,每个季度 13 周(分别为每月 3-4-3 周)解决了这个问题,并且每隔几年增加一个第 53 周;这样,每周的销售额总是与去年同期比较。第 53 周只是与第 1 周相比;考虑使用一个“日历”表来保存每个日期的元数据(DayOfWeek、WeekOfYear、WeekOfMonth、MonthOfYear、MonthOfQuarter 等) - 然后您就可以对任何内容进行时间聚合和比较。
标签: excel vba calendar week-number