web-dev-qa-db-fra.com

vba convertir le numéro de semaine (et l'année) en date?

J'ai un numéro de semaine dans la cellule C13 et un année dans la cellule C14.

J'utilise la formule ci-dessous pour convertir cela en jeudi de cette semaine date du numéro:

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

Comment pourrais-je faire la même chose avec VBA?

6
user7415328

Pour une année spécifique , vous pouvez le faire comme ceci:

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

Et pour le tester:

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

Si d'autres se penchent sur cette question et ne veulent pas de jeudi ou ne travaillent pas en 2017 :

  1. changez le 5 pour répondre à vos besoins!

  2. Ou utilisez la fonction ci-dessous GetDayFromWeekNumber

Code pour le tester:

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

Et la fonction générique 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
4
R3uK

Cela fonctionne très bien, sachant que le premier jour de la semaine est le dimanche:

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

Vous devez indiquer quel jour vous voulez en troisième paramètre. Jeudi est le jour numéro 5. Crédits à ces gars: http://www.dreamincode.net/forums/topic/111464-calculate-date-from-year-weeknr-and-daynumber/

1
Vityata

Comme option supplémentaire, pour ceux qui utilisent le système de numéro de semaine ISO, où la semaine 1 de l'année est la première semaine de l'année contenant quatre jours (ou la semaine qui comprend le premier jeudi de l'année civile et le premier jour de la semaine c'est dimanche.

  • DOW est un argument optionnel représentant le jour de la semaine. Il utilisera par défaut jeudi et, comme nous utilisons le système de numéro de semaine ISO, doit toujours appartenir à l'année en cours.

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

1
Ron Rosenfeld