Задача
Следующий [mcve] выведет массив массивов номеров недель между двумя датами. Это работает, когда обе даты находятся в одном и том же году, однако некоторые годы имеют 52 недели и начинаются в последние дни прошлого года. А у других есть 53 недели.
Примером 52 недель является календарь 2020 :
Где первая неделя начинается 30 декабря.
А примером 53 недель является календарь 2016 :
Это начинается только 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 по 2017 выводится беспорядок:
Как исправить программу для правильного вывода номеров недели?