Calc: Selbstdefinierte Funktionen nutzen

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

Moderator: Moderatoren

Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Selbstdefinierte Funktionen nutzen

Beitrag von komma4 »

[nachgetestet und dann geschriebenen Unsinn gelöscht]
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Selbstdefinierte Funktionen nutzen

Beitrag von Stephan »

erscheint zunächst für jede Zelle, die die Formel enthält, eine com.sun.star.container.NoSuchElementException
Für mich keine nachvollziehbare Fehlemeldung, aber ich nutze auch OpenOffice.org
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?
Mutmaßlich ist die benutzerdefinierte Funktion nicht in der Standardbibliothek des Dokuments gespeichert sondern in einer der zentralen Makrobibliotheken.


Gruß
Stephan
Philipp_19
****
Beiträge: 115
Registriert: Mo, 29.08.2011 09:01
Wohnort: Duisburg

Re: Calc: Selbstdefinierte Funktionen nutzen

Beitrag von Philipp_19 »

tinuviel hat geschrieben: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?
Hallo tinuviel,

Da hatte ich den Text schon abgeschickt, guck blöder weise auf das Anmeldedatum von Stephan, denk nur "damn, der Thread ist uralt" und lösch ihn wieder :(

So hier nochmal die Antwort:
Variablen müssen prinzipiell nicht deklariert werden. Die Variablen bekommen dann den Typ "Variant" und können jeden Wert annehmen. Dabei passen sie sich dem Typ des Wertes an.
Empfehlenswert ist das ganze aber nicht. Bei einem längeren Code verlierst du schnell die Übersicht, welche Variable wann welchen Typ hat.
Das kann grade dann problematisch werden, wenn du eine variable gebrauchst, die als Integer deklariert sein muss, aber immoment den Typ String hat.
Bei Objekten (Table, Sheet, etc.) mache ich es bisher auch nicht, aber ansonsten schaue ich, das ich jede Variable deklariere. So behällst du die Übersicht und musst nicht am Ende auf Variablen-Fehler-Suche gehen.

Kleiner Tipp: Du kannst beim durchlaufen deiner Funktion die Variablen beobachten. Zur Variable springen, Brille anklicken ("Beobachter einschalten") und dann mit einzelschritten deine Funktion beobachten. Ohne Deklaration kann es sein, jenachdem wie du den Code aufgebaut hast, das die Variablen 10x ihren Typ ändern.

Ansonsten finde ich das ganze bei Andrew Pitonyak gut erklärt. Hoffe das reicht dir erstmal als Antwort.
Grüße
Windows XP, OOo 3.3.0
oder
Windows 7, OOo 3.3.0
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Selbstdefinierte Funktionen nutzen

Beitrag von balu »

Hallo tinuviel,
Der Funktionsaufruf gelingt tatsächlich nur mit dem englischen Namen vlookup anstelle von sverweis.
Ich hatte ja auch nicht gesagt, das man generell die deutschen nehmen soll, und im Problemfall die englischen. Sondern genau andersrum. Das aber nur so nebenbei.

Habe ich da Glück oder geht das generell?
Wie heißt da ein altes Sprichwort?
Der Krug geht so lange zum Brunnen, bis das er bricht!

Worauf muss dabei geachtet werden? Was ist empfehlenswert?
Zu beachten gibt es da schon so einiges. Und ich empfehle dir dringends dir die Seiten von Dannenhöfer mal zu studieren, damit Du nicht sehr böse Überraschungen erlebst.
Welche Variablentypen gibt es
Wie werden Variablen deklariert

Oho, da hab ich mich etwas zu früh gefreut.
Hattest Du da die Variablen deklaration für "Blatt" ausgelassen, oder doch wieder integriert?


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: Calc: Selbstdefinierte Funktionen nutzen

Beitrag von tinuviel »

Hallo miteinander!

Langsam kommt Klarheit in die Sache: Es schein wesentlich zu sein, in welchem Modul die Funktion gespeichert ist.

Bislang steht sie in <Meine Makros>Standard>Modul1. Das führt seltsamerweise dazu, dass diese Funktion beim Öffnen der Datei ausgeführt wird, bevor noch alle Tabellenblätter geladen sind (wenn man das so ausdrückt). Das erscheint mir nicht logisch, da der Aufruf der Funktion ja erst in einer Zelle eines Tabellenblattes erfolgt. Aber unter anderem die Bemerkung von Stephan
Mutmaßlich ist die benutzerdefinierte Funktion nicht in der Standardbibliothek des Dokuments gespeichert sondern in einer der zentralen Makrobibliotheken.
und einige andere Hinweise, die ich in Foren las, brachten mich dazu, die Funktion im Dokument selber zu speichern - und da flutscht alles wie gewünscht.

Und in der Tat: Füge ich zum Beginn der Funktion ein wait 5000 ein, so sehe ich beim Öffnen des Dokuments (wenn die Funktion in <Meine Makros> steht) 5 Sekunden lang das Office-Hauptfenster ohne Tabellenblätter; der Bereich ist komplett grau. Danach erscheint dann prompt wieder die besagte Fehlermeldung (die schlicht besagt, dass das gewünschte Tabellenblatt nicht existiert) und dann die Tabellenblätter.

Hab ich die Funktion im Dokument selber, muss ich mich wiederum mit der Makrosicherheit herumschlagen - das ist aber eine andere Geschichte.

Vielen Dank übrigens auch für die vielen Hinweise zur Variablendeklaration! Habe für mich einen bewährten Grundsatz wiedererkannt: Übe an leichten Beispielen, dann kannst du's auch, wenn es kompliziert wird. Ergo: immer schön deklarieren, auch wenn es unnötig erscheint.
Gruß, tinuviel
LibreOffice 3.3.2 / Debian 6
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Selbstdefinierte Funktionen nutzen

Beitrag von balu »

Hallo tinuviel,

meine Makro Kenntnisse sind noch nicht die Besten, aber dennoch ist mir da etwas aufgefallen was so nicht richtig sein kann. Hatte das aber auch nicht sofort gesehen und gemerkt. Mir fiel das nur deshalb auf, weil ich das mit "FunctionAccess" mit einer von mir angewandten Sub (nicht Function) mal verglichen hatte.

Schau dir mal bei Dannenhöfer: Wie kann man Funktionen von Calc verwenden an. Dann müsstest Du verstehen was ich meine.

Wie man nun ordnungsgemäß deine Function aufbaut, weiß ich noch nicht (fehlt mir die Erfahrung). Aber Sinngemäß müsste sie wohl so ungefrähr aussehen.

Code: Alles auswählen

Function Note(Punkte as integer, Maximum as integer) as integer
	Dim args(3) as Variant
    FuncInst = GetProcessServiceManager.createInstance("com.sun.star.sheet.FunctionAccess")
    Ratio = Punkte/Maximum
    Blatt = ThisComponent.getSheets.getByName("Bewertung")
	args(0) = Ratio ' Suchkriterium
	args(1) = Blatt.getCellRangeByName("A2:B7").getDataArray() ' Suchmatrix
	args(2) = 2 ' Spalte in der Suchmatrix
	args(3) = 1 ' Sortier-Parameter 0 oder 1
	Note = FuncInst.callFunction("VLOOKUP",args())
End Function
Bei Dim args(3) bin ich mir nicht sicher ob das so in einer Function gemacht wird. Ich kann also nicht zu 100pro bestätigen ob ich alles richtig gemacht habe, da ich die Function nicht ans Laufen kriege. Egal wo ich sie speichere, ich bekomme kein Ergebnis angezeigt.

Aufrufen tu ich sie mit

Code: Alles auswählen

=NOTE(G4;G3)
Wobei
G3 = die maximal möglichen Punkte
G4 = die Summe der erreichten Punkte
sind.

Aber vielleicht kommst Du ja jetzt einen Schritt weiter. Hoffe ich zumindest.
Wenn nicht, dann poste doch bitte beim nächsten mal deinen gesamten Code.


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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Selbstdefinierte Funktionen nutzen

Beitrag von Stephan »

Bislang steht sie in <Meine Makros>Standard>Modul1.
Naja, das geht natürlich nicht, das ist dass Problem. Kein Generelles aber eben Eines beim Zugriff auf das ThisComponent-Objekt.

Trotzdem nochmals: ich habe diesen Fall gestern zur Sicherheit aktuell getestet gehabt und bekomme dort nicht die von Dir genannte Fehlermeldung sondern die Fehlermeldung 'Eigenschaft oder Methode nicht gefunden' für die Methode .getSheets, das ist auch die Fehlermeldung die ich erwartet hätte.
Das erscheint mir nicht logisch
wahrscheinlich ist es das auch nicht, da man jedoch mit dem Problem irgendwie umgehen muß, habe ich da schon lange nicht mehr drüber nachgedacht, denn sicher erschien mir das auch einmal unlogisch wo ich das erste Mal davon Kenntnis bekam
Hab ich die Funktion im Dokument selber, muss ich mich wiederum mit der Makrosicherheit herumschlagen
Du mußt ja DEine Funiktion nicht so formulieren wie sie jetzt ist, sondern kannst das auch anders implementieren und dann kannst Du sie zentral speichern.

Zu vermeiden ist eben nur das, unter den hier viorliegenden Randbedingungen, direkt mit dem Dokument-Objekt 'rumgemacht' wird, eine Lösung wäre es z.B. die Noten-Zuordnungstabelle direkt als Array ins Makro zu schreiben und dann dire Auswertung mit Basic-Befehlen ohnec Rückgriff auf VLOCKUP im Code zu implementieren.


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

Re: Calc: Selbstdefinierte Funktionen nutzen

Beitrag von tinuviel »

Hallo balu, hallo Stephan!

Ja, der Code von balu entspricht den Angaben in Dannenhöfers Text und ist wohl sauberer gestrickt. Das Problem mit dem thisComponent-Objekt ist davon allerdings unberührt.

@Stefan: Inzwischen lautet meine Fehlermeldung ganz genau wie von dir erwartet und nachvollzogen: 'Eigenschaft oder Methode nicht gefunden' für die Methode .getSheets - das Problem ist nun also erkannt und eingegrenzt.

Ich für meinen Teil bin damit zufrieden, die Makrosicherheit auf "Nachfragen" einzustellen. Ich glaube nicht, dass ich da ständig gefragt werde - für diese eine Datei kann ich damit leben. Es ist unter anderem auch daher von Vorteil die Funktion im Dokument zu speichern, da ich meine Zensurenliste immer mal wieder auf verschiedenen Rechnern (zu Hause, Laptop und in der Schule) bearbeite, und da hab ich sie also immer "dabei".

Danke und Gruß nochmal an alle. Ein zufriedenes Foren-Mitglied namens
tinuviel
LibreOffice 3.3.2 / Debian 6
Antworten