• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Calc: Alternative zu "Wenn-Dann-Sonst"

Blue

Newbie
So eine Tabellenkalkulation ist eine tolle Sache, wenn man denn beim Nutzen selbiger nicht durch mangelnde Kenntnis an deren vermeintliche Grenzen stößt :???:

Ich habe eine Tabelle mit ca. 900 Zeilen, diesen 900 Werten sollen andere Werte zugeordnet werden. Meine Idee dazu war, das Ganze über Wenn-Dann laufen zu lassen, da ich das wahrlich nicht per Hand erledigen wollte. Die zuzuordnenden Werte kommen aus einer weiteren Tabelle, jedoch gibt es dort nur 56 Werte, die Bedingungen für diese stehen in der Zeile nebendran. Das Ergebnis sah dann so aus:

Code:
 WENN($D4<=$J$31;$I$31;WENN($D4<=$J$32;$I$32;WENN($D4<=$J$33;$I$33;[...])))))

So weit, so gut: Leider hat Calc erstmal nur ca. 30 Wenn-Dann Verschachtelungen zugelassen, alles danach würde ignoriert. Beheben konnte ich das dadurch, dass ich zwei Verschachtelungen parallel laufen ließ. Also in der "obersten" Wenn-Dann Formel wurde das Ganze etwa in der Mitte geteilt, alles kleiner 30 wird dann im "Dann-Strang", alles andere im "Wenn-Strang" bearbeitet ...


Code:
 WENN($D4<=$J$30;WENN($D4<=$J$4;$I$4;WENN[...]))))))))))))))))))))))))));WENN($D4<=$J$31;$I$31;WENN[...]))))))))))))))))))))))))))))))


Das war vielleicht nicht elegant, funktionierte aber ;-)

Das gefiel mir so gut, dass ich auf die "blöde" Idee kam, den 900 Werten noch andere Werte zuordnen zu wollen. Wenn das ginge, wäre das ganz hervorragend und würde die manuelle Arbeit von Wochen einsparen ... und hier kommt das Problem:

Die 900 Werte teilen sich in ca. 20 Kategorien, welche sich nun wiederum in zum Teil 30-120 Unterkategorien unterteilen. Die Zuordnung selbst dürfte unproblematisch sein, da die 900 Werte in etwa der Form 2,2; 2,3; [...] 5,23; 5,37; [...] entsprechen. Die Kategorien dann entsprechen der ersten Zahl, die Unterkategorien werden der zweiten Zahl zugeordnet. also: "2 Wert:Unterkategorie"

Sicher wäre auch dies mit Wenn-Dann machbar, dann aber bräuchte man wohl 20 Stränge, die dann ggf. wiederum unterteilt werden müssten (s.o.). Allein vor eventueller Fehlersuche graust mir :)

Kann mir jemand eine Alternative zu derartigen Monstern empfehlen oder weiß, wo man das findet? Per Suchmaschine bin ich auf "Indirekt" gestoßen, ohne dazu aber brauchbare (=mir verständliche?) Beispiele oder Anwendungshinweise zu finden.

Vielen Dank
Blue :)
 

P6CNAT

Advanced Hacker
Hallo blue,
hört sich ziemlich kompliziert an. Hast du dich schon mal mit Makros beschäftigt? Das scheint mir in deinem Fall die elegantere Lösung zu sein.
Gruß
Georg
 
OP
B

Blue

Newbie
Hallo Georg,

ich würde mich jetzt nicht als Makro-Spezialist bezeichnen, aber völliges Neuland ist das nicht. Nur fällt mir da keine Vorgehensweise ein ... Hast du einen Tip? Dran gedacht hab ich schon, nur fehlt mir die Idee, wie das mit Makros umzusetzen wäre.

Gruß
Blue
 

abgdf

Guru
Blue schrieb:
Kann mir jemand eine Alternative zu derartigen Monstern empfehlen oder weiß, wo man das findet?
Also, ich führe Berechnungen in der Programmiersprache Python durch. Da stößt man dann nicht mehr an Grenzen der möglichen Komplexität. Allerdings muß man die Sprache lernen, was aber IMHO gar nicht so schwierig ist. Also, Werte kann man dort in Listen sammeln:
Code:
l = [1, 2, 3, 4, 5]
Die kann man dann z.B. durchlaufen:
Code:
for i in l:
    print i
Die Einrückung ist dabei von Bedeutung und muß mitgeschrieben werden.
Wäre eine Alternative ...
 

P6CNAT

Advanced Hacker
Hallo Blue,

Ich habe viel mit Excel Makros zu tun. Calc Macros sind was ganz anderes, aber hier habe ich mal ein einfaches Beispiel eingefügt. Ist übrigens sowas Ähnliches wie deine Anforderung.

In Spalte A stehen Tarifkürzel, in Spalte B wird die Funktion mit =MyTarif(A1) usw. eingetragen.
Die Funktion sucht dann in einer extra Tabelle "Tarif" den Tagestarif.

Code:
Public Function MyTarif(schluessel As String) As Double

   ' Diese Funktion holt Tarife aus der Tarif-Tabelle

   Dim oDocument As Object
   ' Dim oSheet    As Object
   Dim T         As Object
   Dim Inhalt    As String
   Dim Row       As Integer

   oDocument = ThisComponent
   ' oSheet = oDocument.Sheets.ActiveSheet
   T = ThisComponent.Sheets().getByName("Tarife") 
   MyTarif = 0.0
   Row = 1
   Do
     Select Case T.GetCellByPosition(0, Row).Type
  	   Case com.sun.star.table.CellContentType.EMPTY
         Exit Do
	   Case com.sun.star.table.CellContentType.VALUE
         Inhalt = T.GetCellByPosition(0, Row).Value
	   Case com.sun.star.table.CellContentType.TEXT
         Inhalt = T.GetCellByPosition(0, Row).String
     End Select
     If Inhalt = schluessel Then
       MyTarif = T.GetCellByPosition(2, Row).Value
       Exit Do
     End If
    Row = Row + 1

   Loop While T.GetCellByPosition(0, Row).Type <> com.sun.star.table.CellContentType.EMPTY

End Function
Gruß
Georg
 

P6CNAT

Advanced Hacker
abgdf schrieb:
Also, ich führe Berechnungen in der Programmiersprache Python durch.
Hi,

könntest du mal ein kleines Beispiel in Python für Calc posten?
Ich kenne Pascal sehr gut und Python interessiert mich, ein Beispiel wäre für mich eine schöne Einstiegshilfe.

Danke und Gruß
Georg
 

abgdf

Guru
P6CNAT schrieb:
abgdf schrieb:
Also, ich führe Berechnungen in der Programmiersprache Python durch.
Hi,

könntest du mal ein kleines Beispiel in Python für Calc posten?
Hmm, wenn ich etwas berechnen muß, schreibe ich ein Python-Skript und lasse mir das Ergebnis auf der Konsole ausgeben, bzw. in eine Nur-Text-Datei schreiben. Calc brauche ich daher gar nicht, aber wenn die Ergebnisdaten tabellarisch sind, könnte ich sie natürlich auch mit Calc in Calc einlesen.
Ansonsten ist es schon möglich, OpenOffice mit Python anzusteuern. Wie man das mit Writer am besten macht, hatte ich mal hier vorgestellt, hat aber anscheinend niemanden interessiert.
Ein Beispiel, wie man Calc-Zellen mit Python ausliest und beschreibt, habe ich jetzt nicht auf die Schnelle, dürfte sich aber im Internet finden lassen, da es durchaus (wie in dem Writer-Beispiel über pyuno) möglich ist.

Gruß
 
OP
B

Blue

Newbie
*Heureka* ... oder so ähnlich :)

Vielen Dank erstmal für Eure Hinweise und Hilfe. Ich fürchte einfach mal die Menge der Antworten lässt schon auch auf die "Verbreitung" des Problems schliessen ;-)

Python klingt interessant, daher habe ich auch gleich mal die Bibliothek geplündert. Allerdings fange ich hier wirklich bei 0 an ... das wird spannend.

Eher war dann die Überlegung, das xls-Makro zu nutzen und eine alte MS-Office Lizenz zu reaktivieren, doch dann ...

lief mir die Formel "SVERWEIS(Kriterium;Matrix;Index)" über den Weg. Nun habe ich noch nicht die eigentliche Aufgabe mit den 20*120 Kategorien gelöst, aber des Versuchs wegen meine alte Wenn-Dann Formel ersetzt:

Aus
Code:
=WENN($F4<=$I$30;WENN($F4=$I$4;$L$4;WENN($F4=$I$5;$L$5;WENN($F4=$I$6;$L$6;WENN($F4=$I$7;$L$7;WENN($F4=$I$8;$L$8;WENN($F4=$I$9;$L$9;WENN($F4=$I$10;$L$10;WENN($F4=$I$11;$L$11;WENN($F4=$I$12;$L$12;WENN($F4=$I$13;$L$13;WENN($F4=$I$14;$L$14;WENN($F4=$I$15;$L$15;WENN($F4=$I$16;$L$16;WENN($F4=$I$17;$L$17;WENN($F4=$I$18;$L$18;WENN($F4=$I$19;$L$19;WENN($F4=$I$20;$L$20;WENN($F4=$I$21;$L$21;WENN($F4=$I$22;$L$22;WENN($F4=$I$23;$L$23;WENN($F4=$I$24;$L$24;WENN($F4=$I$25;$L$25;WENN($F4=$I$26;$L$26;WENN($F4=$I$27;$L$27;WENN($F4=$I$28;$L$28;WENN($F4=$I$29;$L$29;$L$30))))))))))))))))))))))))));WENN($F4=$I$31;$L$31;WENN($F4=$I$32;$L$32;WENN($F4=$I$33;$L$33;WENN($F4=$I$34;$L$34;WENN($F4=$I$35;$L$35;WENN($F4=$I$36;$L$36;WENN($F4=$I$37;$L$37;WENN($F4=$I$38;$L$38;WENN($F4=$I$39;$L$39;WENN($F4=$I$40;$L$40;WENN($F4=$I$41;$L$41;WENN($F4=$I$42;$L$42;WENN($F4=$I$43;$L$43;WENN($F4=$I$44;$L$44;WENN($F4=$I$45;$L$45;WENN($F4=$I$46;$L$46;WENN($F4=$I$47;$L$47;WENN($F4=$I$48;$L$48;WENN($F4=$I$49;$L$49;WENN($F4=$I$50;$L$50;WENN($F4=$I$51;$L$52;WENN($F4=$I$53;$L$53;WENN($F4=$I$54;$L$54;WENN($F4=$I$55;$L$55;WENN($F4=$I$56;$L$56;WENN($F4=$I$57;$L$57;WENN($F4=$I$58;$L$58;WENN($F4=$I$59;$L$59;WENN($F4=$I$60;$L$60;999))))))))))))))))))))))))))))))

wurde nun so etwas:
Code:
=SVERWEIS(F4;$I$4:$L$59;4)

Das scheint mir schon sehr vielversprechend und ich bin bester Hoffnung, meine Frage damit gelöst zu bekommen.

Danke und viele Grüße
Blue
 

abgdf

Guru
Hab' hier noch eine Anleitung zu "SVERWEIS" gefunden. Ist es, was Du willst?

Oder könntest Du vielleicht ein paar Beispieldaten posten und dazu, nach welchem Kriterium welche Daten welchen zugeordnet werden sollen (interessiert mich irgendwie). Sonst bleibt das zumindest für uns hier alles etwas nebulös.

Gruß
 
Oben