🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst]UDF soll mir Ergebnis liefern und die aufrufende Funktion soll in Zelle erhalten bleiben

Alles zur Programmierung im LibreOffice.
Antworten
craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

[gelöst]UDF soll mir Ergebnis liefern und die aufrufende Funktion soll in Zelle erhalten bleiben

Beitrag von craig » Mo 9. Mär 2020, 20:12

Hallo,
im Beispieldokument habe ich in Anlehung zu diesem Thread ein UDF geschrieben.
Der Ausdruck/ String z.B. 1+1 wird per UDF in eine berechenbare Formel
umgewandelt und das korrekte Ergebnis wird in Spalte B ausgegeben.

Der Aufruf der Funktion erfolgt über =Auswerten(A1)
Allerdings bleibt die aufrufende Funktion in den Zellen der Spalte B nicht erhalten.
Sie wird vom Ausdruck aus Zelle A1 (=1+1) überschrieben.

Wie muss ich die Funktion umschreiben, dass mir einerseits der Funktionsaufruf
in der Zelle erhalten bleibt, als auch das Ergebnis geliefert wird?
UDF Auswerten.ods
(9.59 KiB) 223-mal heruntergeladen
Zuletzt geändert von craig am Di 10. Mär 2020, 22:03, insgesamt 1-mal geändert.
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

mikele
* LO-Experte *
Beiträge: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: UDF soll mir Ergebnis liefern und die aufrufende Funktion soll in Zelle erhalten bleiben

Beitrag von mikele » Mo 9. Mär 2020, 21:06

Hallo,
die aktuelle Zelle muss ja nicht die Zelle sein, in der die Funktion steht. Wenn du A2 änderst (nach Enter ist A3 aktiv), erwartest du, dass die Berechnung in D2 neu erfolgt.
Eine Variante (ich bin mir nicht sicher, ob nicht noch ein Haken dabei ist, da eine UDF "üblicherweise" nur die Zelle beeinflusst in der sie steht) wäre, dass man sich eine Zelle aussucht, die "mit Sicherheit" nicht anderweitig benutzt wird und dort die Formel hineinschreibt.

Code: Alles auswählen

Function Auswerten(a)
	
	oSheet=ThisComponent.sheets(0)
	
	oCell=oSheet.getCellByPosition(1000,1000)

	oCell.Formula="=" & a
	Auswerten=oCell.Value
	
End Function
Gruß,
mikele

craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: UDF soll mir Ergebnis liefern und die aufrufende Funktion soll in Zelle erhalten bleiben

Beitrag von craig » Di 10. Mär 2020, 22:00

Hallo mikele,

vielen Dank!
mikele hat geschrieben:die aktuelle Zelle muss ja nicht die Zelle sein, in der die Funktion steht. Wenn du A2 änderst (nach Enter ist A3 aktiv), erwartest du, dass die Berechnung in D2 neu erfolgt.
Stimmt, da habe ich mich wohl verrannt.

Zu D2:
Wenn ich in D2 =B2+1 schreibe, dann erfolgt eine korrekte Berechnung.
sobald ich aber den Ausdruck in A2 ändere, erhalte ich einen Error 522 (Zirkelbezug)

Den Fehler 522 kann man übergehen, in dem die Iteration eingeschaltet wird:
LibreOffice Calc --> Berechnen --> Iteration

Jetzt funktioniert es, zumindest was ich bis jetzt sagen kann.
Auch in Kombination mit anderen Funktionen:
=WURZEL(AUSWERTEN(A2))
Potenzieren funktioniert auch
=5*22^4

Ich rechne bei größeren Tabellen damit, dass auf Grund der Iteration die Performance leidet.
Auch wenn man die Iterations-Schritte auf max. 10 einstellt.
mikele hat geschrieben:Eine Variante (ich bin mir nicht sicher, ob nicht noch ein Haken dabei ist, da eine UDF "üblicherweise" nur die Zelle beeinflusst in der sie steht) wäre, dass man sich eine Zelle aussucht, die "mit Sicherheit" nicht anderweitig benutzt wird und dort die Formel hineinschreibt.

Code: Alles auswählen

oCell=oSheet.getCellByPosition(1000,1000)
Dies ist ersteinmal völlig OK.

Man könnte sich den "Umweg" (getCellByPosition(1000,1000)) sparen, wenn es
eine Möglichkeit gäbe, dass diese Art von Strings umwandelbar/ berechenbar wären.

Ich vermute dass mit oCell.formular wohl ein komplexer Algorithmus wirksam wird.
Wie sonst läßt sich sonst erklären, dass die Zahlen und die Operatoren richtig erkannt werden.

Nun will ich das Thema nicht auf die Spitze treiben.
Zumal es mir in erster Linie darum ging, warum meine Funktion nicht in der aufrufenden Zelle stehen blieb.

Fazit:
  1. Mein Problem ist gelöst
  2. Diese Funktion ist nur bedingt einsetzbar.
  3. Weitreichende Fehler sind nicht ausgeschlossen.
Nochmals Danke.

BIs dann...
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten