Komplexe bedingte Summe

Von Jürgen Schell. | 27 Oktober, 2009 - 10:18
Frage:

Ich habe folgende Tabelle:

a164313412231
b42430130350
x170481399485
a2035534064
x26215544281
x158179331475
a89322346253
a474377308479
b7646428459

In dieser Tabelle sollen die Zahlen aus alle Zeilen addiert werden, die mit "x" gekennzeichnet sind.

Falls noch Spalten hinzukommen, soll die Formel einfach anpassbar sein.

Antwort:

In einer kleinen E-Mail-Diskussion tauchte diese Aufgabenstellung auf: Es gibt eine Tabelle, in der in der Spalte A Buchstabenmarkierungen stehen, in den Spalten B bis E stehen Zahlenwerte. Gesucht ist eine einigermaßen einfache Formel, die alle mit »x« gekennzeichneten Zeilen addiert:

Die einfachste Formel, auf die wir gekommen sind, lautet:

VSuchlauf(A:A;LfdZelle='x';0;LfdResultat+HSuchlauf(B:E;1;0;LfdResultat+Zeilenwert(LfdIndex(1))))

Wie alle geschachtelten Suchlauffunktionen ist das vielleicht auf den ersten Blick verblüffend. Suchlauffunktionen von RagTime »klappern« einen Bereich ab – VSuchlauf in vertikaler Richtung, HSuchlauf in horizontaler. In jeder Zeile / Spalte des Bereichs, die dem benutzten Suchkriterium entspricht, führen Sie eine bestimmte Rechenoperation durch.

Betrachten wir zuerst die innere Funktion, HSuchlauf, in vereinfachter Form. Der Ausdruck:

HSuchlauf(B:E;1;0;LfdResultat+Zeilenwert(3))

addiert die dritte Zeile: Horizontal werden die Spalten B bis E durchlaufen (1. Argument). Dabei wird in jeder Spalte (2. Argument ist 1 oder wahr) eine Berechnung durchgeführt. Die Berechnung wird mit 0 begonnen (3. Argument). Im 4. Argument wird jedes Mal zu dem bisherigen Zwischenresultat (LfdResultat) der aktuelle Wert der dritten Zeile (Zeilenwert(3)) hinzu addiert. Das letzte Ergebnis wird abgeliefert. Und das ist die Summe der dritten Zeile. Ändert man die Formel in

HSuchlauf(B:E;1;0;LfdResultat+Zeilenwert(4))

(also anderes Zeilenwert-Argument), addiert die Formel die vierte Zeile.

Um alle mit x markierten Zeilen zu addieren, wird zuerst eine äußere Suchlauffunktion aufgebaut. »VSuchlauf« durchläuft die Spalte A (1. Argument). Als Kriterium wird überprüft, ob die aktuelle Zelle gerade den Wert »x« enthält (2. Argument, »LfdZelle = 'x'«). Wieder beginnt die Berechnung mit 0 (3. Argument). Immer, wenn das Kriterium zutrifft, wird das 4. Argument gerechnet: Zum aktuellen Zwischenergebnis wird das Ergebnis einer HSuchlauf-Operation addiert. Sie addiert je eine Zeile.

Der Trick ist nun, dass hier nicht eine konstante Zeilennummer wie 3 oder 4 steht, sondern dass mit »LfdIndex(1)« die Zeilennummer benutzt wird, die die äußere Funktion, VSuchlauf, gerade bearbeitet. Sind mehrere Suchlauffunktionen ineinander geschachtelt, liefert »LfdIndex« die Nummer der Zeile / Spalte der Suchlauffunktion, in der »LfdIndex« benutzt wird (also die innerste).

(»LfdIndex(0)« bedeutet dasselbe.) »LfdIndex(1)« dagegen liefert den Index der nächsten Suchlauffunktion, weiter außen. Der Ausdruck »LfdIndex(1)« befindet sich in der HSuchlauf-Funktion. Das Argument 1 bewirkt, dass aber nicht der Index dieser Funktion genommen wird, sondern der der weiter außen liegenden VSuchlauf-Funktion. Wären drei Suchlauffunktionen ineinander geschachtelt, könnte man auch noch »LfdIndex(2)« benutzten.

Ein RagTime-Dokument mit der Beschreibung und einer Beispieltabelle ist angehängt.

Anhang Größe
komlexe_bedingte_summe.rtd 70.53 KB