Как конвертировать календарную неделю в дату в Excel?

У меня есть номер недели и год, и я хотел бы рассчитать дату понедельника для этой недели в Microsoft Excel.

Year   Week   Date (Monday)
2012   1      January 2, 2012
2013   16     April 15, 2013
2014   42     October 13, 2014

Какую формулу я могу использовать для преобразования календарной недели в определенную дату?

Ответы

Ответ 1

Для номеров недели ISO вы можете использовать эту формулу для получения понедельника

=DATE(A2,1,-2)-WEEKDAY(DATE(A2,1,3))+B2*7

предполагаемый год в A2 и номер недели в B2

это то же самое, что и мой ответ здесь fooobar.com/questions/347565/...

Ответ 2

Следующая формула подходит для каждого года. Вам больше не нужно его настраивать. Предварительным условием является то, что понедельник - ваш первый день недели.

If A2 = Year and Week = B2
=IF(ISOWEEKNUM(DATE($A$2;1;1)-WEEKDAY(DATE($A$2;1;1);2)+1)>1;DATE($A$2;1;1)-WEEKDAY(DATE($A$2;1;1);2)+1+B2*7;DATE($A$2;1;1)-WEEKDAY(DATE($A$2;1;1);2)-6+B2*7)

Ответ 3

Если вы ищете противоположное, чтобы получить дату из номера недели, я нашел решение онлайн и немного изменил его:

Function fnDateFromWeek(iYear As Integer, iWeek As Integer, iWeekDday As Integer)
  ' get the date from a certain day in a certain week in a certain year
  fnDateFromWeek = DateSerial(iYear, 1, (iWeek * 7) _
          + iWeekDday - Weekday(DateSerial(iYear, 1, 1)) + 1)
End Function

Я взял formular из asapu-utilities.com/ и изменил

DateSerial(iYear, 1, ((iWeek - 1) * 7) 

to

DateSerial(iYear, 1, (iWeek * 7)

Update

Похоже, что, по крайней мере, для германии формуляр работает не так, как ожидалось для високосного года 2016, поэтому я изменил его на

Function fnDateFromWeek(iYear As Integer, iWeek As Integer, iWeekDday As Integer)
' get the date from a certain day in a certain week in a certain year

    If iYear = 2016 Then
        curDate = DateSerial(iYear, 1, ((iWeek) * 7) _
          + iWeekDday - Weekday(DateSerial(iYear, 1, 1)) + 1)
    Else
        curDate = DateSerial(iYear, 1, ((iWeek - 1) * 7) _
          + iWeekDday - Weekday(DateSerial(iYear, 1, 1)) + 1)
    End If
    fnDateFromWeek = curDate
End Function

Это может быть неправильным, но мой ограниченный тест дал ожидаемые результаты:

Sub TestExample()
      Debug.Print Format(fnDateFromWeek(2014, 48, 2), "ddd dd mmm yyyy") ' mo 24 Nov 2014
      Debug.Print Format(fnDateFromWeek(2015, 11, 6), "ddd dd-mmm-yyyy") ' fr 13 Mar 2015
      Debug.Print Format(fnDateFromWeek(2016, 36, 2), "ddd dd-mmm-yyyy") ' Mo 05 Sep 2015
End Sub

Ответ 4

Если номер недели находится в A1 и году в A2, вы можете попробовать:

A1*7+DATE(A2,1,1)

Ответ 5

Простое решение состоит в том, чтобы сделать эту формулу:

A1*7+DATE(A2,1,1)

Если он возвращает среду, просто измените формулу на:

(A1*7+DATE(A2,1,1))-2

Это будет работать только для дат в течение одного календарного года.

Ответ 6

Если A1 имеет номер недели и год как целое число 3 или 4 цифры в формате wwYY, тогда формула будет:

=INT(A1/100)*7+DATE(MOD([A1,100),1,1)-WEEKDAY(DATE(MOD(A1,100),1,1))-5

вычитание дня недели гарантирует, что вы вернете последовательный день начала недели. Используйте конечное вычитание для настройки начального дня.

Ответ 7

= (MOD (R [-1] C-1100) * 7 + ДАТА (INT (R [-1] C/100 + 2000), 1,1) -2)

yyww как данная неделя exp: неделя 51 год 2014 будет 1451

Ответ 8

Если ваш номер недели находится в A1 и год находится в A2, следующий фрагмент может дать вам даты полной недели

=$A$1*7+DATE($B$1,1,-4) through =$A$1*7+DATE($B$1,1,2)

Конечно, заполните серию от -4 до 2, и у вас будут даты, начинающиеся с воскресенья по субботу.

Надеюсь, что это поможет.