23.07.2019, 12:36 (Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2019, 12:37 von Natuuus.)
Hallo, Ich muss Messdaten asuwerten und einen Zeitanteil berechnen. Dabei interessieren mich allerdings nur Zeiträume länger als 15 Minuten und kürzer als 60 Minuten. Alle Zeiträume die in Frage kommen haben einen Grenzwert, der mit einer =Wenn() Funktion als 1 in eine weitere Spalte ausgegeben werden. Wenn 15 "Einsen" hintereinander kommen, dann ist der Zeitraum relevant, wenn mehr als 60 "Einsen" kommen, dann fällt der Zeitraum wieder raus. Bisher habe ich das in der nächsten Zeile mit der folgenden Wenn Funktion gemacht.
So wird jeder Fall abgedeckt und es wird eine "Eins" in der nächsten Zeile ausgegeben wenn 15 nacheinander zutreffen. Die "Einsen" zähle ich am Ende einfach nur zusammen und habe meinen Anteil. Bei 15 Zeilen geht das auch noch, aber bei 60 wird das ein wenig aufwendig, jeden Fall abzudecken. Gibt es da eine einfachere Variante?
ps. Über die Aggregat-Funktionen werden die erste Zeile hinter der aktuellen Zeile und die letzte Zeile vor der aktuellen Zeile gesucht, die keine 1 enthalten.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
24.07.2019, 21:02 (Dieser Beitrag wurde zuletzt bearbeitet: 24.07.2019, 21:02 von Ego.)
Hallo Natuuus,
hier die Formel einmal von Innen nach Aussen erklärt:
A1 = "ZEILE(A3:$A$329)" Das ist eine Liste von Zeilennummern nach der aktuellen Zeile.
B1 = "(A3:$A$329<>1)" Das ist eine Liste von Wahrheitswerten für die obigen Zeilen, die ein WAHR haben, wenn der Wert der Zeile keine 1 ist, ansonsten ein FALSCH.
C1 = "A1/B1" Vor der Division werden Wahrheitswerte von B1 in 1en (für WAHR) und 0en (für FALSCH) ungewandelt. Nach der Division habe ich also eine Liste die die Zeilennummer beibehält, wenn der Eintrag keine 1 und ist einen Fehlerwert (Division durch 0) wenn der Eintrag eine 1 ist.
D1 = "AGGREGAT(15;6;C1;1)" mit dieser Aggregatfunktion erhalte ich den kleinsten Wert der Liste, der kein Fehlerwert ist. Ich erhalte also die Zeilennummer der ersten Zeile nach der aktuellen Zeile die keine 1 enthält.
A2 = "ZEILE($A$1:A1)" Das ist eine Liste von Zeilennummern vor der aktuellen Zeile.
B2 = "($A$1:A1<>1)" Das ist eine Liste von Wahrheitswerten für die obigen Zeilen, die ein WAHR haben, wenn der Wert der Zeile keine 1 ist, ansonsten ein FALSCH.
C2 = "A2/B2" Vor der Division werden Wahrheitswerte von B2 in 1en (für WAHR) und 0en (für FALSCH) ungewandelt. Nach der Division habe ich also eine Liste die die Zeilennummer beibehält, wenn der Eintrag keine 1 und ist einen Fehlerwert (Division durch 0) wenn der Eintrag eine 1 ist.
D2 = "AGGREGAT(14;6;C2;1)" mit dieser Aggregatfunktion erhalte ich den grösten Wert der Liste, der kein Fehlerwert ist. Ich erhalte also die Zeilennummer der letzten Zeile vor der aktuellen Zeile die keine 1 enthält.
E = D1-D2 - 1 Die Differenz zwischen der ersten Zeilennummer ohne 1 hinter der aktuellen Zeile und der letzten Zeilennummer ohne 1 vor der aktuellen Zeile minus eins, ist die Anzahl der zusammenhängenden 1en, wenn die aktuelle Zeile auch eine 1 enthält.
F =WENNFEHLER(UND(A2=1;E>= 15;E<=60);1;0)
Wenn die aktuelle Zeile eine 1 enthält und die Anzahl der zusammenhängenden Zeilen mit 1en zwischen 15 und 60 ist, wird eine 1 eingetragen.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.