Aus einer Zelle, in der mehrere Namen gelistet sind, möchte ich in anderen Zellen die einzelnen Namen extrahieren. Getrennt werden die einzelnen Namen mittels " : ", Leerstelle-Doppelpunkt-Leerstelle. Die Anzahl der Namen in den Zellen [A:A] variiert von 1 bis über 20.
Ausgegeben werden sollen erster, zweiter und vorletzter, letzter Name.
0_LO-Calc_TASK_extractions of names_014829.ods (25.0 KB)
Ich würde es mit einer UDF, user-defined-function, machen,
function extract_names(oEvent,nPosition) as String
aNames = split(oEvent,":")
for i = 0 to ubound (aNames)
aNames(i) = Trim(aNames(i)
next i
select case nPosition
case 1
extract_names = aNames(0)
case 2
extract_names = aNames(1)
case 3
extract_names = aNames(Ubound(aNames)-1)
case 4
extract_names = aNames(Ubound(aNames))
end select
End function
Beispiel anbei.
0_LO-Calc_TASK_extractions of names_014829.ods (31.6 KB)
Leider beschränkt meine Einstellung der Sicherheit von Makros deine Programmierung mit der ZellenAusgabe: #WERT!
.
Wenn Dir Formeln lieber sind, musst Du halt basteln:
Über LEN/LÄNGE-SUBSTITUTE/WECHSELN herausfinden, wieviele Trenner im String sind,
Dann alle bis auf den letzten auch via SUBSTITUTE verschwinden lassen und ab Trenner bis Stringende den letzten Namen kopieren.
Den vorletzten analog zum eben gesagten.
Die ersten beiden sind dann einfach.
Sonderfallbehandlung für weniger als 4 Teilketten ergänzen…
Als Alternative: Vereinfache die Datenbasis per “Text in Spalten” und verteile die Namen auf Einzelzellen, indem Du bei : trennst. Falls : nicht eindeutig genug ist Dein " : " durch etwas eindeutiges ersetzen. Sonderzeichen gibt es ja genug…
Installiere diese exzellente Erweiterung: [Calc][oxt] A function for all python string methods
=PYSTRING("split";A3;":")
als Matrixformel mit Str+Umsch+Enter eingegeben, liefert das gewünschte Ergebnis.
Statt selbst mit “split” zu arbeiten, kann man auch die in der Library “Tools” in “Application Macros & Dialogs” mitgelieferte Funktion “ArrayOutOfString” benutzen. Also so etwas:
function MYTEXTSPLIT (sSource as string, sDelimiter as string) as variant
if NOT GlobalScope.BasicLibraries.isLibraryLoaded("Tools") then _
GlobalScope.BasicLibraries.LoadLibrary("Tools")
MYTEXTSPLIT = ArrayOutOfString(sSource, sDelimiter)
end function
Die Funktion wird dann in der Zelle als Array-Funktion (d.h. mit Strg+Umschalt+Enter) eingetragen, z.B {=MYTEXTSPLIT(A3;" : ")}
.
Das ist meine bewährte übliche Arbeitsweise, jedoch nicht akzeptabel bei über 100 Zellen mit je 1–25 aneinander gereihten Namen. Ein Name kann komplex sein wie zB.:
Passstelle „Col de Tourmalet“ (2.345m)
Eine eindeutige Trennung der Namen ist zB.: " :: ", Leerzeichen-Doppelpunkt-Doppelpunkt-Leerzeichen.
So schön und einfach deine Formel ist, sie liefert mir keine brauchbaren Ergebnisse. Weil: übliche und korrekte Schreibweise folgt dem Komma das Leerzeichen: ", ".
Die Funktion =FINDEN(" : ")
(eindeutige Trennung, da unübliche Scheibweise!) ergibt deren erste Position im String der Zelle. Daraus lässt sich der erste Zeichen-Satz (erster Name) extrahieren mit =LINKS(A1;FINDEN(" : ";A1)-1)
.
Um den zweiten und weitere Namen zu extrahieren, ist Rechen-Arbeit zwingend, um die zuvorigen Trenner zu übergehen. Dabei liegen mir die Leerzeichen im Weg, die ja mitgezählt werden: siehe unterstrichene Ergebnisse!
Ab dem zweiten Namen muss auch=RECHTS()
gekürzt werden. Je mehr Namen in der Zelle, desto länger wird die Formel.
@koyotak
Ich weiß nicht, ob du es weißt, aber hier helfen freiwillige Helfer, in ihrer Freizeit.
Nicht einmal ein kurzes Feedback kommt von Dir? Weder zur Lösung von Villeroy noch zu
meiner o.a. Frage zu Thema Makrosicherheit.
Aus meiner Sicht handelst du unverschämt, empathiefrei. Aber jeder, wie er mag, von mir wird dir genau zweimal geholfen, zum ersten und zum letzen Mal.