web-dev-qa-db-fra.com

VBA Convertir la date en numéro de semaine

En VBA, je souhaite convertir une date sous le numéro 03/11/2017 (JJ/MM/AAAA) en numéro de semaine pour cette date.

Jusqu'à présent, j'ai le code suivant: 

   'geting the date out of the string
    HeadlineTemp = Mid(VRHeadline, InStr(VRHeadline, "[") + 1, 10)
   'switch "." to "/"
    HeadlineTemp = Replace(HeadlineTemp, ".", "/")
   'convert to a date
    FristVRFirstKW = CDate(HeadlineTemp)

Maintenant, j'ai besoin d'une fonction pour convertir cette date en numéro de semaine de l'année. Le premier jour de la semaine est le lundi.

2
USER7423

Pour que le numéro de semaine avec lundi soit le premier jour, utilisez les éléments suivants:

WorksheetFunction.WeekNum(now,vbMonday)
6
Vityata

En utilisant VBA, pour convertir une date en un numéro isoWeek, vous avez simplement besoin de la fonction DatePart (où DT correspond à la date d'intérêt):

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

Si vous souhaitez utiliser d'autres définitions que celle spécifiée dans l'ISO 8601, examinez certaines des autres options de FirstDayOfWeek et FirstWeekOfYear.

3
Ron Rosenfeld

Soyez prudent en ce qui concerne les numéros de semaine car il existe différentes définitions. La définition Excel diffère de la définition ISO. Pour utiliser le numéro de semaine ISO (copié de 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
1
FunThomas

Donc, ceci est ma version finale et fonctionne parfaitement

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
USER7423

WeekdayName( number, [abbreviate], [firstdayofweek] ) WeekdayName(2) Résultat: 'lundi'

WeekdayName(2, TRUE).__ Résultat: 'Mon'

WeekdayName(2, TRUE, vbMonday).__ Résultat: 'Mon'

0
mani