16.05.2020, 13:06 (Dieser Beitrag wurde zuletzt bearbeitet: 16.05.2020, 13: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, 14:56 (Dieser Beitrag wurde zuletzt bearbeitet: 16.05.2020, 14: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?