Hallo zusammen,
ich habe ein Excel Tabellenblatt mit vielen Begriffen in fünf Spalten.
Ich möchte diese Matrix nun fortlaufend sortieren. Beispiel:
Apfel - Birne - Clementine - Dattel - Erdbeere
Feige - Gurke - Holunder - Indien - Jute
Kaki - Limette - usw
Also alphabetisch aufsteigend über die Zeilen-/Spaltengrenzen hinweg.
Gibt es dafür eine eingebaute Excel-Funktion?
Oder kann man es mit Formeln lösen?
Zur Not mit VBA?
Viele Grüße
Max
Hallöchen,
bei den Sortieroptionen kannst Du zwischen Zeilen und Spalten wechseln.
[
attachment=31747]
Ja, danke für die Info. Aber bei dieser Einstellung wird dann wieder nur innerhalb einer Zeile sortiert.
Ich möchte folgendes erreichen:
Ausgangsmatrix:
D F A T L
M B C X G
H E U R S
Zielmatrix:
A B C D E
F G H L M
R S T U X
Das gelingt weder mit spalten- noch zeilenweiser Sortierung.
Vom Prinzip her müsste man zuerst alle Einträge in eine große Liste schreiben und diese Liste dann sortieren.
Die sortierte Liste müsste dann "nur" noch (ähnlich wie bei einem Drucker) zeilenweise von links nach rechts als Matrix ausgegeben werden.
Hat Excel wirklich keine Bord-Tools, um eine Matrix in eine Liste zu überführen oder eine Liste als Matrix darzustellen?
Sortieren kann Excel ja mit Bordmitteln.
Ich bin da echt ratlos...
Viele Grüße
Max
Hallo Max,
wozu auch immer das gut sein soll, mit Bordmitteln wird das nicht gehen, weil in Excel der Grundsatz: eine Zeile - ein Datensatz gilt.
Hallo Klaus-Dieter,
vielen Dank für die Aufklärung, das war mir bisher so noch nicht bewusst.
Allerdings bin ich trotzdem überrascht, dass Excel diese (in meinen Augen doch recht simple) Funktion des Sortierens einer ungeordneten Matrix nicht beherrscht.
Nun gut, die Entwickler werden Ihre Gründe haben.
Also doch VBA
Viele Grüße
Max
Hallo Max,
VBA ist ja im Prinzip nichts schlechtes. Sind es immer 5 Spalten? Wie viele Zeilen können das maximal sein?
Hallo Max,
so z.B. mit VBA (markiere den Sortierbereich vorher):
Option Explicit
Sub SortKuwer()
Dim i As Long, j As Long, k As Long
Dim varB As Variant, varS As Variant
'varB = Range("Bereich").Value
varB = Selection.Value
ReDim varS(1 To UBound(varB, 1) * UBound(varB, 2))
For i = 1 To UBound(varB, 1)
For j = 1 To UBound(varB, 2)
k = k + 1
varS(k) = varB(i, j)
Next j
Next i
QuickSort_Feld varS, 1, UBound(varS), False
k = 0
For i = 1 To UBound(varB, 1)
For j = 1 To UBound(varB, 2)
k = k + 1
varB(i, j) = varS(k)
Next j
Next i
Selection.Offset(, 11).Value = varB
' Range("Bereich").Offset(,11).Value = varB
End Sub
Private Sub QuickSort_Feld(DasFeld, StartUnten, EndeOben, Absteigend As Boolean)
'QuickSort Standard
'https://www.online-excel.de/excel/singsel_vba.php?f=24
Dim iUnten As Long, iOben, iMitte, y
iUnten = StartUnten
iOben = EndeOben
iMitte = DasFeld((StartUnten + EndeOben) / 2)
While (iUnten <= iOben)
If Not Absteigend Then
While (DasFeld(iUnten) < iMitte And iUnten < EndeOben)
iUnten = iUnten + 1
Wend
While (iMitte < DasFeld(iOben) And iOben > StartUnten)
iOben = iOben - 1
Wend
Else
While (DasFeld(iUnten) > iMitte And iUnten < EndeOben)
iUnten = iUnten + 1
Wend
While (iMitte > DasFeld(iOben) And iOben > StartUnten)
iOben = iOben - 1
Wend
End If
If (iUnten <= iOben) Then
y = DasFeld(iUnten)
DasFeld(iUnten) = DasFeld(iOben)
DasFeld(iOben) = y
iUnten = iUnten + 1
iOben = iOben - 1
End If
Wend
If (StartUnten < iOben) Then
Call QuickSort_Feld(DasFeld, StartUnten, iOben, Absteigend)
End If
If (iUnten < EndeOben) Then
Call QuickSort_Feld(DasFeld, iUnten, EndeOben, Absteigend)
End If
End Sub
Code eingefügt mit: Excel Code Jeanie
Gruß Uwe
Moin!
Warum nicht einfach mit Bordmitteln (Formeln und sortieren)?
Mein Makro bezieht sich auf die Ausgangsmatrix A1:E3 und benutzt eine temporäre Hilfsmatrix S1:S15 (3 Zeilen * 5 Spalten = 15).
Es kann aber problemlos auf jedwede Ausgangsmatrix angepasst werden.
Sub Sort_special()
With Range("S1:S15")
.Formula = "=INDEX($A$1:$E$3,ROW(X5)/5,MOD(ROW(X5),5)+1)"
.Value = .Value
.Sort Range("S1")
End With
With Range("A1:E3")
.Formula = "=INDEX($S$1:$S$15,ROW(X1)*5+COLUMN(A9)-5)"
.Value = .Value
End With
Range("S1:S15").Clear
End Sub
Irgendwie schlank, gelle? :19:
Gruß Ralf
(16.05.2020, 08:29)RPP63 schrieb: [ -> ]Es kann aber problemlos auf jedwede Ausgangsmatrix angepasst werden.
Was ich hier mal umgesetzt habe.
Beliebigen Bereich markieren und AufGehts starten:
Sub AufGehts()
If TypeName(Selection) = "Range" Then Sort_Matrix_RPP Selection
End Sub
Sub Sort_Matrix_RPP(Bereich As Range)
Dim Zeilen&, Spalten&
Zeilen = Bereich.Rows.Count
Spalten = Bereich.Columns.Count
With Range("XFD1").Resize(Zeilen * Spalten)
.Formula = _
"=INDEX(" & Bereich.Address & _
",ROW(X" & Spalten & _
")/" & Spalten & _
",MOD(ROW(X" & Spalten & _
")," & Spalten & _
")+1)"
.Value = .Value
.Sort Range("XFD1")
End With
With Bereich
.Formula = _
"=INDEX(" & Range("XFD1").Resize(Zeilen * Spalten).Address & _
",ROW(X1)*" & Spalten & _
"+COLUMN(A9)-" & Spalten & ")"
.Value = .Value
End With
Range("XFD1").Resize(Zeilen * Spalten).Clear
End Sub
Hallo zusammen,
ich habe mal eine Testmappe erstellt mit drei verschiedenen Sortiermethoden: QuickSort, per Formeln wie von Ralf gezeigt und noch ein normales Sortieren in einem Blatt eines neuen temporären Workbooks.
Es wird ein Bereich von 10 Spalten mit einmal 100 und einmal 20000 Zeilen sortiert neben diesem Bereich zurückgeschrieben (zum bsseren Vergleich).
Das sind meine Vergleichsergebnisse in Sekunden:
1000 Zellen:
0,06640625 (FormelSort)
0,0625 (FormelSort)
0,06640625 (FormelSort)
0,06640625 (QuickSort)
0,0703125 (QuickSort)
0,05859375 (QuickSort)
0,12109375 (TabSort)
0,1171875 (TabSort)
0,12109375 (TabSort)
200000 Zellen:
3,53125 (FormelSort)
3,39453125 (FormelSort)
3,37890625 (FormelSort)
2,59765625 (QuickSort)
2,5078125 (QuickSort)
2,890625 (QuickSort)
2,35546875 (TabSort)
2,1953125 (TabSort)
2,2890625 (TabSort)
Gruß Uwe