2017-02-16 3 views
5

У меня есть неделя номер в ячейке C13 и год в сотовом C14.vba конвертировать недельный номер (и год) на сегодняшний день?

Я использую следующую формулу для преобразовать это в четверг даты этой недели номер в:

=DATE(C14,1,-6)-WEEKDAY(DATE(C14,1,3))+C13*7 

Как я мог бы сделать то же самое с помощью VBA?

+0

Если 'C13 = 1' и' C14 = 2017' (первую неделю 2017 года), ваша формула возвращает '29 дек 2016'. Это то, что вы хотите? –

+0

Поскольку это не было стабильным в отношении того, в каком году вы его используете, я внедрил его с надлежащей рабочей функцией! ;) – R3uK

ответ

3

Для конкретного года, вы можете сделать это следующим образом:

DateAdd("ww", WeekNumber - 1, DateSerial(2017, 1, 5)) 

И проверить:

Debug.Print Format(DateAdd("ww", WeekNumber - 1, DateSerial(YearNumber, 1, 5)), "ddd d MMM yy") 

Если другие ищут в этом и Дон» t хочет четверг или не работает в 2017 году:

  1. изменить 5 в соответствии с вашими потребностями!

  2. Или используйте ниже функции GetDayFromWeekNumber

код, чтобы проверить его:

Sub test() 
    Debug.Print Format(GetDayFromWeekNumber(2017, 1, 4), "ddd d MMM yyyy") 
End Sub 

И общая функция GetDayFromWeekNumber:

Public Function GetDayFromWeekNumber(InYear As Integer, _ 
       WeekNumber As Integer, _ 
       Optional DayInWeek1Monday7Sunday As Integer = 1) As Date 
    Dim i As Integer: i = 1 
    If DayInWeek1Monday7Sunday < 1 Or DayInWeek1Monday7Sunday > 7 Then 
     MsgBox "Please input between 1 and 7 for the argument :" & vbCrLf & _ 
       "DayInWeek1Monday7Sunday!", vbOKOnly + vbCritical 
     'Function will return 30/12/1899 if you don't use a good DayInWeek1Monday7Sunday 
     Exit Function 
    Else 
    End If 

    Do While Weekday(DateSerial(InYear, 1, i), vbMonday) <> DayInWeek1Monday7Sunday 
     i = i + 1 
    Loop 

    GetDayFromWeekNumber = DateAdd("ww", WeekNumber - 1, DateSerial(InYear, 1, i)) 
End Function 
+0

С '2017' и' 1' ваша функция возвращает 12 января 2017. Это желаемый результат?Я бы подумал 5 января 2017 года –

+0

@RonRosenfeld: Thx для указания! Я забыл добавить число «-1» на неделю! – R3uK

+0

@RonRosenfeld: Thx снова, поскольку это не было стабильным в отношении того, в каком году вы его используете, я внедрил его с надлежащей рабочей функцией. – R3uK

1

Она работает довольно хорошо, принимая во внимание, что первый день недели является воскресенье:

Function fnDateFromWeek(ByVal iYear As Integer, ByVal iWeek As Integer, ByVal iWeekDday As Integer) 

     fnDateFromWeek = DateSerial(iYear, 1, ((iWeek - 1) * 7) + iWeekDday - Weekday(DateSerial(iYear, 1, 1)) + 1) 

End Function 

Вы должны пройти какой день вы хотите в качестве третьего параметра. Четверг - день № 5. Кредиты этим ребятам: http://www.dreamincode.net/forums/topic/111464-calculate-date-from-year-weeknr-and-daynumber/

1

В качестве дополнительного варианта для тех, кто использует систему недельных номеров ISO, где неделя 1 года - первая неделя года, содержащая четыре дня (или неделя, которая включает в себя первую четверг календарного года, и в первый день недели является воскресенье.

  • ДОУ является необязательным аргументом, представляющее день недели. это будет по умолчанию четверг и, так как мы используем ISO недельная система должна всегда подпадать под текущий год.

Option Explicit 
Function WNtoDate(WN As Long, YR As Long, Optional DOW As Long = 5) As Date 
    'DOW: 1=SUN, 2=MON, etc 
    Dim DY1 As Date 
    Dim Wk1DT1 As Date 
    Dim I As Long 

DY1 = DateSerial(YR, 1, 1) 
'Use ISO weeknumber system 
I = DatePart("ww", DY1, vbSunday, vbFirstFourDays) 

'Sunday of Week 1 
Wk1DT1 = DateAdd("d", -Weekday(DY1), DY1 + 1 + IIf(I > 1, 7, 0)) 

WNtoDate = DateAdd("ww", WN - 1, Wk1DT1) + DOW - 1 

End Function