2017-02-16 1 views
5

Ich habe eine Woche Nummer in Zelle C13 und eine Jahr in Zelle C14.vba Wochenzahl (und Jahr) umrechnen?

Ich bin mit der folgenden Formel wandeln diese in den Donnerstag zu diesem Datum Woche Nummer:

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

Wie kann ich das Gleiche mit VBA zu tun?

+0

Wenn 'C13 = 1 'und' C14 = 2017', (erste Woche 2017), Ihre Formel gibt '29. Dezember 2016'. Ist es das was du willst? –

+0

Da dies in Bezug auf das Jahr, in dem Sie es verwenden, nicht stabil war, habe ich es mit einer richtig funktionierenden Funktion ergänzt! ;) – R3uK

Antwort

3

für ein bestimmtes Jahr, können Sie es wie folgt tun:

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

Und um es zu testen:

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

Wenn andere suchen in diesem und don‘ t wollen einen Donnerstag oder nicht an 2017 arbeiten:

  1. Ändern Sie die 5 nach Ihren Bedürfnissen!

  2. Oder nutzen Sie die unten Funktion GetDayFromWeekNumber

-Code testen:

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

Und die generische Funktion 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

Mit '2017' und' 1' kommt deine Funktion am 12.01.2017 zurück. Ist das das gewünschte Ergebnis?Ich hätte gedacht, 5 Jan 2017 –

+0

@RonRosenfeld: Thx für Hinweis! Ich habe vergessen, die "-1" zur Wochennummer hinzuzufügen! – R3uK

+0

@RonRosenfeld: Nochmals, da dies in Bezug auf das Jahr, in dem Sie es verwenden, nicht stabil war, habe ich es mit einer funktionierenden Funktion versehen. – R3uK

1

Es funktioniert ganz in Ordnung, daran nehmen, dass der erste Tag der Woche Sonntag:

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 

Sie müssen passieren, welcher Tag wollen Sie als dritten Parameter. Donnerstag ist Tag Nummer 5. Dankeschön an diese Leute: http://www.dreamincode.net/forums/topic/111464-calculate-date-from-year-weeknr-and-daynumber/

1

Als zusätzliche Option für diejenigen, die das ISO-Wochennummernsystem verwenden, wobei Woche 1 des Jahres die erste Woche des Jahres ist, die vier Tage (oder die Woche) enthält enthält der erste Donnerstag des Kalenderjahres, und der erste Tag der Woche ist Sonntag.

  • DOW ein optionales Argument ist, den Tag der Woche darstellt. Es bis Donnerstag ausfällt und, da wir die ISO verwenden Wochennummernsystem sollte immer in das laufende Jahr fallen.

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 

Verwandte Themen