Calc: Selbstdefinierte Funktionen nutzen
Moderator: Moderatoren
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Selbstdefinierte Funktionen nutzen
[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)
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)
Re: Calc: Selbstdefinierte Funktionen nutzen
Für mich keine nachvollziehbare Fehlemeldung, aber ich nutze auch OpenOffice.orgerscheint zunächst für jede Zelle, die die Formel enthält, eine com.sun.star.container.NoSuchElementException
Mutmaßlich ist die benutzerdefinierte Funktion nicht in der Standardbibliothek des Dokuments gespeichert sondern in einer der zentralen Makrobibliotheken.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ß
Stephan
-
- ****
- Beiträge: 115
- Registriert: Mo, 29.08.2011 09:01
- Wohnort: Duisburg
Re: Calc: Selbstdefinierte Funktionen nutzen
Hallo tinuviel,tinuviel hat geschrieben:Jetzt habe ich noch folgende Fragen:
Das ganze funktioniert auch ohne Variablendeklaration, etwa wie
und so weiter. Habe ich da Glück oder geht das generell? Worauf muss dabei geachtet werden? Was ist empfehlenswert?Code: Alles auswählen
Function Note(Punkte as integer, Maximum as integer) as integer dim Blatt as object dim Bereich as object ...
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
oder
Windows 7, OOo 3.3.0
Re: Calc: Selbstdefinierte Funktionen nutzen
Hallo tinuviel,
Der Krug geht so lange zum Brunnen, bis das er bricht!
Welche Variablentypen gibt es
Wie werden Variablen deklariert
Gruß
balu
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.Der Funktionsaufruf gelingt tatsächlich nur mit dem englischen Namen vlookup anstelle von sverweis.
Wie heißt da ein altes Sprichwort?Habe ich da Glück oder geht das generell?
Der Krug geht so lange zum Brunnen, bis das er bricht!
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.Worauf muss dabei geachtet werden? Was ist empfehlenswert?
Welche Variablentypen gibt es
Wie werden Variablen deklariert
Hattest Du da die Variablen deklaration für "Blatt" ausgelassen, oder doch wieder integriert?Oho, da hab ich mich etwas zu früh gefreut.
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
wehr rächtschraipfähler findet khan si behalden

Re: Calc: Selbstdefinierte Funktionen nutzen
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
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
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
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.Mutmaßlich ist die benutzerdefinierte Funktion nicht in der Standardbibliothek des Dokuments gespeichert sondern in einer der zentralen Makrobibliotheken.
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
Re: Calc: Selbstdefinierte Funktionen nutzen
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.
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
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
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
Aufrufen tu ich sie mit
Code: Alles auswählen
=NOTE(G4;G3)
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
wehr rächtschraipfähler findet khan si behalden

Re: Calc: Selbstdefinierte Funktionen nutzen
Naja, das geht natürlich nicht, das ist dass Problem. Kein Generelles aber eben Eines beim Zugriff auf das ThisComponent-Objekt.Bislang steht sie in <Meine Makros>Standard>Modul1.
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.
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 bekamDas erscheint mir nicht logisch
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.Hab ich die Funktion im Dokument selber, muss ich mich wiederum mit der Makrosicherheit herumschlagen
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
Re: Calc: Selbstdefinierte Funktionen nutzen
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
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