[Excel 03] Kalenderwoche in Datum umwandeln

Die aktuelle Woche wird ja automatisch errechnet. Excel soll also auch die Wochentage automatisch updaten, wenn die Woche einen neuen Wert hat.

Man kann zusätzlich die Woche auch manuell bestimmen. Das funktioniert auch alles schon. Bloss wenn ich jetzt also manuell den Wert ändere, werden die Wochentage der neuen Woche nicht automatisch geupdatet!

Das mit dem Aufsplitten der "0838" habe ich schon gemacht (siehe vorletzter Post)!



EDIT: Ausserdem sollten, wie schon gesagt, die Wochentage auch im nächsten Jahr noch korrekt berechnet werden. Wie du ja geschrieben hast, funktioniert das mit dem jetztigen Skript noch nicht... Was muss ich ändern, dass das in jedem beliebigen jahr funktioniert?
 
Achso!
Du meinst also:

Wir haben jetzt Woche 38, und du hast deine Tage Mo-Fr
Wenn du jetzt nächsten Montag (also Woche 39) die Mappe öffnest, sollen dann schon die richtigen Datumswerte für Mo-Fr stehen?

Puhh, da muss ich erst selbst suchen.

Was dein EDIT betrifft:
Die "Gurke" sitzt hier

Zielzelle=datum_aus_woche(Year(Now), blabla....

Zeile 42 meines ursprünglichen Codes. Das "Year(Now)" ist das, was ich meinte, es wird immer das aktuelle Jahr verwendet. Du musst das "Year(Now)" eben mit dem berechneten/eingegebenem Jahr ersetzen (bzw. die Zelle/Variable, wo es drin steht)

EDIT: Da du ja immer Wochen/Jahr-aktuell mit der Mappe arbeiten willst, würde ich es aber stehen lassen.
Eventuell würde folgender Ansatz passen:
Nimm das aktuelle Tagesdatum --> Now-Funktion
Wandle das aktuelle Tagesdatum in Kalenderwoche um (für 05.01.2009 kommt KW02 heraus, für den 07.01.2009 kommt aber auch KW02 heraus)
Übergebe die Kalenderwoche und das aktuelle Jahr an die "datum_aus_woche"-Funktion.
Fertig.
So kannst du sicher stellen, dass immer die richtigen Tage für die aktuelle Woche errechnet werden.
 
Zuletzt bearbeitet:
Das wäre so gut. Das Problem ist jedoch wieder, dass ich diese Tabelle immer Ende Woche per E-Mail versende. Der Empfänger liest es dann jedoch erst in der nächsten Woche und hat somit auch automatisch falsche Angaben (Woche, Datum).
Bisher werden ja alle Daten aus der Excel-tabelle geholt. Deshalb muss ich nur die gewünschte Woche eintippen und es berechnet nicht von heute an, sondern von der eingegebenen Woche. So hat dann auch der Empfänger die richtigen Daten.

Ich poste hier mal mein gesamter Code:
Code:
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

Dim intJahrminus As Integer
intJahrminus = (Jahr - 2000) * 100

   
   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 - intJahrminus - 1) * 7

End Function

Private Sub Worksheet_Change(ByVal Target As Range)

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

End Sub

In der Zelle A6 wird dann also das Datum des Montags dieser Woche angezeigt. Danach rechne ich per Excel einfach immer =A6+1, um das Datum des Dienstags zu erhalten. Das kommt also nicht in den Code.

Schau dir bitte mal an, wie ich das Problem mit dem Einlesen der "0838" gelöst habe, denn da happerts noch: Wenn ich "0838" habe, funktioniert es. Wenn ich jedoch "0938" eingebe, kommt zwar das richtige Datum, allerdings als Jahr statt 2009 eine 2010! Was ist da falsch?
 
Zum Thema E-Mail/Lesen nächste Woche: Bau doch ein Makro, was folgendes macht:

Erstelle eine neue, leere Arbeitsmappe (Achtung: Anzahl Tabellenblätter beachten)
Kopiere die Werte 1:1 aus deiner Original-Mappe in die neue Mappe
Speichere die neue Mappe unter dem Namen "Bericht für Woche XY.xls"

So bekommt der Empfänger einfach eine Excel-Datei, wo einfach nur Datumswerte drinstehen, als ob man sie von Hand eingegeben hätte.

Zum Thema falsches Jahr: Es ist dein intJahrminus-Getöse ^^
Wirf das mal raus, und versuchs mal so, wie ich es oben beschrieben habe ("0838" vor Aufruf zerpflücken usw.)
 
Jetzt kommt eine Fehlermeldung... Muss wohl daran liegen, dass ich noch nie mit VB gearbeitet habe :rolleyes:

Kannst du mein Versuch bitte mal korrigieren?

Code:
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

'Dim intJahrminus As Integer
'intJahrminus = (Jahr - 2000) * 100

   
   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 = 2 Then
        
        If Target <> "" Then
        
        Dim JahrWoche As Integer
        Dim Jahr As Integer
        Dim Woche As Integer
        
        JahrWoche = Tabelle1.Cells(1, 2)
        Jahr = CLng(Left(JahrWoche, 2)) + 2000
        Woche = CLng(Right(JahrWoche, 2))
        
            'Tabelle1.Cells(6, 1) = Datum_aus_Woche(Year(Now), Tabelle1.Cells(1, 2))
            Tabelle1.Cells(6, 1) = Datum_aus_Woche(Jahr, Woche)
        Else
            Tabelle1.Cells(6, 1) = ""
        End If
    
    End If

End Sub


Vielen Dank! :)
 
Es muss
Jahr=CINT(blabla) heissen, anstatt CLNG
Woche=CINT(blabla)
heissen

Denk mal nach:
Du hast Jahr und Woche als Integer ge-Dim-t
Integer sind 2 Bytes gross (16-Bit)
Die CLNG-Funktion wandelt aber einen Zahlenwert in einen Long um, und Long ist 4 Bytes (32-Bit)
Du willst also 4 Bytes in einer Variablen speichern, welche aber nur 2 Bytes peicher-Reservierung zugeteilt bekommen hat.

Also, aus den CLNG jeweils CINT machen

BTW: Wenn du eine Fehlermeldung hast, solltest du auch angeben, in welcher Zeile der Fehler auftaucht, so muss ich raten.

EDIT: +grml* hab gerade gemerkt dass es eben nicht an CLNG liegt.
Also, in welcher Zeile sitzt der Fehler?
 
Ahh, ich glaube ich habe den Fehler gefunden:

Dim JahrWoche as Integer

Mach mal daraus
Dim JahrWoche as String
 
Hai,

wenn du Woche und Jahr getrennt hast geht es auch einfacher :

A1 = KW (08)
A2 = Jahr (2008)
A3 =("4.1."&A2)+A1*7-7-REST("2.1."&A2;7) (18.02.2008)

Ciao Stefan
 
Ich habe es ein wenig umgestellt, sodass man das erstelldatum manuell eingibt und sich dieses ja nicht mehr ändert. Den Rest konnte ich problemlos anpassen! Es hat sich also erledigt.

Vielen Dank für die Hilfe!


MfG flogy92
 

Neue Beiträge

Zurück