title image


Smiley Re: Aus einer WochenNr den Montag berechnen: Rekursive Funktion
Hallo Anne,eigentlich blättere ich sonst über Fragen zum Thema Datumsbrechnungen hinweg, da man entsprechende Antworten mittlerweile im Archiv nachlesen kann. Bei Deiner Frage bin ich u.A. deshalb "hängengeblieben", weil der Titel bereits aussagekäftig genug war. Deine Frage fand ich interessant, da sich das sehr elegant mit einer rekursiven Funktion lösen lässt. Die Alternative wäre eine Funktion a' la:Dim Jahr as Date, Woche as Date,Dim Help as DateJahr = 1999Woche = 36Help = DateSerial (Jahr,1,1)ErsterMontag = Help - Val(Format(Help, "w", vbMonday, vbFirstFourDays)) + 1NächsterMontag=ErsterMontagDo While Val(Format(NächsterMontag,"ww",vbMonday,vbFirstFourDays))     NächsterMontag=NächsterMontag + 7LoopMsgBox NächsterMontagObwohl der Code funktionieren würde, möchte ich hier noch eine rekursive Variante vorstellen, die die Aufgabe schneller löst:Option Explicit Sub Main() Dim Woche As Integer Dim Jahr As Integer Woche = 13 Jahr = 1999 If Woche > 53 Then MsgBox "Die Wochenangabe ist zu groß", vbCritical Exit Sub ElseIf Woche MsgBox "Die Wochenangabe ist zu klein", vbCritical Exit Sub End If MsgBox MontagVonWoche(Woche, Jahr)End Sub Function MontagVonWoche(Woche As Integer, Jahr As Integer) As Date Dim Anfang As Date, Ende As Date Dim Ergebnis As Date Anfang = DateSerial(Jahr, 1, 1) Ende = DateSerial(Jahr, 12, 31)  Ergebnis = SucheWoche(Woche, Anfang, Ende) ' Ergebnis enthält ein Datum, das in der gesuchten Woche liegt. ' Nun suchen wir aus dieser Woche den Montag heraus. Ergebnis = Ergebnis - Val(Format(Ergebnis, "w", vbMonday, vbFirstFourDays)) + 1 MontagVonWoche = ErgebnisEnd Function Function SucheWoche(Woche As Integer, Anfang As Date, Ende As Date) As Date' sucht rekursiv ein Datum, das in der gesuchten Woche liegt. Dim Mitte As Date, wMitte As Integer If Anfang >= Ende Then SucheWoche = Anfang Exit Function Else Mitte = Anfang + (Ende - Anfang) \ 2 wMitte = Val(Format(Mitte, "ww", vbMonday, vbFirstFourDays)) If Woche = wMitte Then SucheWoche = Mitte ElseIf Woche SucheWoche = SucheWoche(Woche, Anfang, Mitte - 1) Else SucheWoche = SucheWoche(Woche, Mitte + 1, Ende) End If End IfEnd FunctionViel Erfolg!Thomas Prötzschcu
Thomas Prötzsch

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: