Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1864to1868
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Alphabet. Sortieren Zeichen einer Zelle

Alphabet. Sortieren Zeichen einer Zelle
25.01.2022 15:12:42
Lars
Hallo zusammen,
ich habe ein einfaches Beispiel für ein problem, dass ich aktuell nicht lösen kann.
In einer Spalte (z.B. Spalte A) befinden sich Textinhalte. Zum Beispiel:
A/B
B/A
C/D
D/C
Ich möchte nun Folgendes erreichen: der Inhalt der einzelen Zellen Soll nach Möglichkeit alphabetisch sortiert werden.
Ich habe dies versucht, indem ich zuerst die Spalte nach Trennzeichen "/" getrennt habe, bin dann über transponieren, entpivotieren (in PQ), verschiedene Sortiermöglichkeiten etc. aber nicht zum gewünschten Ergebnis gekommen.
Das Ergebnis sollte dann wie folgt aussehen
A/B
A/B
C/D
C/D
Natürlich besitzt die Spalte, die ich in dieser Art aufbereiten möchte, weit über 1000 Zeilen, weshalb ich unbeding eine Formellösung, Lösung in PQ oder VBA benötigen würde.
Eine Beispieldatei habe ich für diese 4 Zeilen jetzt nicht erstellt. Ich denke das Beispiel ist klar.
Vielen Dank vorab.
Grüße
Lars

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Alphabet. Sortieren Zeichen einer Zelle
25.01.2022 15:54:33
Rudi
Hallo,
für immer 2 Werte:

Sub jens()
Dim arr, arrtmp, tmp, i
arr = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
For i = 1 To UBound(arr)
arrtmp = Split(arr(i, 1), "/")
If arrtmp(0) > arrtmp(1) Then
tmp = arrtmp(0)
arrtmp(0) = arrtmp(1)
arrtmp(1) = tmp
End If
arr(i, 1) = Join(arrtmp, "/")
Next
Cells(1, 1).Resize(UBound(arr)) = arr
Cells(1, 1).Sort key1:=Cells(1, 1), order1:=xlAscending, Header:=xlNo
End Sub
Gruß
Rudi
AW: Alphabet. Sortieren Zeichen einer Zelle
25.01.2022 16:05:42
Oberschlumpf
Hi Lars,
versuch es hiermit (und erst mal in einer Testdatei, in der du in Spalte A, beginnend in Zeile 1 deine gezeigten Bsp-Texte einträgst)

Sub sbSort()
Dim lloRow As Long, larstrSort() As String, liIdx As Integer, lloSort As Long
For lloRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row
larstrSort = Split(Range("A" & lloRow).Value, "/")
For liIdx = 0 To UBound(larstrSort)
Range("Z" & liIdx + 1).Value = larstrSort(liIdx)
Next
With ActiveSheet.Sort.SortFields
.Clear
.Add2 Key:=Range("Z1:Z" & Cells(Rows.Count, 26).End(xlUp).Row), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
End With
With ActiveSheet.Sort
.SetRange Range("Z1:Z" & Cells(Rows.Count, 26).End(xlUp).Row)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A" & lloRow).Value = ""
For lloSort = 1 To Cells(Rows.Count, 26).End(xlUp).Row
Range("A" & lloRow).Value = Range("A" & lloRow).Value & Range("Z" & lloSort).Value & "/"
Next
Range("A" & lloRow).Value = Left(Range("A" & lloRow).Value, Len(Range("A" & lloRow).Value) - 1)
Range("Z1:Z" & Cells(Rows.Count, 26).End(xlUp).Row).Value = ""
Next
End Sub
1. Mein Code überträgt den Inhalt aus Zelle A1 in die Arrayvariable larstrSort mit Hilfe des Befehls SPLIT; Trennzeichen ist immer "/"
2. Nun werden die Inhalte aus larstrSort in die von mir gewählte Hilfsspalte Z übertragen
3. Spalte Z wird alphabetisch von A-Z sortiert
4. Die sortierten Inhalte aus Spalte Z werden, wieder mit Trennzeichen "/" in Zelle A1 eingetragen
5. Inhalte aus Spalte Z werden gelöscht
6. Ab hier wiederholt sich 1. bis 5. für Zelle A2
7. Ab hier wiederholt sich 1. bis 5. für Zelle A3
8. Ab hier wiederholt sich 1. bis 5. für Zelle A4
...usw...
Sehr wahrscheinlich wirst du im Code einiges anpassen müssen, z Bsp Startzeile für Spalte A (oder beginnen deine Daten auch in A1?)
Ist bei dir Spalte Z frei? Wenn nein, musst du natürlich eine andere Hilfsspalte verwenden und entsprechend auch überall den Code, wo steht...

Range("Z1:Z" & Cells(Rows.Count, 26).End(xlUp).Row)
...die 26 gegen die von dir verwendete Spaltennummer anpassen
Hilfts?
Ciao
Thorsten
Anzeige
AW: das geht schon auch mit PQ ...
25.01.2022 18:40:00
neopa
Hallo Lars,
... aber ein entpivotieren braucht man dazu da nicht.
Die PQ-Schritte zur Lösung sind z.B. einfach so:
- Trennen an "/"
- benutzerdef. Spalte "Kleiner" hinzufügen mit if [...1] - benutzerdef. Spalte "Größer" hinzufügen mit if [...1] >= ...[...2] then [...1] else [...2]
- Ergebnisspalten zusammenführen und zwar mit Trennzeichen "/"
- überflüssigen Spalten entfernen.
- Endergebnisspalte abwärts sortieren lassen
- PQ Schließen und und laden in ...
Gruß Werner
.. , - ...
In XlWeb - für jeden kostenlos - mit einer Formel
25.01.2022 20:04:27
lupo1
=SORTIEREN(WENN(LINKS(A1:A5)&ltRECHTS(A1:A5);A1:A5;RECHTS(A1:A5)&LINKS(A1:A5)))
Anzeige
AW: In XlWeb - für jeden kostenlos - mit einer Formel
25.01.2022 20:21:55
Lars
Hallo zusammen,
Danke für die schnelle und hilfreichen Antworten. Die VBA-Lösingen habe ich heute Nachmittag beide ausprobiert anhand meines Beispiels ins Spalte A. Leider kamen bei beiden Varianten verschiedene Fehlermeldungen. Die anderen beiden Ansätze (PQ und Formel) werden ich noch testen und dann das passende rauspicken, sofern beide Ansätze funktionieren.
Vielen Dank euch allen und einen schönen Abend.
Grüße
Lars
AW: In XlWeb - für jeden kostenlos - mit einer Formel
25.01.2022 20:39:38
Oberschlumpf
Hi,
in meiner Bsp-Datei hat mein Code fehlerfrei funktioniert.
Du wolltest ja ohne Bsp-Datei eine Lösung - nun musst du nur deine Bsp-Zeilen korrekt in die Tabelle einfügen, auf die sich mein Code beziehen würde.
Ich hab deine Bsp-Daten in die Zellen A1 bis A4 eingetragen.
Ciao
Thorsten
Anzeige
Hier noch für Berta/Alzheimer (var. Wortlängen)
25.01.2022 20:42:26
lupo1
=SORTIEREN(LET(x;GLÄTTEN(TEIL(WECHSELN(A1:A5;"/";WIEDERHOLEN(" ";99));{1.100};99));
WENN(INDEX(x;;1)&gtINDEX(x;;2);INDEX(x;;2)&"/"&INDEX(x;;1);INDEX(x;;1)&"/"&INDEX(x;;2))))

Habe mal Deinen ganzen Betreff umsortiert, ...
30.01.2022 03:12:29
Luc:-?
…Lupo;
wobei Folgendes herauskam: (Hier noch für var. Wortlängen) Alzheimer/Berta
Die Fml dafür war deutlich kürzer als die Deinige (für nur 2 Begriffe!)… ;-]
Morhn, Luc :-?
Kann gut sein
30.01.2022 12:26:51
lupo1
1. hatte erfolglos quer-SORTIEREN mit NACHZEILE() versucht.
2. Zeig doch mal
Komme hiermit dem nach, ...
30.01.2022 15:24:35
Luc:-?
…Lupo:
=WECHSELN(VJoin(SortBy(5;PSplit(WECHSELN(PickOn(I34;{5.6.4});"(";"("&PickOn(I34;{1.2.3})&" ");{"`) "."/"}));"/");"/";"";1)
I34 enthält Deinen Betreff.
Die 2× verwendete UDF PickOn stellt im ZusammenSpiel mit innerem WECHSELN die Reihenfolge der WortBlöcke um.
Die neue und erst im Rahmen einer größeren Arbeit nach deren Fertigstellung zur Publikation vorgesehene UDF PSplit (bzw TTrennen) trennt Texte ´vor, `nach, ^vor&nach, 'an definierter (2.') Stelle in TextTeil oder auf TrennBegriff (Zeichen bzw ~Kombi), wobei auch mehrere mit eigenen Trenn­Typen als MatrixKonstante angegeben wdn können.
Die ebenfalls unveröffentlichte UDF SortBy sortiert die von PSplit erzeugten TextBlöcke bzw EinzelBegriffe nach diversen Verfahren, mit Arg1=5 nach dem QuickSort-Algorithmus, der im Netz (auch auf Wikipedia) zu finden ist.
Die UDF VJoin verbindet die TextTeile wieder, während das äußere WECHSELN den 1., als einzigen Verbinder der TextTeile verwendeten / entfernt. VJoin ist in höheren Versionen auch in der Lage, MatrixKonstanten als Text zu erzeugen, die dann mit anderer UDF evaluiert wdn könnten, weil auch die Original-US-Form einstellbar ist. In der lokalen Form müsste dann die XLM-Fkt AUSWERTEN in benannter Fml verwendet wdn. Insofern und auch in anderer Beziehung entspricht VJoin nicht der neuen Xl-Fkt TEXTVERKETTEN (TextJoin), weshalb eine Anpassung an letztere, wie sie Bernd (sulprobil) für seine Verkettungs-UDF vorgenommen hat, für VJoin nicht infrage kommen kann.
Gruß, Luc :-?
PS: Ich betrachte Deine Versuche mit neuen Xl-Fktt eher als Fktstests, weniger als sinnvolle Alternativen zu einfacheren Lösungen, von Ausnahmen mal abgesehen… ;-)
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Anzeige
Zu Deinem Postscriptum :)
30.01.2022 15:33:56
lupo1
LET und LAMBDA sind sicherlich nicht 100% so flexibel (und schon gar nicht so verständlich) wie VBA und
365 Insider-Beta ist oft eine Hürde (die man in Unternehmen gar nicht nehmen kann, nur privat),
aber:
Viele legen Wert auf .XLSX anstelle von .XLSM (obwohl das heute auch weniger kritisch ist).
Die LAMBDA-Helper sind jedenfalls schon eine tolle Sache.
LAMBDA
31.01.2022 01:53:22
Luc:-?
Was unterscheidet LAMBDA von LET, Lupo?
Mich erinnert diese Bezeichnung an das λ-Kalkül der theoretischen Informatik und die kleinen anonymen Lambda-Fktt in Python.
Ich gehe ansonsten davon aus, dass ich für mindestens eines von beiden schon vor Jahren eine Alternative entwickelt hatte, die ich inzwischen noch erweitert habe. Sie konnte und kann anstelle benannter Fml-Teile eingesetzt wdn. Und auch eine LET ähnlichere Variante habe ich nun erstellt. Das hat Bedarf gepaart mit langjährigem Fehlen derartiger µS-Angebote bzw die ggw µS-Verkaufspolitik bewirkt. ;-)
Von meiner vor gut 3 Jahren mal angedachten und in 1.Teilen vorgestellten andersartigen Fml-Notation mal abgesehen…
Morhn, Luc :-?
Anzeige
Ich bin kein Informatiker
31.01.2022 16:11:40
lupo1
... aber LAMBDA ist (in einer .XLSX) in der Lage,
- rekursiv zu codieren (das war ohne VBA bislang nicht möglich):
=LAMBDA(txt;chngrplc;
WENN(ZEILEN(chngrplc)=1;txt;SUBSTITUTE.STRINGS(
WECHSELN(txt;INDEX(chngrplc;1;1);INDEX(chngrplc;1;2));
INDEX(chngrplc;SEQUENZ(ZEILEN(chngrplc)-1;;2);{1.2}))))
benannt als SUBSTITUTE.STRINGS:
=SUBSTITUTE.STRINGS("ABCDEFG";{"ABC"."WXYZ";"ZDE"."PQRSTUVW";"".""}) ergibt WXYPQRSTUVWFG (verschachteltes WECHSELN)
als wesentliches Beispiel.
Die LAMBDA-Helper-Funktionen ermöglichen zusätzlich,
- Ergebnisse in dynamischen Feldern zu errechnen, ohne dafür Iteration verwenden zu müssen.
- statistische Funktionen zeilen- und spaltenzuseparieren:
=NACHZEILE({2.4.1;2.5.3};LAMBDA(arr;MAX(arr))) ergibt endlich {4;5} statt 5
als wesentliche Beispiele.
LET kann
- Zwischenstände berechnen
- Ausdrücke verkürzen und zentralisieren (weniger Fehler durch weniger Bezüge statt Variablen)
- Matrizen auch in ihrer Größe manipulieren, siehe folgendes Kreuztabellenbeispiel:
1 A
1 B
1 B
2 C
2 A
3 A
4 B
5 C
6 A
6 A
7 C
7 D
soll werden zu
A\B A B C D
1 1 2 0 0
2 1 0 1 0
3 1 0 0 0
4 0 1 0 0
5 0 0 1 0
6 2 0 0 0
7 0 0 1 1
mit
=LET(
a;A1:A12;
b;B1:B12;
x;EINDEUTIG(SORTIEREN(a));
y;MTRANS(SORTIEREN(EINDEUTIG(b)));
i;SEQUENZ(ZEILEN(x)+1);
j;SEQUENZ(;SPALTEN(y)+1);
xi;WENN(i=1;"";INDEX(x;i-1));
yj;WENN(j=1;"";INDEX(y;j-1));
WAHL((i=1)*2+(j=1)+1;ZÄHLENWENNS(a;xi;b;yj);xi;yj;"A\B"))

Anzeige
Gesichert: Danke, ...
31.01.2022 23:26:02
Luc:-?
…Lupo;
muss ich mir noch genauer ansehen und mit meinen aktuellsten UDFs vgln.
Morhn, Luc :-?
Hier noch-x erfolgl SCAN + NACHZEILE mit SORTIEREN
30.01.2022 12:44:56
lupo1
A1:A3:
Wer ist da
klopf doch mal an
sag endlich was
Der GLÄTTEN-Teil (GLÄWEXWDH) macht daraus einzelne Wörter in A1:J3 (+ Leerzellen am Schluss). Das daraus gewünschte
da ist Wer
an doch klopf mal
endlich sag was
jedoch versagt mit den folgenden 2 LAMBDA-Helper-Versuchen:
=NACHZEILE(
GLÄTTEN(TEIL(WECHSELN(A1:A3;" ";WIEDERHOLEN(" ";199));SEQUENZ(;9)*199-198;199));
LAMBDA(arr;SORTIEREN(arr;;;1)))
=SCAN(
SEQUENZ(ZEILEN(A1:A3));GLÄTTEN(TEIL(WECHSELN(A1:A3;" ";WIEDERHOLEN(" ";199));SEQUENZ(;9)*199-198;199));
LAMBDA(sort;arr;SORTIEREN(INDEX(arr;sort;);;;1)))

Vermutlich lässt SORTIEREN keine Verktoraufspaltung zu, was bei Statistikfunktionen wie MAX und SUMME geht.
Anzeige
Nun doch Erfolg! TEXTVERKETTEN eingeschleust
30.01.2022 13:07:13
lupo1
=NACHZEILE(GLÄTTEN(TEIL(WECHSELN(A1:A3;" ";WIEDERHOLEN(" ";199));SEQUENZ(;9)*199-198;199));LAMBDA(arr;TEXTVERKETTEN(" ";;SORTIEREN(arr;;;1))))
Mit SCAN ist es mir nicht gelungen.
Obige Funktion kann also mehr als 2 Wörter in ihrer Zeile isoliert sortieren, und das für mehrere Zeilen in nur einer Formel.
Gratulation! owT
30.01.2022 15:26:21
Luc:-?
:-?
AW: In XlWeb - für jeden kostenlos - mit einer Formel
26.01.2022 10:22:09
Michael
Moin,
bei dieser Formel würde ich im ELSE-Teil zwischen rechts(...) und links(...) noch ein &"/"& einfügen...
Aber vielleicht möchtest Du doch eine Formel ohne Überlauf? Sehr dicht am Beispiel (drei Zeichen: zwei Buchstaben getrennt durch "/") wäre das hier (bei A2 beginnen Deine Daten, diese Formel in Zeile 2 einfügen):

=WENN(CODE(LINKS(A2;1))>CODE(RECHTS(A2;1));RECHTS(A2;1)&"/"&LINKS(A2;1);A2)
VG
Michael
Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige