2015-12-04 4 views
1

Увидел этот вопрос еще несколько раз, но, похоже, не исправил его в коде VBA.Рассчитать общее количество недель в конкретном году - ISO 8601 - Доступ к VBA

Мне нужно рассчитать общее количество недель в данном году comform ISO 8601

Когда я использую функцию DATEDIFF: iNumWeeks = DateDiff("ww", "1/1/2015", "31/12/2015", vbMonday, vbFirstJan1) она возвращает 52 пока есть 53 недель в 2015 году (ISO 8601)

Как я могу это сделать?

ответ

5

Опять же, цитата из https://en.wikipedia.org/wiki/ISO_8601#Week_dates

28 декабря всегда в последнюю неделю своего года.

Так что это действительно так просто, как

Public Function WeeksInYear(lYear As Long) As Long 

    WeeksInYear = DatePart("ww", DateSerial(lYear, 12, 28), vbMonday, vbFirstFourDays) 

End Function 
+1

Это правильно. Это самый простой способ. – Gustav

-1

Если вы не против использования UDF, этот код вернет его.
= ISOWeekNum ("31.12.2015") или = ISOWeekNum (42369) возвращает 53.

http://www.cpearson.com/excel/DateTimeVBA.htm

'http://www.cpearson.com/excel/DateTimeVBA.htm 
'John Green, an Excel MVP from Australia. 
Public Function ISOWeekNum(AnyDate As Date, Optional WhichFormat As Variant) As Integer 
' WhichFormat: missing or <> 2 then returns week number, 
'        = 2 then YYWW 
' 
Dim ThisYear As Integer 
Dim PreviousYearStart As Date 
Dim ThisYearStart As Date 
Dim NextYearStart As Date 
Dim YearNum As Integer 

ThisYear = Year(AnyDate) 
ThisYearStart = YearStart(ThisYear) 
PreviousYearStart = YearStart(ThisYear - 1) 
NextYearStart = YearStart(ThisYear + 1) 
Select Case AnyDate 
    Case Is >= NextYearStart 
     ISOWeekNum = (AnyDate - NextYearStart) \ 7 + 1 
     YearNum = Year(AnyDate) + 1 
    Case Is < ThisYearStart 
     ISOWeekNum = (AnyDate - PreviousYearStart) \ 7 + 1 
     YearNum = Year(AnyDate) - 1 
    Case Else 
     ISOWeekNum = (AnyDate - ThisYearStart) \ 7 + 1 
     YearNum = Year(AnyDate) 
End Select 

If IsMissing(WhichFormat) Then Exit Function 
If WhichFormat = 2 Then 
    ISOWeekNum = CInt(Format(Right(YearNum, 2), "00") & _ 
    Format(ISOWeekNum, "00")) 
End If 

End Function 

Public Function YearStart(WhichYear As Integer) As Date 

Dim WeekDay As Integer 
Dim NewYear As Date 

NewYear = DateSerial(WhichYear, 1, 1) 
WeekDay = (NewYear - 2) Mod 7 'Generate weekday index where Monday = 0 

If WeekDay < 4 Then 
    YearStart = NewYear - WeekDay 
Else 
    YearStart = NewYear - WeekDay + 7 
End If 

End Function 

Может использоваться в запросе как: SELECT DISTINCT dDate, ISOWeekNum (dDate) ОТ tbl_MyTable

+0

Это не отсчет недель. Это может так же хорошо вернуться на неделю нет. 1 следующего календарного года. – Gustav

1

DATEPART, пытались ли вы это раньше

iNumWeeks = DatePart("ww", CDate("31/12/2015"), vbMonday, vbFirstFourDays) '53 

enter image description here

+0

Хороший ответ - нужно будет изменить vbMonday на 2 и vbFirstFourDays на 2 (доступ не понравился другим способом, когда я пытался) - 'SELECT DISTINCT dDate, DatePart (" ww ", [dDate], 2,2) FROM tbl_MyTable' –

+0

Работает как шарм. Спасибо! – Nicolas

+0

Хорошая идея, но не удается, когда 31 декабря фактически находится в Неделе 1 следующего года. Попробуйте это с 2014. https://en.wikipedia.org/wiki/ISO_8601#Week_dates -> вместо этого вы должны проверить на 28 декабря. – Andre

0

Вот простая функция, которая обеспечит правильный результат для любого года:

Public Function ISO_WeekCount(_ 
    ByVal datYear As Date) _ 
    As Byte 

' Calculates number of weeks in year of datYear according to the ISO 8601:1988 standard. 
' 
' May be freely used and distributed. 
' 2001-06-26. Gustav Brock, Cactus Data ApS, CPH 

    Dim bytISO_Thursday As Byte 

    ' No special error handling. 
    On Error Resume Next 

    bytISO_Thursday = Weekday(vbThursday, vbMonday) 

    datYear = DateSerial(Year(datYear), 12, 31) 
    ' Subtract one week if datYear is in week no. 1 of next year. 
    datYear = DateAdd("ww", Weekday(datYear, vbMonday) < bytISO_Thursday, datYear) 

    ISO_WeekCount = DatePart("ww", datYear, vbMonday, vbFirstFourDays) 

End Function 
Смежные вопросы