[Excel 03] Kalenderwoche in Datum umwandeln

flogy92

Mitglied
Hallo Leute

Ich brauche dringend eine Funktion, die eine Kalenderwoche in den ersten Tag der entsprechenden Woche umwandelt.
Beispielsweise habe ich in der Zelle A1 eine Kalenderwoche angegeben (38). In der Zelle A2 soll nun also automatisch Montag, 15.09.2008 erscheinen.

Kann mir hier jemand schnell helfen? Sorry, bin leider kein eingeübter Funktionsanwender...

Vielen Dank im Voraus!


MfG flogy92
 
guggst du hier:

Visual Basic:
Private Function KalenderWoche(Datum As Date) As Integer
Dim tmp As Double

   tmp = DateSerial(Year(Datum + (8 - Weekday(Datum)) Mod 7 - 3), 1, 1)
   KalenderWoche = (Datum - tmp - 3 + (Weekday(tmp) + 1) Mod 7) \ 7 + 1

End Function

Private Function Datum_aus_Woche(Jahr As Integer, _
                                Woche As Integer)
Dim intTag As Integer
Dim intWoche As Integer
   
   If Jahr = 0 Then
      Datum_aus_Woche = 0
      Exit Function
   End If
   
   intTag = 1
   intWoche = KalenderWoche(DateSerial(Jahr, 1, 1))
   
   If intWoche <> 1 Then
      Do Until KalenderWoche(DateSerial(Jahr, 1, intTag)) = 1
         intTag = intTag + 1
      Loop
   Else
      Do Until KalenderWoche(DateSerial(Jahr, 1, intTag)) <> 1
         intTag = intTag - 1
      Loop
      intTag = intTag + 1
   End If
   
   Datum_aus_Woche = DateSerial(Jahr, 1, intTag) + (Woche - 1) * 7

End Function

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Column = 1 Then
        
        If Target <> "" Then
            Tabelle1.Cells(Target.Row, 2) = Datum_aus_Woche(Year(Now), Tabelle1.Cells(Target.Row, 1))
        Else
            Tabelle1.Cells(Target.Row, 2) = ""
        End If
    
    End If

End Sub

im VB-Editor Doppelclick auf Tabelle1 und obigen Code einfügen.
Der Code akzeptiert nur Eingaben einer KW in Spalte A.

Falls weitere Fragen/Verfeinerungen nötig, einfach hier nachfragen.
 
Funktion habe ich in Excel keine gefunden.

Kurzer Hinweis zu meinem Code oben: Der Code oben ist ausgelegt, dass immer das aktuelle Jahr verwendet wird (Der Montag in KW38-2008 hat ein anderes Datum als der Montag in KW38-2009).

Das heisst, wenn du ein Datum über den Jahreswechsel hinaus herausfinden willst (Bsp. der Montag der KW02 in 2009) wird er dir denoch nur den Montag der KW02 des aktuellen Jahres auswerfen.

Falls ein Jahresumbruch berücksichtigt werden muss, muss der Code oben basierend auf einer anderen Eingabe in Zelle A1 etwas umgebaut werden.
 
Wie kann ich das denn so abändern, dass das Datum, welches zurückgegeben wird, immer stimmt?

Am besten beschreibe ich mal mein schlussendliches Ziel und was ich davon bereits habe:
Mein Ziel ist es, eine Excel-Tabelle zu haben, in der ich wöchentlich eintippe, was ich gearbeitet habe. Nun möchte ich aber nicht bei jedem Tag von Montag bis Freitag jeweils das Datum neu eintippen. In der Zeile A ist meine Kopfzeile, in der unter anderem das aktuelle Jahr und die aktuelle Arbeitswoche in einer Zelle stehen soll und zwar in folgendem Format: "0838". Dies habe ich durch diese Formel gemacht:
=TEIL(TEXT(JAHR(HEUTE());0);3;2)&KÜRZEN((HEUTE()-DATUM(JAHR(HEUTE()+3-REST(HEUTE()-2;7));1;REST(HEUTE()-2;7)-9))/7)
Es wird das aktuelle Jahr berechnet, in eine Zeichenkette (String) umgewandelt und davon werden dann die ersten beiden Stellen (2 und 0) vom Jahr abgetrennt. Dahinter wird die aktuelle Kalenderwoche berechnet und angehängt.

Jetzt möchte ich eigentlich nur noch, dass diese Zelle ausgelesen wird (mit deinem Makro) und in den Zellen A6:A10 jeweils das Datum des Montags (A6) bis Freitags (A10) der jeweilig aktuellen Woche ausgegeben wird.
Wie ich die Einlese- und Ausgabezelle bestimmen kann (in deinem Skipt) habe ich bereits herausgefunden. Auch habe ich es so gemacht, dass von der Eingabe, die ja jetzt nicht bloss die Woche sondern auch noch das "08" des Jahres ist, einfach 800 subtrahiert wird. Beziehungsweise wird nicht 800, sondern das aktuelle (Jahr - 2000) * 100 subtrahiert:
Code:
Dim intJahrminus As Integer
intJahrminus = (Jahr - 2000) * 100
...
Datum_aus_Woche = DateSerial(Jahr, 1, intTag) + (Woche - intJahrminus - 1) * 7


Alles was ich jetzt also noch brauche, ist:
  • Eine Möglichkeit, dass das Datum des ersten Tages der Woche unabhängig des aktuellen Jahres korrekt ausgegeben wird


Vielen Dank nochmal für deine Mühe!


MfG flogy92
 
Die autom. Ausgabe der Woche ist einfach:

Visual Basic:
If Target <> "" Then

For OffSet=0 to 4

Tabelle1.Cells(Target.Row, 2+OffSet) = DateAdd("d",OffSet,Datum_aus_Woche(Year(Now), Tabelle1.Cells(Target.Row, 1))

Next

Else

End if

Deine letzte Frage habe ich ehrlich gesagt nicht verstanden.
Btw: Obiges musst du entsprechend umschreiben auf Spalten anstatt Zeilen.
 
Das habe ich schon, danke trotzdem ;)

Du hast geschrieben:
Kurzer Hinweis zu meinem Code oben: Der Code oben ist ausgelegt, dass immer das aktuelle Jahr verwendet wird (Der Montag in KW38-2008 hat ein anderes Datum als der Montag in KW38-2009).

Das heisst, wenn du ein Datum über den Jahreswechsel hinaus herausfinden willst (Bsp. der Montag der KW02 in 2009) wird er dir denoch nur den Montag der KW02 des aktuellen Jahres auswerfen.

Falls ein Jahresumbruch berücksichtigt werden muss, muss der Code oben basierend auf einer anderen Eingabe in Zelle A1 etwas umgebaut werden.

Und genau das möchte ich jetzt noch umsetzen, weiss jedoch nicht, wie ich das angeghen soll...

Noch eine Frage am Rande: Wie kann ich das eigentlich einstellen, dass das Makro immer ausgeführt wird, wenn der Wert einer Zelle geändert wird (also nicht durch mich, sondern automatisch)?


MfG flogy92
 
Achso. Du musst im Prinzip nur die Eingabe "0838" aufsplitten.
Bsp.:
Visual Basic:
JahrWoche="0838"     'Bzw. JahrWoche=Tabelle1.Cells(1,1) - Zelle A1
Jahr=clng(left(JahrWoche,2))+2000  'Ergibt 2008
Woche=Clng(Right(JahrWoche,2))   'Ergibt 38

Den Aufruf musst du dann nur noch ändern in
Visual Basic:
ZelleA6=Datum_aus_Woche(Jahr,Woche)

Was meinst du mit "Wert ändern"? Du meinst, wenn du diese Excel-Mappe öffnest, wird automatisch durch deine Funktion WocheJahr berechnet, und er soll sofort von alleine in die Tagesberechnung springen?

EDIT: Wupps. Es muss CInt(blabla) heissen, nicht clng(blabla)
 

Neue Beiträge

Zurück