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?
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 :
changez le 5 pour répondre à vos besoins!
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
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/
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.
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