VSuchlauf mit StopBedingung nach unten wie nach oben ?

Hallo Liste,

Betrifft : VSuchlauf

Ich möchte eine Anfahrt- und eine StopBedingung, also nach oben wie nach unten, benutzen : die Bedingung : nur die aneinanderliegenden Zellen mit einer Zahl müssen gerechnet werden (z.B die Summe).

Siehe bitte lieber hier :

http://experts.ragtime.de/experts/files/VSuchlauf.jpg

Gruß
jacques

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10660 On 31 Mai, 2012 17:01 Jürgen Schell said,

Hallo Jacques,

ich bin nicht sicher, ob der Ansatz Dich weiter bringt:

http://experts.ragtime.de/experts/files/vsuchlauf_gruppen.rtd

Die Formeln in Spalte D ab D2 addieren die Werte aus Spalte B von der ersten Zelle bis zu der in derselben Zeile. Immer, wenn eine Zelle ohne Zahl in B auftritt, wird das Ergebnis auf 0 zurückgesetzt. Damit steht am Ende jeder Gruppe die Summe für die ganze Gruppe.

Gruß,

Jürgen

www.j-schell.de

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10661 On 31 Mai, 2012 16:36 Jacques Villars said,
Hallo Jürgen,
vielleich, daß es mir nützlich ist, aber mit deinem Link bekomme ich : Seite nicht gefunden
danke indessen
Gruß
jacques

Le 31 mai 2012 à 18:06, Jürgen Schell a écrit :

ich bin nicht sicher, ob der Ansatz Dich weiter bringt:

http://experts.ragtime.de/experts/files/vsuchlauf_gruppen.rtd


Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10662 On 31 Mai, 2012 17:56 Thomas Kaegi said,

Hallo Jacques

Für genau das von dir illustrierte Problem geben die beiden folgenden Formeln das korrekte Resultat:

VSuchlauf(B1:B9;Und(LfdZelle;Oder(Index(B2:B10;LfdIndex);Wenn(LfdIndex>1;Index(B1:B9;LfdIndex-1))));0;LfdResultat+LfdZelle)

VSuchlauf(B11:B17;Und(LfdZelle;Oder(Index(B12:B18;LfdIndex);LfdIndex>1;Index(B10:B16;LfdIndex)));0;LfdResultat+LfdZelle)

Was die Formeln genau machen: Sie schauen die LfdZelle des Suchlaufs an. Falls diese Zelle eine Zahl enthält UND gleichzeitig entweder die davor ODER danach folgende Zelle auch eine Zahl enthält, dann wird der Inhalt der LfdZelle zum LfdResultat addiert.

Stolpersteine:

1. Im ersten Fall muss für die erste LfdZelle die Beurteilung der vorangehenden Zelle entfallen, da sie den Index 0 hätte und der Vergleich somit zu einem REF-Fehler führen würde. Das wird mit der Wenn-Klausel unterdrückt. Zudem wird vorausgesetzt, dass die auf den abgesuchten Bereich folgende Zelle keine Zahl enthält. Ist diese Voraussetzung nicht gegeben, müsste eine analoge Wenn-Verriegelung für das Tabellenende eingebaut werden, da sonst ggf. die Zahl in B9 addiert würde, selbst wenn Zelle B8 leer wäre.

2. Analog gilt für den zweiten Fall, dass weder die Zelle vor dem abgesuchten Bereich, noch die Zelle nach diesem Bereich einen Wert enthalten darf, der logisch "wahr" ist.

Gruss, Thomas

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10663 On 31 Mai, 2012 18:57 Thomas Kaegi said,

Korrekturen/Ergänzungen zu meiner vorherigen Antwort:

Korrektur der zweiten Formel, die in der Oder-Funktion ein Argument zu viel enthielt:
VSuchlauf(B11:B17;Und(LfdZelle;Oder(Index(B12:B18;LfdIndex);Index(B10:B16;LfdIndex)));0;LfdResultat+LfdZelle)

Ergänzung zu den angeführten "Stolpersteinen". Die Zellen vor und nach dem abgesuchten Bereich dürfen auch keinen Inhalt haben, der bei der Prüfung auf "wahr/falsch" einen Fehler ergibt, also z.B. Text. Um dieses Problem zu vermeiden, könnte der Zelleninhalt auch mit "IstZahl" geprüft werden, also die zweite Formel:

VSuchlauf(B11:B17;Und(LfdZelle;Oder(IstZahl(Index(B12:B18;LfdIndex));IstZahl(Index(B10:B16;LfdIndex))));0;LfdResultat+LfdZelle)

Gruss, T

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10664 On 31 Mai, 2012 18:45 Jacques Villars said,
Danke Thomas,

Was noch fehlt in deiner Lösung : die Formel muss automatisch die Gruppen von Zahlen erkennen, egal, wie gross diese Gruppen sind, also ohne, dass ich selbst die Bereiche definiere.

Vielleicht hilft dafür die Lösung von Jürgen, aber ich kenne diese nicht… sie ist in den ExpertsSeiten nicht erreichbar.

Grüsse
jacques

Le 31 mai 2012 à 20:01, Thomas Kaegi a écrit :


Ergänzung zu den angeführten "Stolpersteinen". Die Zellen vor und nach dem abgesuchten Bereich dürfen auch keinen Inhalt haben, der bei der Prüfung auf "wahr/falsch" einen Fehler ergibt, also z.B. Text. Um dieses Problem zu vermeiden, könnte der Zelleninhalt auch mit "IstZahl" geprüft werden, also die zweite Formel:

VSuchlauf(B11:B17;Und(LfdZelle;Oder(IstZahl(Index(B12:B18;LfdIndex));IstZahl(Index(B10:B16;LfdIndex))));0;LfdResultat+LfdZelle)


Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10665 On 31 Mai, 2012 20:51 Thomas Kaegi said,

Hallo Jacques

Die von Jürgen angegebene Referenz führt auch bei mir zu einer Fehlermeldung.

Ich hoffe, ich habe diesmal dein Problem richtig verstanden. Folgende Formel liefert das gewünscht Ergebnis:

VSuchlauf(B:B;1;0;wenn(LfdZelle;Wenn(Oder(Und(LfdIndex>1;Index(B:B;LfdIndex-1));Index(B:B;LfdIndex+1));LfdResultat+LfdZelle);Wenn(LfdResultat;SetzeZelle(LfdResultat;A:A;LfdIndex)-LfdResultat)))

Hier die Schritte im Einzelnen:

VSuchlauf(B:B;1;0;
Der Suchlauf läuft über die ganze Spalte B - jede Zelle wird bedingungslos angeschaut. Der Startwert für LfdResultat ist 0.

Wenn(LfdZelle;
Abhängig davon, ob in der LfdZelle eine Zahl ist oder nicht, wird eine der beiden folgenden Operationen ausgeführt:

Wenn in der laufenden Zelle ein Zahl ist, dann wird die ggf. die Gruppensumme berechnet:
Wenn(Oder(Und(LfdIndex>1;Index(B:B;LfdIndex-1));Index(B:B;LfdIndex+1));LfdResultat+LfdZelle)
Falls in der vorangehenden Zelle (die Zelle mit Index 0 wird wegen des möglichen REF-Fehlers durch die Klausel "LfdIndex>1" ausgeschlossen) oder in der folgenden Zelle eine Zahl ist, so wird der Wert der laufenden Zelle zum LfdResultat addiert.

Ist dagegen die LfdZelle leer, so kommt dieser Teil der Formel zum Zug:
Wenn(LfdResultat;SetzeZelle(LfdResultat;A:A;LfdIndex)-LfdResultat)))
Falls das LfdResultat>0 ist, so wird die Summe der abgeschlossenen Gruppe in die Zelle in Spalte A geschrieben. Damit das LfdResultat wieder auf 0 zurückgesetzt wird, muss der aktuelle Wert von LfdResultat nach der SetzeZelle-Operation, welche ja den Wert von LfdResultat zuweist, von sich selbst abgezogen werden.

Folgende Bedingungen müssen erfüllt sein, damit die Lösung funktioniert:
- die Spalte B darf nur leere Zellen und positive Zahlen enthalten
- die Zelle B16000 darf keine Zahl enthalten

Hoffentlich ist das jetzt, was du gesucht hast.
Gruss, Thomas

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10667 On 31 Mai, 2012 22:10 Jacques Villars said,
Hallo Thomas
Danke schön für deine Lösung!

was noch nicht funktioniert :

0 soll auch wie eine positive Zahl in einer Gruppe mitberechnet werden, also auch "addiert" werden, ohne die SetzeZelle Funktion auszulösen

die Formel sollte auch funktionieren, wenn eine Gruppe nur eine einzige Zahl enthält

Gruss
jacques




Le 31 mai 2012 à 21:56, Thomas Kaegi a écrit :


Folgende Bedingungen müssen erfüllt sein, damit die Lösung funktioniert:
- die Spalte B darf nur leere Zellen und positive Zahlen enthalten

0 sollte wie eine positive Zahl betrachtet werden ; mit 0.000001 statt 0 würde die Formel gar funktionieren, aber dieser Trick wäre unelegant…


- die Zelle B16000 darf keine Zahl enthalten



hier gibt es kein Risiko ;-)

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10668 On 1 Juni, 2012 07:55 Thomas Kaegi said,

Hallo Jacques

Jetzt versteh ich dein Problem nicht mehr. In deiner Illustration war in Zelle B1 eine Zahl, aber Zelle A2 war leer. Jetzt sagst du, dass eine Gruppe auch aus nur einer einzigen Zahl bestehen könne - also müsste Zelle A2 in deinem illustrierten Beispiel doch die Gruppensumme dieser ersten Gruppe, also den Wert 1 enthalten. Ausserdem hast du in deiner ursprünglichen Frage ausdrücklich gesagt: "nur die aneinanderliegenden Zellen mit einer Zahl müssen gerechnet werden". Diese Formulierung setzt voraus, dass mindestens zwei Zahlen aufeinanderfolgen. Was gilt jetzt? "Eine Gruppe kann auch nur aus einer einzigen Zahl bestehen", oder eben "nur die aneinanderliegenden Zellen mit einer Zahl müssen gerechnet werden"?

An und für sich ist es kein Problem, die Formel so abzuändern, dass leere Zellen und Zellen, welche die Zahl "0" enthalten unterschieden werden. Statt sich auf den logischen Wert einer Zahl≠0 zu verlassen, muss mit der Funktion "IstZahl" gearbeitet werden. Trotzdem gibt es ein Problem, das weniger leicht zu lösen ist: Um festzustellen, dass das Ende einer Gruppe erreicht ist, habe ich geprüft, ob das LfdResultat >0 ist. Wahrscheinlich muss, da eine "Gruppensumme" auch "0" sein kann, eine Hilfszelle verwendet werden. Aber das werde ich mir erst anschauen, wenn du den obigen Widerspruch geklärt hast.

Gruss, Thomas

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10669 On 1 Juni, 2012 08:52 jacques villars said,

Hallo Thomas,

Ich feststelle, dass meine Beschreibung leider nicht klar genug war, Entschuldigung!

also, in einer Spalte hat man :

/ 1 / nichts / 1 / : da sind zwei Gruppen, weil diese Zahlen nicht nebeneinander liegen; so erwartet man zwei Summen : 1 und 1

/ 1 / 1 /: das ist eine einzige Gruppe, die Summe ist 2

(die erste Zahl im Beispiel hatte ich vergessen…)

nochmals vielendank für deine Hilfe

Grüsse,
jacques

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10670 On 1 Juni, 2012 10:55 Thomas Kaegi said,

Hallo Jacques

Die Formel wird so viel einfacher - wenn ich es jetzt richtig verstanden habe. Verantwortlich dafür ist vor allem der Wegfall der Bedingung, dass eine Gruppe aus mindestens zwei Zahlen bestehen muss. Hier erst mal die Formel:

VSuchlauf(B:B;1;"";Wenn(IstZahl(LfdZelle);LfdResultat+LfdZelle;Wenn(SetzeZelle(LfdResultat;A:A;LfdIndex)≠"";"")))
(Für RagTime in der DE-Version natürlich einfache statt der doppelten Anführungszeichen!)

Auch hier werden im Suchlauf bedingungslos alle Zellen angeschaut. LfdResulat wird auf "leer" initialisiert. Steht in LfdZelle eine Zahl (auch 0), so wird sie zum LfdResultat addiert, welches dadurch von "leer" auf "Typ=Zahl" wechselt.

Stösst der Suchlauf auf eine Zelle, die keine Zahl enthält, so wird die Wenn-Funktion ausgeführt, die einen speziellen Trick enthält: In der Bedingung steht nämlich eine SetzeZelle-Funktion. Das mutet recht eigenartig an, macht aber Sinn! Einerseits wird dadurch das LfdResultat in Spalte A übertragen (was keinen Schaden anrichtet wenn das LfdResultat immer noch = "" (leer) ist , andernfalls aber die Gruppensumme in Spalte A einsetzt. Anderseits wird dadurch das LfdResultat nicht verändert, wie dies der Fall wäre, wenn die SetzeZelle-Funktion nicht in der Bedingung, sondern in einem der folgenden Funktionsargumente stehen würde. Die SetzeZelle-Funktion hat als Resultat den eingesetzten Wert, also den Wert von LfdResultat, welcher ja nicht "leer" ist, wenn die Gruppensumme eingesetzt wurde. Mit dem "WertFallsWahr" der Wenn-Funktion wird das LfdResultat wieder auf "leer" gesetzt und die Suche kann mit der nächsten Zelle weitergehen.

Haben wir's jetzt geschafft?

Gruss, Thomas

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10671 On 1 Juni, 2012 11:48 jacques villars said,

Hallo Thomas,

Schöne Lösung, auch leichter zu verfolgen und zu verstehen!

Und es funktioniert! (hat mal jemand in einem Buch über RagTime6 geschrieben ;-)

Herzliche Grüsse

jacques

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10675 On 1 Juni, 2012 16:00 jacques villars said,

Thomas,
Den Trick mit "SetzeZelle" in der Bedingung könnte nur ein Virtuose erfinden… es wäre gut, wenn man deine Originallösung in den Anleitungen-Seiten wiederfinden könnte, oder ?
Tschüss,
jacques

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10676 On 3 Juni, 2012 11:59 Thomas Kaegi said,

Hallo Jacques

Ich habe deine Anregung befolgt, das Beispiel noch etwas allgemeiner gemacht und als Expertenbeitrag unter "Beispiele" und "Anleitungen" publiziert:

http://experts.ragtime.de/experts/node/3453

Gruss, Thomas

Re: VSuchlauf mit StopBedingung nach unten wie nach oben ?

#10678 On 3 Juni, 2012 21:37 jacques villars said,

Hallo Thomas,
Die automatische Löschung der veralteten Zwischensummen ist gerade was mir noch fehlte: genial!
Grüsse,
jacques