16.05.2020, 14:06 (Dieser Beitrag wurde zuletzt bearbeitet: 16.05.2020, 14:06 von RPP63.)
Interessant, @Uwe! Ich gestehe ja, dass ich (aus Faulheit!) nicht an eine Massenverarbeitung gedacht habe. Aus Erfahrung weiß ich hingegen, dass .Value = .Value Performance-Probleme hat. Wenn ich hingegen statt obigem jeweils (2*) folgendes nehme: .Copy .PasteSpecial xlPasteValues verbessere ich (bei mir) den Durchlauf der großen Matrix von 3,4 auf 2,4 Sekunden! (immerhin grob 30% und damit gleichwertig zu QuickSort!)
Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
16.05.2020, 15:56 (Dieser Beitrag wurde zuletzt bearbeitet: 16.05.2020, 15:56 von LCohen.)
In den neuen Excel-Versionen mit =SORTIEREN() geht folgendes als einzelne Formel (bitte an einer Stelle eintragen, wohinter nichts folgt, wegen #ÜBERLAUF!-Fehler):
Der Platzhalter ii kann (bzw. muss) durch das A1:E3 des Beispiels ersetzt werden: Strg-H, ii, A1:E3.
Oder ii stellt den definierten Namen über den Bereich A1:E3 dar. Dann kann es so bleiben. Ergibt Sinn für die Lesbarkeit.
Dadurch, dass die Formel dynamisch ist, kann man nun beliebig in A1:E3 Zeilen und Spalten einfügen oder löschen (natürlich nur so, dass der Bereich nicht #BEZUG!-korrumpiert wird).
Leider liegen die Testzeiten auf meinem Rechner weit weg von Uwe seinen Zeiten. (fast doppelt so lange) Eine Code Alternative wäre es mit ArrayList zu arbeiten. Zeitlich sollte das bei den anderen liegen.
Code:
Public Sub test() Dim j, Werte, ArrL As Object, z As Long, s As Long, a As Long, t
t = Timer Range("L1").CurrentRegion = ""
Set ArrL = CreateObject("System.Collections.ArrayList") Werte = Sheets(1).Cells(1).CurrentRegion For Each j In Werte ArrL.Add j Next j ArrL.Sort j = ArrL.toarray For z = 1 To UBound(Werte) For s = 1 To UBound(Werte, 2) Werte(z, s) = j(a) a = a + 1 Next s Next z Sheets(1).Cells(1).CurrentRegion.Offset(, 11) = Werte
Sub Anlegen() For i = 1 To 10 For j = 1 To 10 Cells(i, j) = "'" & Right("00" & Hex(Rnd() * 20000000), 6) Next j Next i
End Sub
Sub SortKuwer() ' sorry einfach übernommen Dim i As Long, j As Long, k As Long Set Col = New Collection
anf = Timer
varB = Cells(1).CurrentRegion
For i = 1 To UBound(varB, 1) For j = 1 To UBound(varB, 2) Col.Add varB(i, j) Next j Next i
Col_sort
k = 0 For i = 1 To UBound(varB, 1) For j = 1 To UBound(varB, 2) k = k + 1 varB(i, j) = Col(k) Next j Next i
Sheets(2).Range("A1").Resize(UBound(varB), UBound(varB, 2)) = varB Debug.Print Timer - anf End Sub
Sub Col_sort() For i = 1 To Col.Count - 1 For i2 = i + 1 To Col.Count If Col(i) > Col(i2) Then temp = Col(i2) Col.Remove i2 Col.Add temp, temp, i End If Next i2 Next i End Sub
Anstelle der Strings werden (beliebig) viele Hex generiert. Die Collection wird mit einem selbst-geschriebenen Algorithmus sortiert.
Könnte jemand einen Geschwindigkeitsvergleich ermitteln?