Seite 1 von 2

Calc: Selbstdefinierte Funktionen nutzen

Verfasst: Sa, 03.09.2011 21:46
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: Sa, 03.09.2011 23:19
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: Sa, 03.09.2011 23:22
von Stephan
oder mit Rückgriff auf Tabellenblatt "Bewertungen" wie in anhängender Beispieldatei


Gruß
Stephan

Re: Selbstdefinierte Funktionen nutzen

Verfasst: Sa, 03.09.2011 23:52
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: So, 04.09.2011 01:22
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: So, 04.09.2011 08:28
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: So, 04.09.2011 09:10
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: So, 04.09.2011 11:41
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: So, 04.09.2011 13:12
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: So, 04.09.2011 13:54
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: So, 04.09.2011 14:43
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: So, 04.09.2011 15:56
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: Di, 06.09.2011 20:29
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

Re: Selbstdefinierte Funktionen nutzen

Verfasst: Di, 06.09.2011 22:27
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