Проблема
Следующий [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 на выходе получается беспорядок: