vba convert week number (and year) to date?

后端 未结 3 535
渐次进展
渐次进展 2021-01-05 01:00

I have a week number in Cell C13 and a year in Cell C14.

I am using the below formula to convert this into the Thursday of

相关标签:
3条回答
  • 2021-01-05 01:44

    It works quite ok, taking in mind that the first day of the week is Sunday:

    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
    

    You have to pass which day do you want as third parameter. Thursday is day number 5. Credits to these guys: http://www.dreamincode.net/forums/topic/111464-calculate-date-from-year-weeknr-and-daynumber/

    0 讨论(0)
  • 2021-01-05 01:53

    For a specific year, you can do it like this :

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

    And to test it :

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

    If others are looking into this and don't want a Thursday or don't work on 2017 :

    1. change the 5 to fit your need!

    2. Or use the below function GetDayFromWeekNumber

    Code to test it :

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

    And the generic function 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 讨论(0)
  • 2021-01-05 01:53

    As an additional option, for those using the ISO weeknumber system, where Week 1 of the year is the first week of the year containing four days (or the week that includes the first Thursday of the calendar year, and the first day of the week is Sunday.

    • DOW is an optional argument representing the day of the week. It will default to Thursday and, since we are using the ISO weeknumber system, should always fall within the current year.

    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
    

    0 讨论(0)
提交回复
热议问题