Calc: Selbstdefinierte Funktionen nutzen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

tinuviel
Beiträge: 8
Registriert: So, 29.10.2006 10:43

Calc: Selbstdefinierte Funktionen nutzen

Beitrag von tinuviel »

Hallo Welt!

Ich verwende seit langem eine Formel, die anhand der erreichten Punktzahl in einem Test gleich die Zensur mit ausgibt; das klappt soweit problemlos. Das Dumme ist nun aber, dass ich für jeden Test, den ich auf diese Weise auswerten will, die Formel neu eintippen bzw. per Copy/Paste einfügen und dann anpassen muss. Das ist zwar ein machbarer Aufwand, aber aus Neugier will ich dennoch wissen, wie ich das mit einer eigenen Funktion hinkriege.

Die Formel sieht so aus:

Code: Alles auswählen

=WENN(G4;SVERWEIS(G4/$G$3;$Bewertung.$A$2:$B$7;2;1);"-")
wobei in G4 die Summe der erreichten Punkte und in G3 die maximal möglichen Punkte stehen. Auf dem Blatt "Bewertungen" steht eine Tabelle (A2:B7) mit den prozentualen Punktegrenzen für die entsprechenden Schulnoten (also bis 95% eine 1, bis 80% eine 2 usw.) - das Ganze aber erst, wenn überhaupt Punkte vorhanden sind, daher die Verschachtelung mit dem WENN.

Ich möchte jetzt viel lieber eine eigene Funktion aufrufen per

Code: Alles auswählen

= Note(G3;$G$4)
nur von diesen beiden Zellen hängt ja alles ab.

Ich habe schon einiges ausprobiert und suche seit Tagen nach vergleichbaren Beispielen oder Erklärungen, scheine aber auf dem total falschen Dampfer zu sein - könnte mir jemand bitte die Richtung weisen?
Danke im Voraus!



Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Selbstdefinierte Funktionen nutzen

Beitrag von turtle47 »

Hallo,

ohne SVERWEIS funktioniert das folgendermassen:

Code: Alles auswählen

Function Note(Max_Punkte,Ist_Punkte)
Dim Berechnung as Integer

Berechnung = Ist_Punkte / Max_Punkte * 100

Select Case Berechnung
Case 95 To 100
Note = 1

Case 80 to 94
Note = 2

'......... hier erweitern

Case > 100
Note = "Berechnung falsch"

Case Else
Note = "-"
End Select

end function
Gruß
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Selbstdefinierte Funktionen nutzen

Beitrag von Stephan »

oder mit Rückgriff auf Tabellenblatt "Bewertungen" wie in anhängender Beispieldatei


Gruß
Stephan
Dateianhänge
Note_berechnen.ods
(8.41 KiB) 163-mal heruntergeladen
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Selbstdefinierte Funktionen nutzen

Beitrag von turtle47 »

Hallo Stephan,

geht man mal davon aus, dass z.B. auch halbe Punkte (0,5) vergeben werden können so würde bei 94,5 Punkten ein mathematisch gerundetes Ergebnis von 95 herauskommen. Also eine 1.
Bei Deinem Beispiel wird sogar bei 94.99 noch eine 2 ausgegeben.

Ob das den Schülern gegenüber gerecht ist soll aber "tinuviel" entscheiden.

Gruß
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Selbstdefinierte Funktionen nutzen

Beitrag von Stephan »

Hallo Jürgen,
geht man mal davon aus, dass z.B. auch halbe Punkte (0,5) vergeben werden können so würde bei 94,5 Punkten ein mathematisch gerundetes Ergebnis von 95 herauskommen. Also eine 1.
Bei Deinem Beispiel wird sogar bei 94.99 noch eine 2 ausgegeben.
schön und gut, nur weiß ich davon nichts und konnte mich nur an die Formel halten die der Frager gepostet hatte:

=WENN(G4;SVERWEIS(G4/$G$3;$Bewertung.$A$2:$B$7;2;1);"-")

und dort wird keine Rundung berücksichtigt.

Auch das ich annehme das, falls eine 'Grenz-Punktzahl' genau getroffen wird, das dann immer noch die bessere Note gilt ist Willkür, denn ich weiß nicht genau wie der Frager diesen Fall behandelt sehen möchte.




Gruß
Stephan
tinuviel
Beiträge: 8
Registriert: So, 29.10.2006 10:43

Re: Selbstdefinierte Funktionen nutzen

Beitrag von tinuviel »

Hallo Jürgen, hallo Stephan und paljass,
vielen Dank für die Antworten! Es ist natürlich eine gute Idee, die ganze Sache direkt zu lösen - also WENN und SVERWEIS mit if und case zu basteln. Werde ich machen, das kriege ich hin. Da hätte ich drauf kommen können.

Übrig bleibt da trotzdem die Neugier: Wie rufe ich in meiner eigenen Funktion eine vordefinierte auf? Nicht in jedem Fall könnte man das Gewünschte so einfach selber schreiben.

Danke nochmal!
tinuviel
LibreOffice 3.3.2 / Debian 6
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Selbstdefinierte Funktionen nutzen

Beitrag von turtle47 »

Hallo,
tinuviel hat geschrieben:Wie rufe ich in meiner eigenen Funktion eine vordefinierte auf?
Hier ein Beispiel für das Berechnen der eingebauten Funktion "Tage" zur Berechnung der Differenz zweier Datumszahlen.
Es müssen immer englische Funktionsnamen verwendet werden! In diesem Fall "DAYS"

Funktionsaufruf mittels:

Code: Alles auswählen

=BERECHNE_TAGE(A1;B1)

Code: Alles auswählen

Function Berechne_Tage(Start_Datum,End_Datum)
FuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")
Berechne_Tage = FuncAcc.callFunction("DAYS",array(End_Datum,Start_Datum))
End Function
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Selbstdefinierte Funktionen nutzen

Beitrag von balu »

Hallo Leute,

ich möchte da etwas richtig stellen.
tutle47 hat geschrieben: Es müssen immer englische Funktionsnamen verwendet werden!
Das "immer" ist mit Voricht zu genießen!

Sagen wir mal lieber:
Wenn der Makro-Code anonsten korrekt ist, und es dennoch zu einer Fehlermeldung beim anwenden der Funktionsnamen kommt, dann die deutschen Funktionsnamen anwenden.
Denn es gibt mehrere die mit dem deutschen Namen geschrieben werden müssen. Wieviele genau, und vor allem welche alle, weiß ich nicht. Das muss man dann im Einzelfall selber heraus bekommen. Hier mal drei als Beispiel:

ZUFALLSBEREICH
DEZINOKT
DEZINHEX



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Selbstdefinierte Funktionen nutzen

Beitrag von turtle47 »

Hallo Balu,

danke für Deine Korrektur.
Ich meine mich jetzt zu erinnern, dass es dazu einen Thread hier im Forum gibt.

Schönes RWE

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Selbstdefinierte Funktionen nutzen

Beitrag von Stephan »

mmh ...

Die Beobachtung von Balu ist interessant und mir dem konkreten Inhalt nach neu, allerdinggs glaube ich nicht das die Dinge so einfach liegen, sondern nehme an das deutschsprachige Namen, auch unter den hier vorliegenden Bedingungen, nur in einen deutsch-lokalisierten OOo funktionieren dürften. Oder ist das nicht so?

Grundsätzlich gilt auch das wir hier nicht über englische Namen, sondern über internationale Namen reden, was sich jetzt kleinkariert anhört was aber in Detailfällen möglicherwise deshalb von Bedeutung sein kann, weil einzelne Namen inkonsitent sind und in englisch und 'international' dann nicht gleich (Beispiel kene ich derzeitig aber keins).


Ich habe mir jetzt nur einen kurzen Überblick verschafft und es scheint so zu sein das die Funktionen immer mit dem Namen anzusprechen sind den die Abfrage mit .Formula zurückliefert, das aber ist quasi die internationale Funktionsbezeichnung.

Beispielsweise liefert für die Formel =ZUFALLSBEREICH(20;30) die Abfrage mittels:

Code: Alles auswählen

Sub Main
Msgbox ThisComponent.Sheets(0).getCellByPosition(1,0).Formula
End Sub
die Rückgabe:

=com.sun.star.sheet.addin.Analysis.getRandbetween(20;30)


und gleichzeitig funktioniert damit der Zugriff per Code:

Code: Alles auswählen

Function abc(x,y)
  FuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")
  abc = FuncAcc.callFunction("com.sun.star.sheet.addin.Analysis.getRandbetween",array(x,y))
End Function


Insgesemt müßte man das Ganze wohl einmal genauer analysieren, die Ursache der 'Probleme' könnte möglicherweise damit zusamenhängen das die interne Umstellung auf ODF 1.2 noch nicht vollständig konsistent erfolgt ist, wobei ODF 1.2 derzeitig auch nur als OASIS-Standard vorliegt, gleichzeitig jedoch die erste verbindliche Standardiesierung von Tabellenformelausdrücken (namens "OpenFormula") enthält (in ODF 1.0 ist das Ganze nur optional).




Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Selbstdefinierte Funktionen nutzen

Beitrag von balu »

Hallo,

@Jürgen
Ich meine mich jetzt zu erinnern, dass es dazu einen Thread hier im Forum gibt.
Ja, zu ZUFALLSBEREICH gukki hier.
Die anderen beiden Beispiele habe ich durch gemachte Erfahrung festgestellt. Bin mir zwar nich sehr sicher, aber ich vermute dass vielleicht alle aus der Kategorie "Add_in" davon betroffen sind. Aber bitte mich nicht darauf festnageln, im zweifelsfalle muss man das selber herausfinden.



@Stephan
sondern nehme an das deutschsprachige Namen, auch unter den hier vorliegenden Bedingungen, nur in einen deutsch-lokalisierten OOo funktionieren dürften. Oder ist das nicht so?
Sehr gute Frage, die mir auch schon so hin und wieder durch dem Kopf geht. Obwohl ich das aber mit der Lokalisierung auch nicht unbedingt bestätigen will. Denn ich hatte ja hier mal ein Thread im Basic-Forum eröffnet, in dem es darum ging das ich das Diagramm in den Hintergrund stellen wollte. Und dabei hatte ich dann durch recherchen herausgefunden, dass man für oShape.layerName die deutschen Namen "vorne" und "hinten" benutzt.
Diagramm -> Hintergrund
Die Antwort dort von Karolus im folge Beitrag ist auch interesant.


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
tinuviel
Beiträge: 8
Registriert: So, 29.10.2006 10:43

Re: Selbstdefinierte Funktionen nutzen

Beitrag von tinuviel »

Hallo Forum!
Was für eine wirklich interessante kleine Diskussion sich hier ergeben hat! Ich danke allen für ihre Beiträge, habe gutes gelernt und noch Stoff zum Weiterlesen - das ist cool. Bis bald dann!
tinuviel
tinuviel
Beiträge: 8
Registriert: So, 29.10.2006 10:43

Re: Selbstdefinierte Funktionen nutzen

Beitrag von tinuviel »

So, hallo alle miteinander!

Ich bin für's erste fertig, habe heute die Zeit gefunden, ein bisschen zu tippen...

So sieht die Funktion nun aus, sie tut schön brav ihren Dienst.

Code: Alles auswählen

Function Note(Punkte, Maximum)
FuncInst = GetProcessServiceManager.createInstance("com.sun.star.sheet.FunctionAccess")
Ratio = (Punkte / Maximum)
Blatt = ThisComponent.getSheets.getByName("Bewertung")
Bereich = Blatt.getCellRangeByName("A2:B7")
Note = FuncInst.callFunction("VLOOKUP",array(Ratio,Bereich,2,1))
End Function
Dazu die Bemerkung:
Der Funktionsaufruf gelingt tatsächlich nur mit dem englischen Namen vlookup anstelle von sverweis.
(lokalisierte Programmversion: LibreOffice 3.3.2, OOO330m19 (Build:202),tag libreoffice-3.3.2.2, Debian package 1:3.3.2-2~bpo60+1)

Jetzt habe ich noch folgende Fragen:
Das ganze funktioniert auch ohne Variablendeklaration, etwa wie

Code: Alles auswählen

Function Note(Punkte as integer, Maximum as integer) as integer
dim Blatt as object
dim Bereich as object
...
und so weiter. Habe ich da Glück oder geht das generell? Worauf muss dabei geachtet werden? Was ist empfehlenswert?

Dank an alle! Gruß, tinuviel
LibreOffice 3.3.2 / Debian 6
tinuviel
Beiträge: 8
Registriert: So, 29.10.2006 10:43

Re: Selbstdefinierte Funktionen nutzen

Beitrag von tinuviel »

Oho, da hab ich mich etwas zu früh gefreut. Wenn ich die Datei mit dem Datenblatt, in dem ich die Formel verwende, öffne, erscheint zunächst für jede Zelle, die die Formel enthält, eine com.sun.star.container.NoSuchElementException. Der rote Pfel in der IDE steht dabei auf die Zeile

Code: Alles auswählen

Blatt = ThisComponent.getSheets.getByName("Bewertung")
Habe ich dann für jede Zelle OK geklickt, ist die Zensurenspalte leer. Beim Neuberechnen des Blattes (Shift-Ctrl-F9) erscheinen die Ergebnisse klaglos wieder. Was ist da los?

Gruß, tinuviel
LibreOffice 3.3.2 / Debian 6
Antworten