VBA Convert date to week number

前端 未结 6 408
渐次进展
渐次进展 2021-01-12 12:01

In VBA I want to convert a date as 03/11/2017(DD/MM/YYYY) into the week number for that date.

Until now I have the following code:

   \'geting the d         


        
相关标签:
6条回答
  • 2021-01-12 12:22

    So, this is my final and working perfectly version

    Public Function IsoWeekNumber(d As Date) As String
    
        Dim kwtemp As String
    
        kwtemp = DatePart("ww", d, vbMonday, vbFirstFourDays)
    
        If Len(kwtemp) = 1 Then kwtemp = "0" & kwtemp
    
        IsoWeekNumber = kwtemp
    
    End Function
    
    If Application.International(xlMDY) = True Then
    
    HeadlineTemp = Mid(VRHeadline, InStr(VRHeadline, "[") + 1, 10)
    HeadlineTemp = Replace(HeadlineTemp, ".", "/")
    HeadlineTemp = Mid(HeadlineTemp, 4, 3) & Left(HeadlineTemp, 2) & Right(HeadlineTemp, 5)
    VRFirstKW = CDate(HeadlineTemp)
    HeadlineTempEndKW = Mid(VRHeadline, InStr(VRHeadline, "]") - 10, 10)
    HeadlineTempEndKW = Replace(HeadlineTempEndKW, ".", "/")
    HeadlineTempEndKW = Mid(HeadlineTempEndKW, 4, 3) & Left(HeadlineTempEndKW, 2) & Right(HeadlineTempEndKW, 5)
    VREndKW = CDate(HeadlineTempEndKW)
    VRKW = "KW" & IsoWeekNumber(VRFirstKW) & "-" & IsoWeekNumber(VREndKW) & "/" & Year(VREndKW)
    
        Else 'don't switch position of the month with days
    
        HeadlineTemp = Mid(VRHeadline, InStr(VRHeadline, "[") + 1, 10)
        HeadlineTemp = Replace(HeadlineTemp, ".", "/")
        VRFirstKW = CDate(HeadlineTemp)
        HeadlineTempEndKW = Mid(VRHeadline, InStr(VRHeadline, "]") - 10, 10)
        HeadlineTempEndKW = Replace(HeadlineTempEndKW, ".", "/")
        VREndKW = CDate(HeadlineTempEndKW)
        VRKW = "KW" & IsoWeekNumber(VRFirstKW) & "-" & IsoWeekNumber(VREndKW) & "/" & Year(VREndKW)
    
    0 讨论(0)
  • 2021-01-12 12:28

    Using VBA, to convert a date into an isoWeeknumber, you merely need the DatePart function (where DT is the date of interest):

    isoWeekNumber = DatePart("ww", DT, vbMonday, vbFirstFourDays)
    

    If you want to use other definitions than that specified in ISO 8601, investigate some of the other options for FirstDayOfWeek and FirstWeekOfYear

    NOTE

    As pointed out by @Mike85, there is a bug in DatePart (and also in the Format) function wherein Monday may be erroneously given a weeknumber of 53 when it should be 1.

    There are a variety of workarounds.

    In Excel 2013+ (Excel for Mac 2011+) you can use for the ISO Weeknumber:

    isoWeekNumber = WorksheetFunction.isoWeekNum(dt)
    

    For earlier versions, you can test the Monday and adjust it if necessary, or you can write a separate routine.

    0 讨论(0)
  • 2021-01-12 12:28

    Be carefull when it comes to week numbers as there are different definitions around. The Excel definition differs from the ISO definition. To get the ISO weeknumber use (copied From http://www.rondebruin.nl/win/s8/win001.htm)

    Public Function IsoWeekNumber(d As Date) As Integer
        Dim d2 As Long
        d2 = DateSerial(Year(d - Weekday(d - 1) + 4), 1, 3)
        IsoWeekNumber = Int((d - d2 + Weekday(d2) + 5) / 7)
    End Function
    
    0 讨论(0)
  • 2021-01-12 12:30

    WeekdayName( number, [abbreviate], [firstdayofweek] ) WeekdayName(2) Result: 'Monday'

    WeekdayName(2, TRUE) Result: 'Mon'

    WeekdayName(2, TRUE, vbMonday) Result: 'Mon'

    0 讨论(0)
  • 2021-01-12 12:41

    To make the Week Number with Monday as a first day, use the following:

    WorksheetFunction.WeekNum(now, vbMonday)
    
    0 讨论(0)
  • 2021-01-12 12:44

    Calculate ISO year using datepart with bugs workaround:

    'Test 2007-12-31 should return W01Y2008
    
    myDate = "2007-12-31"
    
    ISOWeek = DatePart("ww", myDate, vbMonday, vbFirstFourDays)
    Week1 = DatePart("ww", myDate, vbMonday, vbFirstFourDays)
    Week2 = DatePart("ww", DateAdd("d", 7, myDate), vbMonday, vbFirstFourDays)
    ISOYear = DatePart("yyyy", myDate, vbMonday, vbFirstFourDays)
    Year1 = DatePart("yyyy", myDate, vbMonday, vbFirstFourDays)
    Year2 = DatePart("yyyy", DateAdd("d", 7, myDate), vbMonday, vbFirstFourDays)
    
    If ISOWeek = 53 And DatePart("ww", DateAdd("d", 7, myDate), vbMonday, vbFirstFourDays) = 2 Then
       ISOWeek = 1
    End If
    
    if ISOWeek = 1 And DatePart("yyyy", DateAdd("d", 7, myDate), vbMonday, vbFirstFourDays) > ISOYear Then
     ISOYear = ISOYear + 1
    End If
    
    MsgBox("W" & ISOWeek & "Y" & ISOYear)
    
    ' Result in W01Y2008
    
    0 讨论(0)
提交回复
热议问题