Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zahlenwerte mit QuickSort in Spalte sortieren

Zahlenwerte mit QuickSort in Spalte sortieren
31.07.2008 12:17:05
Timo
Hallo Ihr.
Ich habe ein etwas größeres Problem, welches ich mit meinen VBA- Kenntnissen nicht lösen konnte.
In meinem Tabelleblatt habe ich 8760 Zahlenwerte, ausgehend von AA22 bis AA8780 stehen. Diese Zahlenwerte möchte ich nun in die Spalte AB22:AB8780 kopieren und dort sollen sie dann der Größe nach geordnet werden. In AB22 soll der größte Zahlenwert und in AB8780 der kleinste Zahlenwert stehen.
Mit Hilfe des Makrorekorders hatte ich mir schon einen Code programmiert, der auch sehr gut funktionierte. Nun wollte ich es mal mit dem QuickSort- Algorithmus probieren, komme aber auf keinen grünen Zweig. Kann mir jemand den korrekten Code dafür zeigen?

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zahlenwerte mit QuickSort in Spalte sortieren
31.07.2008 12:30:00
Tobias
Hallo Timo!
Quicksort ist bei mir schon ein 2-3 Semester her. Ich hatte damals auch einen Quicksort für VBA programmiert. Leider nicht dokumentiert und mit saumäßigen Parameterübergaben versehen. Vielleicht hilft es Dir weiter.
Schönen Gruß, Tobi
http://www.tobiasschmid.de/


Call Quicksort(Data, 1, UBound(Data))




Private Function Quicksort(Data, links, rechts)
Dim Teiler As Long
If rechts > links Then
    Teiler = Teile(Data, links, rechts)
    Call Quicksort(Data, links, Teiler - 1)
    Call Quicksort(Data, Teiler + 1, rechts)
End If
End Function




Private Function Teile(Data, links, rechts)
Dim Index As Long
Dim i As Long
Index = links
For i = links To rechts - 1
    If Data(i) <= Data(rechts) Then
        Call Tausche(Data, Index, i)
        Index = Index + 1
    End If
Next
Call Tausche(Data, Index, rechts)
Teile = Index
End Function




Private Sub Tausche(Data, i, j)
Dim Temp As Double
Temp = Data(i)
Data(i) = Data(j)
Data(j) = Temp
End Sub


Anzeige
falls der Code funktioniert...
31.07.2008 12:34:00
Tobias
...wäre ein Feedback sehr schön. Dann könnte ich den Code wieder in meine Codesammlung aufnehmen.
Schönen Gruß, Tobias
http://www.tobiasschmid.de/

AW: falls der Code funktioniert...
31.07.2008 12:47:00
Timo
Ist jetzt bestimmt eine verdammt dumme Frage, aber wie passe ich diesen Code auf mein Bedürfnisse an? Also wie sage ich Excel, dass ich den Bereich AB22:AB8781 ordnen will?

AW: falls der Code funktioniert...
31.07.2008 13:03:00
Tobias
Upps. Ja, das stimmt. Der Code sortiert ein Array und keine Zellen. Probier's mal hiermit:


Option Explicit
Private Daten() As Double
Private rng As Range
Sub Einlesen()
    Dim i As Long
    Set rng = Range("A1:A100")
    ReDim Daten(rng.Rows.Count)
    For i = 1 To UBound(Daten)
        Daten(i) = rng(i, 1).Value
    Next
    Call Quicksort(Daten, 1, UBound(Daten))
    Auslesen
End Sub
Sub Auslesen()
    Dim i As Long
    For i = 1 To UBound(Daten)
        rng(i, 1) = Daten(i)
    Next
End Sub


Schönen Gruß, Tobias
http://www.tobiasschmid.de/

Anzeige
AW: falls der Code funktioniert...
31.07.2008 13:36:36
Timo
Bin irgendwie komplett auf Off. Könntest du mir bitte mal den gesamten, auf meine Bedürfnisse zugeschnittenen, Code posten? Bitte?

AW: falls der Code funktioniert...
31.07.2008 14:03:26
Tobias
Hallo Timo!
Mit diesem Code sollte es klappen. Die Dokumentation ist aber immer noch sehr dürftig.
Hinweis:
Es kann passieren, dass das Programm mit der Meldung "zu wenig Speicher" abbricht. Problem ist, das Quicksort ein rekursiver Sortieralgorithmus ist und unter ungünstigen Bedingungen zu viele Rekursionen notwendig werden um die Liste zu sortieren. Siehe hierzu auch Wikipedia. http://de.wikipedia.org/wiki/Quicksort

Im ungünstigsten Fall ist die Anzahl der Rekursionen nur durch die Listenlänge n beschränkt,  _
was einen
Stapel der Größe \mathcal{O}(n ) erfordert. Dies kann bei langen Listen zu einem Stapelüberlauf  _
führen. Es
gibt vielfältige Modifikationen des Algorithmus um dieses Problem zu lösen bzw. die  _
Wahrscheinlichkeit des
Auftretens zu vermindern[2]:
* Endrekursionsbeseitigung (siehe nachfolgenden Pseudocode)
* eine ausgewogenere Wahl des Pivotelements (Median von Drei)
* Wahl eines zufälligen Pivotelements, was systematische Probleme durch die ursprüngliche  _
Anordnung der Elemente vermeidet
* Vermeidung von Teilisten mit weniger als zwei Elementen (ergibt, wenn auch das  _
Pivotelement aus den Teillisten genommen wird, die maximale Rekursionstiefe n / 3)




Option Explicit
Private Daten() As Double
Private rng As Range
Sub Main()
    'Daten aus den Zellen AA22 bis AA8780 in das Datenfeld Daten kopieren
    Set rng = Range("AA22:AA8780")
    Einlesen
    'Daten mit Quicksort sortieren
    Call Quicksort(Daten, 1, UBound(Daten))
    'Daten wieder ins Excel-Sheet zurückschreiben
    Set rng = Range("AB22:AB8780")
    Auslesen
    'Kurze Meldung wenn fertig
    Debug.Print "fertig"
End Sub
Private Sub Einlesen()
    Dim i As Long
    ReDim Daten(rng.Rows.Count)
    'Zelleninhalte schnellstmöglich nach VBA lesen
    For i = 1 To UBound(Daten)
        Daten(i) = rng(i, 1)
    Next
End Sub
Private Sub Auslesen()
    Dim i As Long
    Dim var As Variant
    'VBA-Daten schnellstmöglich in Zellen schreiben
    var = rng
    For i = 1 To UBound(Daten)
        var(i, 1) = Daten(i)
    Next
    rng = var
End Sub
Private Function Quicksort(Data, links, rechts)
    Dim Teiler As Long
    If rechts > links Then
        Teiler = Teile(Data, links, rechts)
        Call Quicksort(Data, links, Teiler - 1)
        Call Quicksort(Data, Teiler + 1, rechts)
    End If
End Function
Private Function Teile(Data, links, rechts)
    Dim Index As Long
    Dim i As Long
    Index = links
    For i = links To rechts - 1
        If Data(i) <= Data(rechts) Then
            Call Tausche(Data, Index, i)
            Index = Index + 1
        End If
    Next
    Call Tausche(Data, Index, rechts)
    Teile = Index
End Function
Private Sub Tausche(Data, i, j)
    Dim Temp As Double
    Temp = Data(i)
    Data(i) = Data(j)
    Data(j) = Temp
End Sub


Ich hoffe, ich konnte Dir helfen, Tobi
http://www.tobiasschmid.de/

Anzeige
AW: falls der Code funktioniert...
31.07.2008 14:12:00
Timo
Es geht! Es geht!
Danke dir vielmals. Werde mir den Code jetzt mal bei ner schönen Tasse Kaffee anschauen.

AW: Zahlenwerte mit QuickSort in Spalte sortieren
31.07.2008 16:06:00
ioannis
Hallo,
eine andere Moeglichkeit ohne VBA waere:
In AB22-> KGROESSTE(AA$22:AA$8780;AC22) nach unten kopieren...
In AC22-> 1 nach unten kopieren...
Freundliche Gruesse
Ioannis

318 Forumthreads zu ähnlichen Themen


Hallo,
ein ähnliches Problem wurde hier im Forum schon einmal diskutiert. (https://www.herber.de/forum/archiv/632to636/t635773.htm)
Meine Problem:
Wie kann ich die Anzahl unterschiedlicher Einträge/Werte einer Spalte erhalten, ohne dass diese vorgegeben werden ( also ohne die Verwe...
Anzeige

Nabend alle miteinander
In einer bestimmten Zeile suche ich den letzten Eintrag. Bis zu diesem soll gefaerbt werden. Mit diesem Code faerbe ich den ganzen Bereich, es soll aber nur bis zum letzten Eintrag in der Zeile gefaerbt werden. Da von links nach rechts gefaerbt.
Case Is = Cells...

Hallo liebe Excel-Könner,
ich habe folgendes Problem und finde keine Lösung.
Ich habe in Spalte A von 2006 bis heute Datum stehen, über eine UserForm möche ich in zwei TextBoxen von bis Datum eintragen und in Spalte B in diesem Bereich den WertX.
Ich hoffe Ihr könnt mir helfen!
...
Anzeige

Hallo Leute,
wie kann ich folgendes ab Zeile 5 für aktive Zeile über VBA erreichen:
1. Wird der Wert in aktive Zeile in Spalte H eingetragen, dann sollen die Werte in Zellen der Spalte D und E gelöscht werden.
2. Wird der Wert in aktive Zeile in Splate D oder E eingetragen, dann sol...

Hallo Leute,
ich habe eine Frage zu UserForm. Beim Klick auf CommandButton1 sollen die Zahlen aus TextBox1 mit Werten in Spalte Q ab Zeile 12 ersetzt werden. Dies soll nur dann erfolgen, wenn in TextBox1 die Zahlen stehen bzw. der TextBox gefüllt ist.
Ersetzt sollen nur die vorhandene W...

Guten Morgen!
In eine mehrspaltige ListBox werden eine Menge Datensätze eingelesen.
Ich möchte nun folgendes erreichen:
Wenn ich einen Datensatz in der ListBox markiere oder anklicke und wenn jetzt z.B. in der 2.Spalte in der ListBox ein "J" steht, dann soll ein vordefinierter Text...
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige