Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zahlenwerte mit QuickSort in Spalte sortieren

Forumthread: 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?

Anzeige

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?

Anzeige
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
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Zahlenwerte mit QuickSort in Excel sortieren


Schritt-für-Schritt-Anleitung

Um die Zahlenwerte mit dem QuickSort-Algorithmus in Excel zu sortieren, folge diesen Schritten:

  1. Öffne den Visual Basic for Applications (VBA) Editor:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu:

    • Klicke mit der rechten Maustaste auf „VBAProject (DeineDatei.xlsx)“.
    • Wähle „Einfügen“ und dann „Modul“.
  3. Kopiere den folgenden VBA-Code in das Modul:

    Option Explicit
    Private Daten() As Double
    Private rng As Range
    
    Sub Main()
       Set rng = Range("AA22:AA8780")  ' Bereich der zu sortierenden Werte
       Einlesen
       Call Quicksort(Daten, 1, UBound(Daten))
       Set rng = Range("AB22:AB8780")  ' Zielbereich für die sortierten Werte
       Auslesen
       Debug.Print "fertig"
    End Sub
    
    Private Sub Einlesen()
       Dim i As Long
       ReDim Daten(rng.Rows.Count)
       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
       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
  4. Starte das Makro:

    • Führe das Makro „Main“ aus, um die Zahlenwerte in der Spalte AB zu sortieren.

Häufige Fehler und Lösungen

  • Fehler: "Zu wenig Speicher": Dieser Fehler tritt auf, wenn die Rekursionstiefe des QuickSort zu hoch ist. Reduziere die Anzahl der zu sortierenden Werte, um dies zu vermeiden.
  • Daten werden nicht korrekt sortiert: Stelle sicher, dass der Bereich in Set rng = Range("AA22:AA8780") korrekt angegeben ist.

Alternative Methoden

Wenn du den Excel Algorithmus nicht mit VBA programmieren möchtest, kannst du die Funktion KGROESSTE verwenden:

  1. Setze in Zelle AB22 die Formel:
    =KGROESSTE(AA$22:AA$8780;ZEILE(A1))
  2. Ziehe die Formel bis AB8780 nach unten.

Diese Methode ist einfach und benötigt keinen VBA-Code, eignet sich jedoch möglicherweise nicht für sehr große Datenmengen.


Praktische Beispiele

Angenommen, du hast in den Zellen AA22 bis AA8780 verschiedene Verkaufszahlen. Mit dem obigen VBA-Code sortierst du diese Zahlen in der Spalte AB, sodass die höchste Zahl in AB22 und die niedrigste in AB8780 steht.


Tipps für Profis

  • Optimierung des QuickSort: Du kannst den QuickSort-Algorithmus optimieren, indem du das Pivotelement besser auswählst, z. B. den Median von drei Werten.
  • Debugging: Nutze Debug.Print im Code, um den Fortschritt und die Werte während der Ausführung zu überwachen.

FAQ: Häufige Fragen

1. Was ist QuickSort? QuickSort ist ein effizienter, rekursiver Sortieralgorithmus, der ein „Teile und herrsche“-Prinzip verwendet, um Daten zu sortieren.

2. Wo kann ich QuickSort in Excel anwenden? Du kannst QuickSort verwenden, um große Datenmengen in Excel effizient zu sortieren, insbesondere wenn die Standard-Sortierfunktionen nicht ausreichen.

3. Benötige ich spezielle Kenntnisse, um den VBA-Code zu verwenden? Ein grundlegendes Verständnis von VBA ist hilfreich, um den Code anzupassen und Probleme zu beheben, aber die Schritte sind einfach gehalten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige