Attachment 'Montag.txt'

Download

   1 ||<tablestyle="background: lightyellow; width:100%; text-align:right"> [[Action(edit, Editieren)]]||
   2 
   3 [[Navigation(siblings)]]
   4 [[TableOfContents]]
   5 
   6 = Zu einem bestimmten Wochentag vor- bzw. zurückrechnen =
   7 Manchmal braucht man im Zusammenhang mit Datumsfunktionen eine Formel, die ausgehend von einem variablen Datum immer z.B. den nächsten (oder letzten) Donnerstag, Mittwoch oder sonst einen bestimmten Wochentag liefert.
   8 == Zum nächsten Montag (Dienstag, Mittwoch,....) ==
   9 Da unser Ausgangsdatum variabel ist, müssten wir theoretisch 7 WENN-Fälle unterscheiden. Solche verschachtelten Funktionen sind aber schwierig zu dominieren und wenn die Formel auch noch dahingehend flexibel sein soll, dass sie auf verschiedene angestrebte Wochentage reagiert, wird das Ganze sehr unübersichtlich. Wir suchen daher nach einer mathematischen Lösung.
  10 
  11 Wir haben:
  12  * ein unbekanntes Ausgangsdatum
  13  * einen fixen angestrebten Wochentag
  14  * einen unbekannten Ausgangs-Wochentag
  15 
  16 Nun wissen wir, dass wir mit ''einer'' mathematischen Gleichung nur ''eine'' Unbekannte ermitteln können. Wir müssen also versuchen, in dieser Liste eine Unbekannte wegzubekommen. Das Ausgangsdatum ist per Definition variabel, also die Unbekannte, die uns in jedem Fall bleibt. Was aber ist mit dem Ausgangs-Wochentag? Kann man den zu einer bekannten Größe machen?[[BR]]
  17 Man kann:
  18 
  19 ||<#c6c3c6>||<#c6c3c6:>'''A'''||<#c6c3c6:>'''B'''||<#c6c3c6:>'''C'''||<20%|9:>Indem wir von einem Datum den zugehörigen Wochentag abziehen, kommen wir immer zum letzten Samstag [[FootNote(Die Funktion WOCHENTAG() kann mit der Zählung je nach Wunsch am Sonntag oder Montag beginnen. In den Beispielen dieser Seite benutzen wir die Standardeinstellung, die mit der Zählung am Sonntag beginnt. Die Verwendungsmöglichkeiten der Funktionsparameter sind im online-Hilfetext aufgeführt.[[BR]][[BR]])]]. [[BR]]Damit haben wir einen fixen Wochentag, von dem aus man nun durch Addition eines fixen Wertes zum gewünschten Wochentag kommen kann.||
  20 ||<#c6c3c6:>'''1'''||<:>'''Startdatum'''||<:>'''Der letzte Samstag'''||<:>'''Formel in Spalte B'''||
  21 ||<#c6c3c6:>'''2'''||<:>'''Mi''' 20.Dez 06||<:>'''Sa''' 16.Dez 06||<:>=A2-WOCHENTAG(A2)||
  22 ||<#c6c3c6:>'''3'''||<:>'''Do''' 21.Dez 06||<:>'''Sa''' 16.Dez 06||<:>=A3-WOCHENTAG(A3)||
  23 ||<#c6c3c6:>'''4'''||<:>'''Fr''' 22.Dez 06||<:>'''Sa''' 16.Dez 06||<:>=A4-WOCHENTAG(A4)||
  24 ||<#c6c3c6:>'''5'''||<:>'''Sa''' 23.Dez 06||<:>'''Sa''' 16.Dez 06||<:>=A5-WOCHENTAG(A5)||
  25 ||<#c6c3c6:>'''6'''||<:>'''So''' 24.Dez 06||<:>'''Sa''' 23.Dez 06||<:>=A6-WOCHENTAG(A6)||
  26 ||<#c6c3c6:>'''7'''||<:>'''Mo''' 25.Dez 06||<:>'''Sa''' 23.Dez 06||<:>=A7-WOCHENTAG(A7)||
  27 ||<#c6c3c6:>'''8'''||<:>'''Di''' 26.Dez 06||<:>'''Sa''' 23.Dez 06||<:>=A8-WOCHENTAG(A8)||
  28 
  29 Nachdem wir nun für unsere Vorwärtszählung nicht von einem beliebigen Wochentag ausgehen, sondern immer vom davorliegenden Samstag, wissen wir stets, was wir hinzuzählen müssen, um zum tatsächlich angestrebten Wochentag zu gelangen:
  30 
  31 ||<#c6c3c6>||<#c6c3c6:>'''A'''||<#c6c3c6:>'''B'''||<#c6c3c6:>'''C'''||<#c6c3c6:>'''D'''||<#c6c3c6:>'''E'''||
  32 ||<#c6c3c6:>'''1'''||<:>'''Startdatum'''||<:>=$A2-WOCHENTAG($A2)[[BR]]'''+7'''||<:>=$A2-WOCHENTAG($A2)[[BR]]'''+1'''||<:>=$A2-WOCHENTAG($A2)[[BR]]'''+2'''||<:>=$A2-WOCHENTAG($A2)[[BR]]'''+3'''||
  33 ||<#c6c3c6:>'''2'''||<:>Do 21.Dez 06||<:>Sa 23.Dez 06||<:>So 17.Dez 06||<:>Mo 18.Dez 06||<:>Di 19.Dez 06||
  34 ||<#c6c3c6:>'''3'''||<:>Fr 22.Dez 06||<:>Sa 23.Dez 06||<:>So 17.Dez 06||<:>Mo 18.Dez 06||<:>Di 19.Dez 06||
  35 ||<#c6c3c6:>'''4'''||<:>Sa 23.Dez 06||<:>'''Sa 23.Dez 06'''||<:>So 17.Dez 06||<:>Mo 18.Dez 06||<:>Di 19.Dez 06||
  36 ||<#c6c3c6:>'''5'''||<:>So 24.Dez 06||<:>Sa 30.Dez 06||<:>'''So 24.Dez 06'''||<:>Mo 25.Dez 06||<:>Di 26.Dez 06||
  37 ||<#c6c3c6:>'''6'''||<:>Mo 25.Dez 06||<:>Sa 30.Dez 06||<:>So 24.Dez 06||<:>'''Mo 25.Dez 06'''||<:>Di 26.Dez 06||
  38 ||<#c6c3c6:>'''7'''||<:>Di 26.Dez 06||<:>Sa 30.Dez 06||<:>So 24.Dez 06||<:>Mo 25.Dez 06||<:>'''Di 26.Dez 06'''||
  39 ||<#c6c3c6:>'''8'''||<:>Mi 27.Dez 06||<:>Sa 30.Dez 06||<:>So 24.Dez 06||<:>Mo 25.Dez 06||<:>Di 26.Dez 06||
  40 
  41 Die Problemfälle sind in der oberen Tabelle hervorgehoben: Immer, wenn der angestrebte Wochentag mit dem Wochentag des Ausgangsdatums übereinstimmt, gelangen wir zum Ausgangsdatum anstatt zum entsprechenden Datum der kommenden Woche.
  42 
  43 Nun könnte man versuchen, diesen Fall durch eine WENN-Abfrage in den Griff zu bekommen. Es geht aber auch eleganter.
  44 
  45 Die Situation, die wir bisher haben ist die, dass wir maximal um 7 Tage zurückrechnen und anschließend maximal um 7 Tage vorwärts. Wir lösen das Problem, indem wir fix um 8 Tage vorwärts rechnen. Das bedeutet aber, dass wir die Formel anders aufbauen müssen.
  46 
  47 Bisher haben wir uns einen fixen Startpunkt gesucht - immer der letzte Samstag – zu dem wir je nachdem 1, 2,...7 Tage hinzugezählt haben. Da wir jetzt fix 8 Tage hinzuzählen wollen, muss also der Startpunkt variabel werden und nicht auf den Samstag fixiert:
  48 
  49 ||<#c6c3c6>||<#c6c3c6:>'''A'''||<#c6c3c6:>'''B'''||<#c6c3c6:>'''C'''||<#c6c3c6:>'''D'''||<#c6c3c6:>'''E'''||
  50 ||<#c6c3c6:>'''1'''||<:>'''Startdatum'''||<:>=$A2-WOCHENTAG'''($A2-1)'''[[BR]]+8||<:>=$A2-WOCHENTAG'''($A2-2)'''[[BR]]+8||<:>=$A2-WOCHENTAG'''($A2-3)'''[[BR]]+8||<:>=$A2-WOCHENTAG'''($A2-4)'''[[BR]]+8||
  51 ||<#c6c3c6:>'''2'''||<:>Do 21.Dez 06||<:>Mo 25.Dez 06||<:>Di 26.Dez 06||<:>Mi 27.Dez 06||<:>'''Do 28.Dez 06'''||
  52 ||<#c6c3c6:>'''3'''||<:>Fr 22.Dez 06||<:>Mo 25.Dez 06||<:>Di 26.Dez 06||<:>Mi 27.Dez 06||<:>Do 28.Dez 06||
  53 ||<#c6c3c6:>'''4'''||<:>Sa 23.Dez 06||<:>Mo 25.Dez 06||<:>Di 26.Dez 06||<:>Mi 27.Dez 06||<:>Do 28.Dez 06||
  54 ||<#c6c3c6:>'''5'''||<:>So 24.Dez 06||<:>Mo 25.Dez 06||<:>Di 26.Dez 06||<:>Mi 27.Dez 06||<:>Do 28.Dez 06||
  55 ||<#c6c3c6:>'''6'''||<:>Mo 25.Dez 06||<:>'''Mo 01.Jan 07'''||<:>Di 26.Dez 06||<:>Mi 27.Dez 06||<:>Do 28.Dez 06||
  56 ||<#c6c3c6:>'''7'''||<:>Di 26.Dez 06||<:>Mo 01.Jan 07||<:>'''Di 02.Jan 07'''||<:>Mi 27.Dez 06||<:>Do 28.Dez 06||
  57 ||<#c6c3c6:>'''8'''||<:>Mi 27.Dez 06||<:>Mo 01.Jan 07||<:>Di 02.Jan 07||<:>'''Mi 03.Jan 07'''||<:>Do 28.Dez 06||
  58 
  59 === Anwendungsbeispiele ===
  60 Für die Erklärung des Formelaufbaus haben wir je nach Wochentag einen fixen Wert benutzt: [[BR]]
  61 $A2-WOCHENTAG($A2-'''1''')+8 ? zum nächsten Montag[[BR]]
  62 $A2-WOCHENTAG($A2-'''2''')+8 ? zum nächsten Dienstag[[BR]]
  63 $A2-WOCHENTAG($A2-'''3''')+8 ? zum nächsten Mittwoch[[BR]]
  64 usw.
  65 
  66 Vielleicht ist der angestrebte Wochentag aber nicht immer der gleiche. Dann könnte man z.B. eine Zelle benutzen, in die man den jeweils zu benutzenden Wert hinterlegt, dann könnte die Formel so aussehen:[[BR]]
  67 $A2-WOCHENTAG($A2-'''$A$1''')+8 [[FootNote(Da die Formel vermutich kopiert werden soll, unbedingt auf die richtige Verwendung von [wiki:Self:AbsoluteAdresse absoluten und relativen] Adressen achten.[[BR]][[BR]])]]
  68 
  69 Oder man hinterlegt in dieser Zelle keine Werte, sondern die Wochentage: Mo, Di, Mi, usw. Dann müsste man eine WENN-Formel einbauen:
  70 {{{
  71 =WENN($A$1="Mo";1; WENN($A$1="Di";2; WENN($A$1="Mi";3; WENN($A$1="Do";4; WENN($A$1="Fr";5; WENN($A$1="Sa";6;7))))))
  72 }}}
  73 Die ganze Formel würde dann so aussehen:
  74 {{{
  75 $A2-WOCHENTAG($A2-WENN($A$1="Mo";1; WENN($A$1="Di";2; WENN($A$1="Mi";3; WENN($A$1="Do";4; WENN($A$1="Fr";5; WENN($A$1="Sa";6;7)))))))
  76 }}}
  77 
  78 Statt WENN-Formeln könnte man auch mit der Funktion [wiki:Self:CalcFunktionenTabellen/DatenFinden SVERWEIS()] arbeiten.
  79 
  80 
  81 == Zum letzten Montag (Dienstag, Mittwoch,....) ==
  82 Im vorigen Beispiel mussten wir zuerst zurückrechnen und anschließend wieder vorwärtsrechnen, wodurch wir das Problem lösen mussten, dass die Anzahl zurückgerechneter Tage nicht gleich sein durfte wie die Anzahl vorwärtsgerechneter Tage.
  83 
  84 Wenn wir einen zurückliegenden Wochentag suchen, haben wir es leichter:
  85 
  86 (Datum-WOCHENTAG(Datum)) ? zum letzten Samstag[[BR]]
  87 (Datum-WOCHENTAG(Datum+1)) ? zum letzten Freitag[[BR]]
  88 (Datum-WOCHENTAG(Datum+2)) ? zum letzten Donnerstag[[BR]]
  89 
  90 Auch hier kann natürlich der Ausdruck '''+1''', '''+2''', usw. ersetzt werden durch einen Zellbezug oder eine WENN-Formel wie in den obigen Anwendungsbeispielen beschrieben.
  91 
  92 == Der erste Montag von jedem Monat des laufenden Jahres ==
  93 Das folgende Beispiel geht davon aus, dass das aktuelle Jahr in einer [wiki:self:NamenFürZellen benannten Zelle] hinterlegt ist, und man sich mit der Bezeichnung ''!AktuellesJahr'' darauf beziehen kann. Die Jahreszahl kann dabei direkt oder in der Form '''=JAHR(HEUTE())''' gespeichert sein. Die hier verwendete Bezeichung ''!AktuellesJahr'' kann natürlich auch durch eine Zelladresse, einen konkreten Wert oder eine Formel ersetzt werden.
  94 
  95 Für die Bestimmung des Monats wird die Zeilennummer =ZEILE() verwendet. Entspricht die Zeilennummer nicht den gesuchten Monaten, muss der Wert für ZEILE() entsprechend angepasst werden.
  96 
  97 ||<#c6c3c6:>||<#c6c3c6:25%>'''A||<#c6c3c6:>'''B||
  98 ||<#c6c3c6:>1||<:>Montag, 02.01.2006||<:|12>~+`DATUM(AktuellesJahr;ZEILE();8)` `-WOCHENTAG(DATUM(AktuellesJahr;ZEILE();1)+5)`+~ [[BR]][[BR]]Erklärung: [[BR]]Man geht vom Datum ''eine Woche nach dem Monatsersten'' aus und rechnet um einen Wert zurück, der sich aus dem Wochentag des Monatsersten herleiten lässt||
  99 ||<#c6c3c6:>2||<:>Montag, 06.02.2006||
 100 ||<#c6c3c6:>3||<:>Montag, 06.03.2006||
 101 ||<#c6c3c6:>4||<:>Montag, 03.04.2006||
 102 ||<#c6c3c6:>5||<:>Montag, 08.05.2006||
 103 ||<#c6c3c6:>6||<:>Montag, 05.06.2006||
 104 ||<#c6c3c6:>7||<:>Montag, 03.07.2006||
 105 ||<#c6c3c6:>8||<:>Montag, 07.08.2006||
 106 ||<#c6c3c6:>9||<:>Montag, 04.09.2006||
 107 ||<#c6c3c6:>10||<:>Montag, 02.10.2006||
 108 ||<#c6c3c6:>11||<:>Montag, 06.11.2006||
 109 ||<#c6c3c6:>12||<:>Montag, 04.12.2006||
 110 
 111 Der jeweils erste Dienstag: [[BR]]
 112 =DATUM(!AktuellesJahr;ZEILE();8)-WOCHENTAG(DATUM(!AktuellesJahr;ZEILE();1)+'''4''')
 113 
 114 Der jeweils erste Mittwoch: [[BR]]
 115 =DATUM(!AktuellesJahr;ZEILE();8)-WOCHENTAG(DATUM(!AktuellesJahr;ZEILE();1)+'''3''')
 116 
 117 Der jeweils erste Donnerstag: [[BR]]
 118 =DATUM(!AktuellesJahr;ZEILE();8)-WOCHENTAG(DATUM(!AktuellesJahr;ZEILE();1)+'''2''')
 119 
 120 Der jeweils erste Freitag: [[BR]]
 121 =DATUM(!AktuellesJahr;ZEILE();8)-WOCHENTAG(DATUM(!AktuellesJahr;ZEILE();1)+'''1''')
 122 
 123 Der jeweils erste Samstag: [[BR]]
 124 =DATUM(!AktuellesJahr;ZEILE();8)-WOCHENTAG(DATUM(!AktuellesJahr;ZEILE();1)+'''7''')
 125 
 126 Der jeweils erste Sonntag: [[BR]]
 127 =DATUM(!AktuellesJahr;ZEILE();8)-WOCHENTAG(DATUM(!AktuellesJahr;ZEILE();1)+'''6''')
 128 
 129 ----
 130 KategorieCalc KategorieHowto
 131 ----

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
  • [get | view] (2006-12-26 20:20:56, 139.4 KB) [[attachment:Bug.txt]]
  • [get | view] (2006-12-26 20:20:30, 10.1 KB) [[attachment:Montag.txt]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.