Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1432to1436
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Osterdatum

Osterdatum
20.06.2015 10:58:51
mike49

Hallo Leute,
ich habe eine Mappe mit Monatsblättern und ein Blatt "Feiertage".
Dort sind die Feiertage aufgelistet, auf die die Blätter Bezug nehmen.
Um nun mit negativen Stunden rechnen zu können, habe ich unter Optionen "1904-Datumswerte verwenden" angehakt. Jetzt werden die Minusstunden korrekt angezeigt.
Der Nachteil allerdings ist der, dass im Blatt "Feiertage" immer ein falsches Datum angezeigt wird. In der Zeile vom Ostersonntag steht die Formel=Osterdatum(gewJahr) und es wird SA 06.04.2019 angezeigt, obwohl ich das Jahr 2015 gewählt habe.
Das Makro hierzu lautet:

Function Osterdatum(Jahr As Variant) As Date
Dim a, B, C, D, E, J, M, n, O, Monat As Integer
If IsDate(Jahr) = True Then
J = Int(Year(Jahr))
ElseIf IsNumeric(Jahr) Then
J = Int(Jahr)
Else
Exit Function
End If
If J < 1900 Or J > 2078 Then
Exit Function
End If
M = 24
n = 5
a = J Mod 19
B = J Mod 4
C = J Mod 7
D = (19 * a + M) Mod 30
E = ((2 * B) + (4 * C) + (6 * D) + n) Mod 7
O = 22 + D + E
If O > 31 Then
O = D + E - 9
Monat = 4
If O = 26 Then O = 19
If O = 25 And D = 28 And (J Mod 19) > 10 Then O = 18
Else
Monat = 3
End If
Osterdatum = DateSerial(J, Monat, O)
End Function

Wie kann man das korrigieren?
Gruß
mike49

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Osterdatum
20.06.2015 14:09:07
mike49
Hallo Hajo,
danke für die Hilfe. Ich habe mal versucht, das umzusetzen. Das klappt aber bei den Überträgen nicht richtig.
Im Blatt "Feb" steht "6:02". Richtig wäre aber "30:02", da in D37 nichts eingetragen wurde.
Würdest du dir das bitte mal ansehen? Ich habe die Datei hochgeladen:
https://www.herber.de/bbs/user/98330.xls
Gruß
mike49

Anzeige
falsche Formel
20.06.2015 15:21:12
RPP63
Hallo!
=ZEIT() liefert eine Zahl zw. 0 und 1 (s.Hilfe).
Du hast doch in Jan. die richtige Formel, warum hast Du sie nicht nach Feb übernommen?
Gruß Ralf

Osterdatum
20.06.2015 15:25:24
mike49
Hallo Ralf,
wegen des "Gartenzauns" in I38.
Gruß
mike49

Probiers aus!
20.06.2015 16:15:53
RPP63
=I37-D37/24 ergibt in Feb (bei positiver Zeit) das korrekte Ergebnis ...
Du solltest m.E. ohnehin vice versa vorgehen:
rechnen und Übertrag mittels Industriezeit,
Anzeige der Zeit mittels =ABS(Industriezeit/1440) im Format [h]:mm
pos. und neg. unterscheidest Du per bed. Formatierung:
Ind.Zeit neg. -> abs. Uhrzeit rot (oder auch ben.def. Zahlenformat) "- "[h]:mm
Ind.Zeit pos. -> abs. Uhrzeit blau
Gruß Ralf

Anzeige
Probiers aus!
20.06.2015 17:04:13
mike49
Hallo Ralf,
sorry,aber das verstehe ich nicht.Die Industriezeit(dezimale Zeit) wird ja in J38 richtig dargestellt. Es geht mir nur um die Darstellung in Stunden und Minuten in I38. Oder verstehe ich da was falsch.
Vieleicht kannst du mir das ja mal in der hochgeladenen Datei demonstrieren wie du das meinst?!
Gruß
mike49

Anmerkung: Deine UDF rechnet von 1900 bis ...
20.06.2015 17:09:36
Luc:-?
…2099 richtig, Mike,
du musst sie also nicht schon auf einen früheren Zeitpkt begrenzen. Noch genauer ist diese UDF von amos, die bis zur Xl-Datumsgrenze 9999 richtig rechnen dürfte.
Bei Xl-Umstellung auf 1904 (nicht zu empfehlen!) wird immer noch richtig gerechnet, da VBA die 1900-Schaltjahr-Macke nicht hat (beginnt deshalb am 31.12.1899), nur die Darstellung in Xl berücksichtigt die Umstellung und addiert (hier unnötigerweise!) einen Tag.
Gruß, Luc :-?

Anzeige
AW: Anmerkung: Deine UDF rechnet von 1900 bis ...
20.06.2015 17:49:22
mike49
Hallo Luc,
ich kann probieren was ich will.Ich kriegs nicht hin. Meine VBA-Kenntnisse reichen nicht aus.
Danke trotzdem, dass du versucht hast, es mir zu erklären.
Gruß
mike49

Das wirst du auch nicht schaffen, ...
20.06.2015 22:58:10
Luc:-?
…Mike,
denn 1904-Datumsdarstellung verträgt sich nicht mit der VBA-Berechnung.
Luc :-?

AW: Osterdatum
21.06.2015 11:37:07
Josef B
Hallo Mike
Zum Thema 1904 Format wurde ja schon genug gesagt.
Wenn du aber dieses Format verwenden willst,
dann solltest du deine UDF etwas ändern.
Anstatt: Osterdatum = DateSerial(J, Monat, O)
So: Osterdatum = DateSerial(J, Monat, O) – 1462
Gruss Sepp

Allerdings wäre es wohl zweckmäßig, ...
22.06.2015 02:30:10
Luc:-?
…Sepp,
in die UDF eher eine weitere Variable einzubauen, die diesen Abzug davon abhängig macht, ob 1904-Datumswerte in der jeweiligen Mappe eingestellt wurden:
If ActiveWorkbook.Date1904 Then d1904Diff = 1462 und
Osterdatum = DateSerial(J, Monat, O) - d1904Diff
Da VBA aber auf jeden Fall richtig rechnet und 1904-Datumswerte nur ein Darstellungs­effekt sind, kann man in diesem Fall alternativ das Datum auch als Text ausgeben, wofür die UDF-Deklaration As Date entfallen sollte (sie ist ohnehin überflüssig). Außerdem sind alle Variablen außer der letzten indirekt As Variant deklariert, was auch nicht sein muss (wohl wieder dieser typische VBA-Fehler). Das sähe dann so aus (ohne zusätzliche Variable, nur nach Osterdatum = … als Zeile einfügen):
If ActiveWorkbook.Date1904 Then Osterdatum = Format(Osterdatum, "dd.mm.yyyy")
Dann kommt es auch bei Jahren von 1900 bis 1903 nicht zu merkwürdigen Negativ-Angaben, die man in der anderen Variante fallweise durch Heraufsetzen der unteren Grenze auf 1904 ausschließen müsste (was du nicht erwähnt hast).
Gruß, Luc :-?

Anzeige
AW: Allerdings wäre es wohl zweckmäßig, ...
22.06.2015 13:54:51
mike49
Hallo Luc und Sepp,
danke, dass ihr um eine Lösung meines Problems bemüht seid.
Nach einigen Tipps und Lösungsvorschlägen bin ich nun auf diess Makro gestoßen, das bei 1904-Datumswerten funktionieren soll. Was meint ihr dazu?
Ich habe mein Makro hiermit ersetzt, verwende 1904-Datumswerte und alles funktioniert:
Public Function Osterdatum(ByVal y As Integer) As Long
Osterdatum = 7 * (DateSerial(y, 8, ((569.95 * (y Mod 19) + 463 + 30 * ((y \ 100) / 1.472 \  _
1 - y \ 400)) Mod 900) / 31) \ 7) - 125 - Evaluate("DAY(0)") * 1462
End Function
Für eine kurze Rückmeldung wäre ich dankbar.
Gruß
mike49

Anzeige
Das wäre nicht unbedingt erforderlich gewesen, ...
22.06.2015 21:08:44
Luc:-?
…Mike,
mit unseren, speziell meinen Hinweisen hättest du auch deine vorherige, auf dem Gauß-Algorithmus (mit verstecktem Computus) basierende UDF universell verwenden können. Man sollte nicht immer nur Pgmm suchen, sondern auch mal selbst was schreiben bzw (hier) ergänzen, sonst bleibt man stets von Anderen abhängig… :-]
Gruß, Luc :-?
Besser informiert mit …

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige