Funktion zur Ermittlung des ersten bzw. letzten Wortes in einer Calc-Zelle

Hallo Gemeinde,

ich suche eine Funktion zur Ermittlung des ersten bzw. letzten Wortes in einer Zelle der Calc-Tabelle. Die Funktion LastWord bringt mir immer nur drei Pünktchen. Was mache ich falsch?

 Function LastWord(myString As String)
   oCalc=thisComponent
   ' oSheet = oCalc.CurrentSelection.Spreadsheet
   myString = oCalc.CurrentSelection.String
   arr = split(myString," ")
   n = uBound(arr)
   ' LastWord = arr(n)
   LastWord = n
 End Function

Für hilfreiche Untertsützung wäre ich sehr dankbar.
Freundliche Grüße
MB

[Edit - Opaque] Formatierung der Details (Vorsicht mit - Zeichen, die eine spezielle Bedeutung für die Formatierung haben)

Hallo,

ganz verstehe ich Dein Makro nicht. Wenn Du das Makro als benutzerdefinierte Funktion planst und daher myString As String als Parameter benötigst, wozu dann das oCalc=thisComponent und myString = oCalc.CurrentSelection.String?

Die Funktion LastWord bringt mir immer nur drei Pünktchen

Dazu kann man nichts sagen, wenn man keine Information über den Zellinhalt derjenigen Zelle, die zum Zeitpunkt der Makroausführung ausgewählt war, hat. Dein Makro überschreibt ja mit myString = oCalc.CurrentSelection.String den an myString übergebenen Wert mit dem Inhalt der aktuell ausgewählten Zelle. Und ich behaupte jetzt mal: Die endet mit 3 Pünktchen

Insofern ist das vermutlich die Antwort auf: Was mache ich falsch?

Wenn ich aber:

 Function LastWord(myString As String)

   arr = split(myString," ")
   n = uBound(arr)
   LastWord = arr(n)

 End Function

schreibe und in eine Zelle =LASTWORD(A1) klappt das ( Zelle A1 soll natürlich den String enthalten, dessen letztes Wort ermittelt werden soll).

Alternativ (zum Testen mit dem Argument als optionales Argument, wobei dann aber die Zelle A1 selektiert sein muss, wenn man das Makro innerhalb der IDE aufruft) geht das:

 Function LastWord2(optional myString As String)
  
   oCalc=thisComponent
   myString = oCalc.CurrentSelection.String
   arr = split(myString," ")
   n = uBound(arr)
   LastWord2 = arr(n)
   
   print "Last Word: " & LastWord2
 End Function

Getestet mit LibreOffice

Version: 7.1.1.2 / LibreOffice Community, Build ID: fe0b08f4af1bacafe4c7ecc87ce55bb426164676
CPU threads: 8; OS: Linux 5.3; UI render: default; VCL: kf5
Locale: en-US (en_US.UTF-8); UI: en-US, Calc: threaded

Ergänzung

Ich würde jetzt noch hinzufügen, dass man eigentlich keine Makros dafür benötigt:

erstes Wort: =REGEX(A1;"^[:alnum:]+\b")
letztes Wort: =REGEX(A1;"\b[:alnum:]+$")

Ref.: LibreOffice Hilfe - REGEX (auf Deutsch: REGAUS).

Ich hoffe das hilft etwas weiter.

Danke für die schnelle Antwort.
Auf das einfachste kommt man immer zuletzt. Ja, warum eigentlich eine benutzerdefinierte Funktion dafür.
Ich bevorzuge Makros und Funktionen aus dem Grund, dass man sich ja das Konstrukt

=REGEX(A1;"^[:alnum:]+\b") oder
=REGEX(A1;"\b[:alnum:]+$")

schlechter merken kann als z.B. LastWord oder FirstWord.
Übrigens hatte ich die Zellen immer mit Leerzeichen getrennte Strings “gefüllt.” Auch bei Deiner Function LastWord2 kommen immer die drei Pünktchen …

Nochmals Danke und viele Grüsse
MB

Auch bei Deiner Function LastWord2 kommen immer die drei Pünktchen …

OK - nochmal zum besseren Verständnis: Auch mein Makro Lastword2(...) zeigt an, was gerade ausgewählt ist. Habe ich aber auch geschrieben und es war Absicht, dass es genau dasselbe tut wie Deines, aber aus der IDE heraus aufgerufen werden kann (was bei Deiner Version schief geht, weil myString dort kein optionales Argument ist). Das was Du selektiert hast kann ich von hier aus nicht sehen.

Wenn die Antwort geholfen hat, Dein Problem zu lösen, dann klick bitte das kleine Häkchen (:heavy_check_mark:) direkt neben der Antwort (wird grün dabei).