Einen Teil eines Rechenblattes nach einer bestimmten Bedingung extrahieren #2

Hallo zusammen,
Im Beitrag des RagTime-Forums : http://experts.ragtime.de/experts/node/4200 wurde diskutiert, wie man einen Teil eines Rechenblattes (R1) nach einer bestimmten Bedingung extrahiert und das Ergebnis nach Rechenblatt R2 exportiert. Die Ausgangslage war diese :

R1 (vorh. Datentabelle):

r_R_rr_x
s_S_ss
t_T_tt
u_U_uu_x

Das Suchkriterium bezog sich dabei auf eine Bedingung "x", die immer nur in EINER Spalte des Suchbereichs auftaucht. Thomas Kaegi hat dazu eine Formel erstellt, die das gewünschte Ergebnis in R2 liefert.

R2 (Ergebnistabelle):

r_R_rr
u_U_uu

Ich habe mich daraufhin gefragt, wie eine Formel aussehen könnte, die weiterreichende Bedingungen erfüllen muss. Die weiterreichenden Bedingungen hier lauten so:
-> Von R1 nach R2 nur die Zellen der Zeilen übertragen, in denen "x" (an beliebiger Stelle) in der Zeile vorhanden ist UND unabhängig davon, ob in dieser Zeile eine oder mehrere Zellen leer sind.
Ausgangstabelle in R1 und Ergebnistabelle in R2 würden dann so aussehen (Ø steht für eine leere Zelle) :

R1 (vorh. Datentabelle):

r_x_R_rr
Ø_s_S_ss
t_T_tt_Ø
x_Ø_U_uu
Ø_Ø_x_zz

R2 (Ergebnistabelle):

r_R_rr
U_uu
zz

Die Bearbeitung hat mich dazu geführt, im Inventar die zusätzliche Komponente (Rechenblatt R3) anzulegen, die als reine Hilfstabelle fungiert und nicht geöffnet werden muss, da dort nur Daten für den Umwandlungsprozess abgelegt werden, die mit jeder neuen Berechnung (Befehl: Alles rechnen) wieder gelöscht werden.
Die Formelkonstruktion erscheint etwas umständlich, aber sie funktioniert (zur besseren Lesbarkeit sind hier nach jedem Formelteil Zeilenumbrüche eingefügt):

Suchlauf(R2!A1:D5;1;0;SetzeZelle('';R2!A1:D5;LfdIndex))
&
VSuchlauf(A:D;Oder(Spaltenwert(1)='x';Spaltenwert(2)='x';Spaltenwert(3)='x';Spaltenwert(4)='x');0;
SetzeZelle(Spaltenwert(1);R3!A:A;LfdZähler)&
SetzeZelle(Spaltenwert(2);R3!B:B;LfdZähler)&
SetzeZelle(Spaltenwert(3);R3!C:C;LfdZähler)&
SetzeZelle(Spaltenwert(4);R3!D:D;LfdZähler))
&
HSuchlauf(R3!1:1;Und(LfdZelle≠'';LfdZelle≠'x');;SetzeZelle(LfdZelle;R2!1:1;LfdZähler))&
HSuchlauf(R3!2:2;Und(LfdZelle≠'';LfdZelle≠'x');;SetzeZelle(LfdZelle;R2!2:2;LfdZähler))&
HSuchlauf(R3!3:3;Und(LfdZelle≠'';LfdZelle≠'x');;SetzeZelle(LfdZelle;R2!3:3;LfdZähler))&
HSuchlauf(R3!4:4;Und(LfdZelle≠'';LfdZelle≠'x');;SetzeZelle(LfdZelle;R2!4:4;LfdZähler))&
HSuchlauf(R3!5:5;Und(LfdZelle≠'';LfdZelle≠'x');;SetzeZelle(LfdZelle;R2!5:5;LfdZähler))
&
Suchlauf(R3!A:D;1;0;SetzeZelle('';R3!A:D;LfdIndex))

Erläuterung :
- Bei erneuter Berechnung löscht der erste Suchlauf den Zielbereich in R2.
- VSuchlauf durchläuft den gesamten Ausgangsbereich und setzt alle Zeilen, in denen "x" vorhanden ist in die Hilfstabelle R3.
- Die HSuchläufe suchen in R3 die jeweilige Zeile ab, filtern die leeren Zellen sowie "x" aus und setzen die verbleibenden Zellen zeilenweise in den Zielbereich R2
- Der abschließende Suchlauf löscht die Hilfstabelle in R3 für die nächste Berechnung.

Auch, wenn diese Formelkonstruktion funktioniert, sie kann dennoch nicht die Lösung sein ... Denn für jede zusätzliche Zeile im Suchbereich müsste ein weiterer HSuchlauf in der Formel ergänzt werden. Die Frage lautet also:
Wer hat einen Vorschlag, wie die Lösung mit den HSuchläufen universell umgesetzt werden kann?

Falls meine Annahme der Grundkonstruktion von vorneherein nicht der richtige Weg sein sollte, wäre die Frage:
Wie müsste die Formel für die oben genannten Bedingungen konstruiert sein?

Beste Grüße,
Michael

Re: Einen Teil eines Rechenblattes nach einer bestimmten Bedingu

#13846 On 20 November, 2024 12:23 Thomas Kaegi said,

Hallo Michael

Eine Lösung für das von dir gestellte Problem habe ich auf die Expertenseiten gestellt:
http://experts.ragtime.de/experts/node/4207

Allerdings habe ich dabei einen Aspekt weggelassen: Beim Vergleich mit “x“ ignoriert RagTime, ob das “X“ gross oder klein geschrieben wird. Die Formel in Zelle R Formeln!A3 meiner Lösung ist eh schon kompliziert genug.

Will man bei einem solchen Vergleich sichergehen, dass wirklich nur Zellen mit “x“ gefunden werden, müsste die Bedingung nicht
Vergleichswert='x'
lauten, sondern
Und(Code(Vergleichswert)=Code('x');Länge(Vergleichswert)=1).
Nur so würde sichergestellt, dass die Suchbedingung nicht mit "X“ oder einem mit x beginnenden String, z.B. "xp5“, erfüllt wird.

Wie du selbst feststellst: … für jede zusätzliche Zeile im Suchbereich müsste ein weiterer HSuchlauf in der Formel ergänzt werden. Analog müsste bei mehr Spalten das „Paket" mit den SetzeZelle-Befehlen mit weiteren solchen Befehlen ergänzt werden. Du hast nach einer Lösung gesucht, wie das eleganter gemacht werden kann.

In meinem Vorschlag habe ich das Problem mittels verschachtelter Suchläufe zwar eleganter gelöst. Die entscheidende Formel ist aber sehr komplex und deshalb ziemlich schwer nachvollziehbar, wogegen dein Vorschlag sehr gut verständlich ist. Mein Vorschlag ist jedoch ein gutes Beispiel für die Anwendung verschachtelter Suchläufe.

Freundliche Grüsse, Thomas

Re: Einen Teil eines Rechenblattes nach einer bestimmten Bedingu

#13847 On 20 November, 2024 13:52 Michael Vaerst said,

Hallo Thomas,

ja, eine endlos lang werdende Formel war die Schwäche bei meinem Versuch, die Aufgabenstellung zu lösen. Mein Ansatz wäre also sehr "umständlich", wenn die zu durchsuchende Tabelle größer wird. Vielen Dank also für Deine - wie immer - perfekte und kompakte Lösung des Problems. Und Deine hier im Forum unter -> Beispiele (http://experts.ragtime.de/experts/taxonomy_menu/1/1) gepostete Datei ist sehr gut erläutert.

Danke auch für das Aufzeigen der Lösung bzgl. Differenzierung von Groß-/Kleinschreibung - für bestimmte Suchbedingungen ist das ja durchaus sehr relevant. Das Thema ist weitreichender ... Wer Interesse hat, sieht sich diesen Beitrag an:
https://communities.apple.com/de/thread/254905089?sortBy=rank

Beste Grüße, Michael