Calc: Subtraktion von Uhrzeitangaben

Ich selber habe es für mich festgelegt. Ursprünglich ging es hier ja
um etwas Abstraktes und nicht um etwas Konkretes. Daher hatte ich
bisher keine Details gepostet.

Die vollständigen Anforderungen der kleinen Arbeitszeittabelle sind
mit Worten nur aufwändig zu beschreiben. Aber Du hast natürlich völlig
Recht: Da es hier jetzt im Thread doch weitergeht, poste ich eine
Tabelle als Beispiel:

https://www.dropbox.com/s/kr15l3pod3p1m06/test-lo-calc-arbeitszeiten.ods

Fällt mir spontan auch nix besseres ein.

Bis vielleicht, dass die Formeln in Spalte J sehr unübersichtlich aka
schlecht wartbar sind. Daher würde ich in dem Fall tatsächlich
Hilfsspalten empfehlen.

Z. B. könntest du ab Spalte L alle 2 Spalten (wie bei den
Beginn-Ende-Wertepaaren) eine Formel der Art

=WENN(C2+0>0;C2-B2;"")

usw.; und dann in Spalte J die Arbeitszeit folgendermaßen berechnen

=WENN(SUMME(L2:R2)>0;SUMME(L2);"")

Die Hilfsspalten kannst du abschließend notfalls ausblenden, wenn sie
dir nicht gefallen (markieren, und entweder "Rechtsklick => Ausblenden",
oder - empfohlen - "Daten => Gruppierung und Gliederung => Gruppieren"
und dann oben auf das "-" klicken).

Sollte dir dann in 3 Wochen, Monaten oder Jahren einfallen, dass du doch
noch irgendwas ändern möchtest, musst du nicht in /einer/ Formel *zig*
mal die gleiche Änderung vornehmen, sondern musst nur *einmal* eine der
Zellen ändern, und kannst dann die neue Formel dann über die alten
drüber kopieren (daher würde ich auch den 2-Spalten-Abstand beibehalten).

Ungünstig ist dabei die alternierende Folge von Beginn- und Ende-Werten.
Wenn die Beginn-Werte und die Ende-Werte jeweils in /eine/ Matrix
zusammengefasst werden könnten, käme (viel eleganter) auch eine Formel
in Betracht der Art

=SUMMENPRODUKT(C2:C4-B2:B4;C2:C4>0)

(mit hier B2:B4= Start- und C2:C4 = Ende-Werte). Aber eine Matrix muss
meines Wissens immer ein zusammenhängender Bereich sein.

Sie erfüllt in dem Zustand meine Anforderungen.

Aber hübsch/lesbar/wartbar ist die Formel nicht.

AOL; war auch mien erster Gedanke (s. o.).

Btw., *ich* hab mir angewöhnt, 'Dummies', also Leerstrings o. ä., immer
möglichst nach /hinten/ zu setzen. Meiner Meinung nach erleichtert es
das Lesen einer Formel, wenn man sich sozusagen immer erst nur auf das
Wichtige konzentrieren kann, und erst zum Schluss das Unwichtige kommt
(aka überlesen werden kann :slight_smile: ). Wenn dagegen der Dummy (oder gar
mehrere, bei verschiedenen Verschachtelungsebenen) irgendwo zwischen
drin steht/stehen, muss man bei jedem erst mal überlegen, auf welcher
Ebene man sich überhaupt gerade befindet. Wenn sie dagegen am Ende
versammelt sind, selbst wenn es eine ganze Palette ist (a la
"[...];"");"");"")"), ist sofort erkennbar, dass man sich dort weitere
Überlegungen ersparen kann. Nur so als kleine Anregung.

BTW. II, ich würde die Begin-Ende-Paare irgendwie markieren (z. B. durch
Rahmen aka senkrechte Striche); sonst besteht leicht die Gefahr, mal in
die falsche Spalte zu geraten (z. B. weil man vor zwei Stunden vergessen
hat, in Spalte E den Ende-Wert ein zu tragen). Und ich würde die Tabelle
an Zelle B2 fixieren ("Fenster => Fixieren").

Wolfgang

BTW. II, ich würde die Begin-Ende-Paare irgendwie markieren (z. B. durch
Rahmen aka senkrechte Striche); sonst besteht leicht die Gefahr, mal in
die falsche Spalte zu geraten (z. B. weil man vor zwei Stunden vergessen
hat, in Spalte E den Ende-Wert ein zu tragen). Und ich würde die Tabelle
an Zelle B2 fixieren ("Fenster => Fixieren").

Und ich würde trotz allem die Zellen in Spalte J mit

[H]" h "M" min"

formatieren; nur für den Fall, dass der Wert mal > 24:00 wird.

Und wenn du ganz sicher gehen willst, kannst du noch dafür sorgen, dass
wirklich nur der Nachkommaanteil (aka ohne eventuellen Datumsanteil)
berücksichtigt wird (z. B. durch "=WENN(C2+0>0;Rest(C2-B2;1);"")"); und,
und, ... <g>

Ach ja, in dieser Formel ("=WENN(C2+0>0;C2-B2;"")") gibt es noch einen
kleinen Trick, auf den ich aufmerksam machen möchte. Das Ergebnis eines
Vergleichs zwischen einem String (und Leer = Leerstring) und einem Wert
ist etwas, hmm, sagen wir mal unzuverlässig. Bei Vergleichen überprüft
Calc nicht die Parameter auf Konsistenz, und insbesondere versucht Calc
/nicht/, einen Text ggf. in einen Wert um zu wandeln. Hier kommt die
Ergänzung "+0" ins Spiel. Durch diese wird *zuerst* eine *Addition* aka
Rechenoperation durchgeführt, was Calc genau zu dieser Umwandlung
veranlasst. Erst das /Ergebnis/ dieser Rechenoperation (also zuverlässig
ein /Wert/, kein String) wird dann mit einem anderen Wert verglichen.

Wolfgang, dem das inzwischen so in den Fingern steckt, dass er nicht mal
mehr richtig merkt, wenn er das einfügt :-/

OoOHWHOoO schrieb:

so ganz klar ist mir das Ganze noch nicht. Ich beziehe mich mal auf die
1. Datenzeile:

[1] Wenn man bei dem 1. Wertepaar (B/C) für C einen Wert größer A
eingibt, wird J über Mitternacht hinaus aufsummiert. Bei den folgenden 3
Wertepaaren (D/E F/G H/I) bewirkt es hingegen, dass J auf "" gesetzt
wird. Ist das so gewollt ?

Beziehst Du Dich auf die Formel, die Du zitierst hast?
Sie ist überholt.

Aktuell ist:
https://www.dropbox.com/s/kr15l3pod3p1m06/test-lo-calc-arbeitszeiten.ods

=WENN((WENN(C2="";;C2-B2)+WENN(E2="";;E2-D2)+WENN(G2="";;G2-F2)+WENN(I2="";;I2-H2))=0;"";(WENN(C2="";;C2-B2)+WENN(E2="";;E2-D2)+WENN(G2="";;G2-F2)+WENN(I2="";;I2-H2)))

[2] Wenn bei B/C der Wert für C noch fehlt, aber für D/E beide Werte
vorhanden sind,

Das kommt nicht vor.

wird die Arbeitszeit resultierend aus D/E angezeigt. Ist
das so gewollt ?

Wenn C fehlt ist ja die Dauer des ersten Intervalls unbekannt.
Es kann also nur die Zeit aus D/E angezeigt werden.

[3] Sind das Zeit-Intervalle eines Tages, also im Gesamtzeitraum
00:00-23:59 ?

Exakt.

[4] Folgen die 4 Wertepaare B/C, D/E, F/G, H/I zeitlich aufeinander ?

Genau.

Mit anderen Worten: der früheste Beginn von D/E wäre das Ende von B/C,
aber eben keinesfalls früher. Richtig so ?

Richtig.

Gruß, Andreas

Wolfgang Jäth schrieb:

BTW. II, ich würde die Begin-Ende-Paare irgendwie markieren (z. B. durch
Rahmen aka senkrechte Striche); sonst besteht leicht die Gefahr, mal in
die falsche Spalte zu geraten (z. B. weil man vor zwei Stunden vergessen
hat, in Spalte E den Ende-Wert ein zu tragen).

Ist schon längst geschehen :slight_smile:

https://www.dropbox.com/s/97x7g5rgdfekvif/Screenshot%202018-08-03%2023.38.57.png

Und ich würde die Tabelle
an Zelle B2 fixieren ("Fenster => Fixieren").

Und ich würde trotz allem die Zellen in Spalte J mit

[H]" h "M" min"

formatieren; nur für den Fall, dass der Wert mal > 24:00 wird.

Das kann nicht passieren, weil es ja um die Zeiten des einzelnen Tages
geht.

Und wenn du ganz sicher gehen willst, kannst du noch dafür sorgen, dass
wirklich nur der Nachkommaanteil (aka ohne eventuellen Datumsanteil)
berücksichtigt wird (z. B. durch "=WENN(C2+0>0;Rest(C2-B2;1);"")"); und,
und, ... <g>

Ja, das Thema hat es in sich :slight_smile:

Ach ja, in dieser Formel ("=WENN(C2+0>0;C2-B2;"")") gibt es noch einen
kleinen Trick, auf den ich aufmerksam machen möchte. Das Ergebnis eines
Vergleichs zwischen einem String (und Leer = Leerstring) und einem Wert
ist etwas, hmm, sagen wir mal unzuverlässig. Bei Vergleichen überprüft
Calc nicht die Parameter auf Konsistenz, und insbesondere versucht Calc
/nicht/, einen Text ggf. in einen Wert um zu wandeln. Hier kommt die
Ergänzung "+0" ins Spiel. Durch diese wird *zuerst* eine *Addition* aka
Rechenoperation durchgeführt, was Calc genau zu dieser Umwandlung
veranlasst. Erst das /Ergebnis/ dieser Rechenoperation (also zuverlässig
ein /Wert/, kein String) wird dann mit einem anderen Wert verglichen

Klasse, das kommt in meine Notizsammlung zu Calc. Vielen Dank für den
Einblick!

In meiner aktuellen Version verwende ich:

=WENN((WENN(C2="";;C2-B2)+WENN(E2="";;E2-D2)+WENN(G2="";;G2-F2)+WENN(I2="";;I2-H2))=0;"";(WENN(C2="";;C2-B2)+WENN(E2="";;E2-D2)+WENN(G2="";;G2-F2)+WENN(I2="";;I2-H2)))

ISTLEER(C2) wäre statt C2="" auch möglich. Aber dann gäbe es noch mehr
Klammern.

Gute Nacht, Andreas

Aktuell ist:
https://www.dropbox.com/s/kr15l3pod3p1m06/test-lo-calc-arbeitszeiten.ods

=WENN((WENN(C2="";;C2-B2)+WENN(E2="";;E2-D2)+WENN(G2="";;G2-F2)+WENN(I2="";;I2-H2))=0;"";(WENN(C2="";;C2-B2)+WENN(E2="";;E2-D2)+WENN(G2="";;G2-F2)+WENN(I2="";;I2-H2)))

Wenn du nicht (wie ich trotzdem empfehlen würde) mit Hilfsspalten
arbeiten möchtest, würde ich noch eine Änderung vorschlagen. Ich gehe
dabei davon aus, dass die Zeitperioden von vorne aufgefüllt werden, d.
h. es kommt nicht vor, dass C/B und F/G ausgefüllt werden, aber D/E frei
bleibt. In dem Fall kannst du die Berechnung abbrechen, sobald du auf
ein 'offenes' Paar stößt; dahinter kann dann ja nix mehr kommen. Wenn in
C2 nix drin steht (C2=""), brauchst du E2 usw erst gar nicht mehr
abfragen; sondern nur, wenn C2 ausgefüllt ist (Else-Zweig):

=WENN(C2="";"";C2-B2+WENN(E2="";;E2-D2+WENN(G2="";;G2-F2+WENN(...;;""))))

                          ^^ ^^ ^^ ^^^^^^
Macht IMHO die Formel etwas (wenn auch nicht viel) lesbarer.

Wolf 'btw. füg ich nach jedem ";" und auch sonst gerne ein Leerzeichen
ein, auch wenn Calc das immer wieder rückgängig zu machen versucht; auch
solche Strukturbildner machen eine Formel IMHO deutlich lesbarer für
Menschen' gang

Überstunden, Fipptehler, ...; und außerdem besteht grundsätzlich die
Gefahr, dass sich mal unabsichtlich ein Datumsanteil einschleicht. All
diese Fälle können durch dieses Format leichter entdeckt werden. Und
schaden tut es nicht; ist also eine klassische win-win-Situation.

Zeitperioden sollte man aus all diesen Gründen grundsätzlich immer als
*Periode* formatieren (aka mit "[]"), und nicht als Zeit*punkt*. Sollte
man sich gleich von Anfang an angewöhnen, dann ist es am einfachsten.

Wolf '/Du/ unterscheidest ja schließlich /auch/ ganz klar zwischen "zwei
Uhr" und "zwei Stunden", oder? ;-)' gang

Wolfgang Jäth schrieb:

Und ich würde die Tabelle
an Zelle B2 fixieren ("Fenster => Fixieren").

Und ich würde trotz allem die Zellen in Spalte J mit

[H]" h "M" min"

formatieren; nur für den Fall, dass der Wert mal > 24:00 wird.

Das kann nicht passieren, weil es ja um die Zeiten des einzelnen Tages
geht.

Überstunden, Fipptehler, ...; und außerdem besteht grundsätzlich die
Gefahr, dass sich mal unabsichtlich ein Datumsanteil einschleicht. All
diese Fälle können durch dieses Format leichter entdeckt werden. Und
schaden tut es nicht; ist also eine klassische win-win-Situation.

OK, werde ich beherzigen.

Zeitperioden sollte man aus all diesen Gründen grundsätzlich immer als
*Periode* formatieren (aka mit "[]"), und nicht als Zeit*punkt*. Sollte
man sich gleich von Anfang an angewöhnen, dann ist es am einfachsten.

Wolf '/Du/ unterscheidest ja schließlich /auch/ ganz klar zwischen "zwei
Uhr" und "zwei Stunden", oder? ;-)' gang

Mich wunderte immer, dass Calc/Tabellenkalkulationen nicht zwischen
/Werten/ für Zeitdauer und Zeitpunkt unterscheiden.

Das wird doch intern als serielle Zahl dargestellt.

Bei einer Eingabe von "xx:xx" muss man einen willkürlich hinzugefügten
Datumsteil akzeptieren.

Und ein Standardformat für Zeitdauer wie das hier besprochene
[H]" h "M" min"
fehlt.

Hat sowas historische Gründe?

Andreas

Zeitperioden sollte man aus all diesen Gründen grundsätzlich immer als
*Periode* formatieren (aka mit "[]"), und nicht als Zeit*punkt*. Sollte
man sich gleich von Anfang an angewöhnen, dann ist es am einfachsten.

Wolf '/Du/ unterscheidest ja schließlich /auch/ ganz klar zwischen "zwei
Uhr" und "zwei Stunden", oder? ;-)' gang

Mich wunderte immer, dass Calc/Tabellenkalkulationen nicht zwischen
/Werten/ für Zeitdauer und Zeitpunkt unterscheiden.

Das wird doch intern als serielle Zahl dargestellt.

Ja; intern gibt es nur Text oder Zahl. Alles andere (Datum, Zeit,
Währung, ...) sind nur Formatierungen.

Bei einer Eingabe von "xx:xx" muss man einen willkürlich hinzugefügten
Datumsteil akzeptieren.

Und ein Standardformat für Zeitdauer wie das hier besprochene
[H]" h "M" min"
fehlt.

Meinst du das "[HH]" (gips durchaus, schau mal genau nach; IIRC drittes
von unten oder so), oder das "x h y min" (ist jetzt nicht wirklich sooo
gebräuchlich)?

Wolfgang

Wolfgang Jäth schrieb:

Aktuell ist:
https://www.dropbox.com/s/kr15l3pod3p1m06/test-lo-calc-arbeitszeiten.ods

=WENN((WENN(C2="";;C2-B2)+WENN(E2="";;E2-D2)+WENN(G2="";;G2-F2)+WENN(I2="";;I2-H2))=0;"";(WENN(C2="";;C2-B2)+WENN(E2="";;E2-D2)+WENN(G2="";;G2-F2)+WENN(I2="";;I2-H2)))

Wenn du nicht (wie ich trotzdem empfehlen würde) mit Hilfsspalten
arbeiten möchtest, würde ich noch eine Änderung vorschlagen. Ich gehe
dabei davon aus, dass die Zeitperioden von vorne aufgefüllt werden, d.
h. es kommt nicht vor, dass C/B und F/G ausgefüllt werden, aber D/E frei
bleibt.

Richtig.

In dem Fall kannst du die Berechnung abbrechen, sobald du auf
ein 'offenes' Paar stößt; dahinter kann dann ja nix mehr kommen. Wenn in
C2 nix drin steht (C2=""), brauchst du E2 usw erst gar nicht mehr
abfragen; sondern nur, wenn C2 ausgefüllt ist (Else-Zweig):

=WENN(C2="";"";C2-B2+WENN(E2="";;E2-D2+WENN(G2="";;G2-F2+WENN(...;;""))))

                          ^^ ^^ ^^ ^^^^^^
Macht IMHO die Formel etwas (wenn auch nicht viel) lesbarer.

Yep, ist etwas besser lesbar, Danke.

Andreas

Wolfgang Jäth schrieb:

Wolf '/Du/ unterscheidest ja schließlich /auch/ ganz klar zwischen "zwei
Uhr" und "zwei Stunden", oder? ;-)' gang

Mich wunderte immer, dass Calc/Tabellenkalkulationen nicht zwischen
/Werten/ für Zeitdauer und Zeitpunkt unterscheiden.

Das wird doch intern als serielle Zahl dargestellt.

Ja; intern gibt es nur Text oder Zahl. Alles andere (Datum, Zeit,
Währung, ...) sind nur Formatierungen.

Bei einer Eingabe von "xx:xx" muss man einen willkürlich hinzugefügten
Datumsteil akzeptieren.

Leuchtet Dir ein, warum in Tabellenkalkulation dieser Mauschel-Weg
beschritten wurde.
Es ist ja im engen Sinne eine Verfälschung des originalen Wertes.

Und ein Standardformat für Zeitdauer wie das hier besprochene
[H]" h "M" min"
fehlt.

Meinst du das "[HH]" (gips durchaus, schau mal genau nach; IIRC drittes
von unten oder so), oder das "x h y min" (ist jetzt nicht wirklich sooo
gebräuchlich)?

Du hast Recht (wie immer :slight_smile:

Gab es bei Zeitdauer nicht noch Widrigkeiten bei bestimmten Grenzen zu
beachten, wenn man auch Tage dazunimmt?

Ich muss mir nochmal einen Artikel suchen, der das Thema
Zeitdauer/Zeitpunkt ausführlich inklusive der seriellen Zahlen
aufbereitet.

Andreas

Bei einer Eingabe von "xx:xx" muss man einen willkürlich hinzugefügten
Datumsteil akzeptieren.

Leuchtet Dir ein, warum in Tabellenkalkulation dieser Mauschel-Weg
beschritten wurde.
Es ist ja im engen Sinne eine Verfälschung des originalen Wertes.

Jein; es ist eine Annahme, was 'der User' (aka mehrheitlich) vermutlich
meint. Ob es Sinn macht (in vielen ja, in anderen nicht) ist wohl eher
eine Glaubenssache.

Gab es bei Zeitdauer nicht noch Widrigkeiten bei bestimmten Grenzen zu
beachten, wenn man auch Tage dazunimmt?

Ich weiß nicht genau, was du mit "Tage dazunehmen" meinst; du kannst die
eckigen Klammern AFAIK nur auf auf die höchste im Format dargestellte
/Zeit/einheit anwenden, also "[H]:m:S,00" oder "[M]:S,00" oder "[S],00"
o. ä.; ein "[H]:[M]" o.ä. würde auch gar keinen Sinn machen. Eine
Kombination mit Tagen, also z. B. für "75 Tage, 32 Stunden und 47
Minuten", ist AFAIK nicht möglich. Zumindest nicht so (man kann das
natürlich als String ausgeben, und dabei die entsprechenden Teilwerte
einbinden; aber das ist dann halt keine Zahl mehr, sondern ein String).

Ich muss mir nochmal einen Artikel suchen, der das Thema
Zeitdauer/Zeitpunkt ausführlich inklusive der seriellen Zahlen
aufbereitet.

Intern sind das alles nur attributfreie Zahlen aka Werte. Die Zuweisung
einer *Bedeutung* zu einem Wert (d. h. ob Zeitpunkt oder -periode, oder
Datum, Temperatur, Währung, usw.), spielt sich ausschließlich im Kopf
des User ab. Die Formatierung der Zelle aka Darstellung des Wertes
unterstützt das lediglich.

Wolfgang