von mikeleb » Sa, 19.04.2025 18:47
Hallo,
dann mal folgende Variante (beschränkt auf die ersten 10000 Zeilen der Tabelle 'Input', einzusetzen in die Zelle D6, mit Shift+Strg+Enter abschließen):
Code: Alles auswählen
=WENN(MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000));WENN(INDEX($Input.$B$1:$B$10000;MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000)))<>"Arbeitszeit";INDEX($Input.$C$1:$C$10000;MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000)));"Arbeitszeit");"Arbeitszeit")
Die Formel (entsprechend der Aufgabe) schon hinreichend verzwickt, eine zweifachverschachteltze WENN()-Funktion und dann noch als Matrixfunktion.
Zu einer kurzen Erklärung:
Wenn
MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000))
Dieser Teil liefert zunächst 10000 Werte und zwar immer die Zeilennummern in denen Name und Datum passen, sonst Null, und dann von allen diesen Werten den größten. Wenn es keinen passenden Eintrag gibt dann ist das Ergebnis Null, ansonsten ist es die letzte Zeile in der es einen entsprechenden Eintrag gibt. Diesen Wert benötigen wir dann gleich.
Dann
wird über eine zweite WENN()-Funktion der Text in dieser Zeile ausgewertet - siehe weiter unten.
Sonst
"Arbeitszeit"
sprich, wenn es keinen EIntrag gibt soll "Arbeitszeit" angenommen werden. Logischer wäre für mich allerdings "", dazu müsste aber für jeden Arbeitstag en Eintrag da sein
Nun zur inneren WENN()-Funktion:
Das Ergebnis von MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000)) nenne ich mal: gefundeneZeile
Code: Alles auswählen
WENN(INDEX($Input.$B$1:$B$10000;gefundeneZeile)<>"Arbeitszeit";INDEX($Input.$C$1:$C$10000;gefundeneZeile);"Arbeitszeit")
So ist diese Funktion leichter lesbar:
Wenn
INDEX($Input.$B$1:$B$10000;gefundeneZeile)<>"Arbeitszeit"
Die INDEX()-Funktion wählt aus dem Bereich B1:B1000 die Zeile gemäß gefundeneZeile und prüft ob dort etwas anderes als "Arbeitszeit" steht.
Dann
INDEX($Input.$C$1:$C$10000;gefundeneZeile)
Wählt INDEX()-Funktion wählt aus dem Bereich C1:C1000 den Text aus der Zeile gefundeneZeile.
Sonst
"Arbeitszeit"
Die Formel ist schon so aufwändig, dass es sinnvoll wird, über das Design der Datei nachzudenken, sprich, ob es nicht einen effektiveren Aufbau gibt.
Hallo,
dann mal folgende Variante (beschränkt auf die ersten 10000 Zeilen der Tabelle 'Input', einzusetzen in die Zelle D6, mit Shift+Strg+Enter abschließen):
[code]=WENN(MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000));WENN(INDEX($Input.$B$1:$B$10000;MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000)))<>"Arbeitszeit";INDEX($Input.$C$1:$C$10000;MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000)));"Arbeitszeit");"Arbeitszeit")[/code]
Die Formel (entsprechend der Aufgabe) schon hinreichend verzwickt, eine zweifachverschachteltze WENN()-Funktion und dann noch als Matrixfunktion.
Zu einer kurzen Erklärung:
[b]Wenn[/b]
[color=#0000FF]MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000))[/color]
[i]Dieser Teil liefert zunächst 10000 Werte und zwar immer die Zeilennummern in denen Name und Datum passen, sonst Null, und dann von allen diesen Werten den größten. Wenn es keinen passenden Eintrag gibt dann ist das Ergebnis Null, ansonsten ist es die letzte Zeile in der es einen entsprechenden Eintrag gibt. Diesen Wert benötigen wir dann gleich.[/i]
[b]Dann[/b]
[i]wird über eine zweite WENN()-Funktion der Text in dieser Zeile ausgewertet - siehe weiter unten.[/i]
[b]Sonst[/b]
[color=#0000FF]"Arbeitszeit"[/color]
[i]sprich, wenn es keinen EIntrag gibt soll "Arbeitszeit" angenommen werden. Logischer wäre für mich allerdings "", dazu müsste aber für jeden Arbeitstag en Eintrag da sein[/i]
Nun zur inneren WENN()-Funktion:
Das Ergebnis von MAX(ZEILE($Input.$A$1:$A$10000)*($Input.$A$1:$A$10000=$G$2)*(B6>=$Input.$D$1:$D$10000)*(B6<=$Input.$E$1:$E$10000)) nenne ich mal: gefundeneZeile
[code]WENN(INDEX($Input.$B$1:$B$10000;gefundeneZeile)<>"Arbeitszeit";INDEX($Input.$C$1:$C$10000;gefundeneZeile);"Arbeitszeit")[/code]
So ist diese Funktion leichter lesbar:
[b]Wenn[/b]
[color=#0000FF]INDEX($Input.$B$1:$B$10000;gefundeneZeile)<>"Arbeitszeit"[/color]
[i]Die INDEX()-Funktion wählt aus dem Bereich B1:B1000 die Zeile gemäß gefundeneZeile und prüft ob dort etwas anderes als "Arbeitszeit" steht.[/i]
[b]Dann[/b]
[color=#0000FF]INDEX($Input.$C$1:$C$10000;gefundeneZeile)[/color]
[i]Wählt INDEX()-Funktion wählt aus dem Bereich C1:C1000 den Text aus der Zeile gefundeneZeile.[/i]
[b]Sonst[/b]
[color=#0000FF]"Arbeitszeit"[/color]
Die Formel ist schon so aufwändig, dass es sinnvoll wird, über das Design der Datei nachzudenken, sprich, ob es nicht einen effektiveren Aufbau gibt.