🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Sort in Excel — Range.Sort gegenüber dem Sort-Objekt (und wie Sie die ursprüngliche Reihenfolge zurückbekommen)

|

VBA Sort in Excel — Range.Sort gegenüber dem Sort-Objekt (und wie Sie die ursprüngliche Reihenfolge zurückbekommen)

Kurz gesagt — Sortieren im Code ist ein dauerhaftes Umordnen: Es gibt kein Ctrl+Z, nachdem ein Makro gelaufen ist, sobald also .Sort auslöst, ist die ursprüngliche Zeilenreihenfolge weg, es sei denn, Sie haben sie gespeichert. Falls Sie sie zurückbrauchen könnten, fügen Sie vor dem Sortieren eine Indexspalte (1, 2, 3…) hinzu, damit Sie später zurücksortieren können. Übergeben Sie immer Header:=xlYes, sonst sortiert Excel womöglich Ihre Titelzeile in die Daten. Und sortieren Sie einen vollständigen Datensatz — die ganze Tabelle über CurrentRegion, nie eine einzelne Spalte, sonst ordnen Sie eine Spalte um und bringen den Rest durcheinander.

' Eine Tabelle nach Spalte C (3. Spalte im Bereich) absteigend sortieren - der ganze Datensatz wandert zusammen.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
With ws.Range("A1").CurrentRegion               ' ganze Tabelle, damit jede Spalte ausgerichtet bleibt
    .Sort Key1:=.Columns(3), Order1:=xlDescending, Header:=xlYes
End With

Sortieren wirkt wie der sicherste Vorgang in Excel — Sie tun es von Hand hundertmal am Tag und machen es mit einem Tastendruck rückgängig. Im Code ist dieses Sicherheitsnetz weg. Das mit Abstand Wichtigste, was man über das Sortieren in VBA verstehen muss, ist nicht die Syntax; es ist, dass ein Sortiervorgang in einem Makro eine Veränderung ist, die Sie nicht mal eben rückgängig machen können. Alles Weitere unten ist darum herum aufgebaut, Ihre Daten vor dieser Tatsache zu schützen, und dann um die Mechanik.

Was Sie lernen

  • Das mentale Modell — ein Sortiervorgang ist eine dauerhafte Veränderung, und wie Sie ihn umkehrbar machen
  • Die eine Regel, die Ihre Daten rettet — einen vollständigen Datensatz sortieren, nie eine einzelne Spalte
  • Header:=xlYes — warum das Weglassen Ihre Titel in die Daten fallen lässt
  • Range.Sort (schnell, Grenze von 3 Schlüsseln) vs das Sort-Objekt (ausführlich, unbegrenzt, dauerhaft)
  • Die SortFields.Clear-Falle — Sortierschlüssel von einem früheren Lauf erben
  • Warum als Text gespeicherte Zahlen als 1, 10, 2 sortieren — und wie Sie das beheben

Das mentale Modell: ein Sortiervorgang ist eine Veränderung, keine Ansicht

Die vorige Anleitung stellte AutoFilter als eine Ansicht dar — umkehrbar, nichts dauerhaft verbergend. Sort ist das Gegenteil: eine Veränderung. Es schreibt die Reihenfolge der Zeilen physisch neu. Es gibt kein verborgenes „Original“ darunter, das sich wiederherstellen ließe. Und ganz entscheidend: Application.Undo funktioniert nicht, nachdem ein Makro sortiert hat — laufendes VBA leert Excels Undo-Stapel, sodass auch der Nutzer nicht Ctrl+Z drücken kann.

Das ändert, wie Sie vor jedem Sortieren denken sollten: Wenn diese Reihenfolge wichtig ist, muss ich sie selbst bewahren. Der billige, kugelsichere Weg ist eine Indexspalte — prägen Sie den Zeilen 1, 2, 3… ein, bevor Sie sortieren, sodass „zurück zum Original sortieren“ nur ein Sortieren nach dieser Spalte ist:

' VOR dem Sortieren eine Spalte fuer die Wiederherstellungsreihenfolge hinzufuegen.
Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
    ws.Cells(i, "Z").Value = i - 1        ' 1, 2, 3... in einer freien Spalte
Next i
' ...jetzt beliebig sortieren; zum Wiederherstellen nach Spalte Z aufsteigend sortieren.

Machen Sie sich diese Gewohnheit für jeden Sortiervorgang zu eigen, dessen ursprüngliche Reihenfolge Sie brauchen könnten, und das Problem „es gibt kein Rückgängig“ verschwindet.

Die wichtigste Regel: den ganzen Datensatz sortieren, nicht eine Spalte

Das ist der Fehler, der klammheimlich Daten zerstört. Wählen Sie eine Spalte aus und sortieren sie, ordnet Excel nur diese Spalte um und lässt jede andere Spalte, wo sie war. Namen stehen nun bei den falschen Telefonnummern; Rechnungs-IDs zeigen auf die falschen Beträge. Nichts wirft einen Fehler — das Blatt wird einfach klammheimlich und dauerhaft falsch.

' FALSCH - sortiert Spalte B allein und reisst sie vom Rest jeder Zeile los.
ws.Range("B2:B100").Sort Key1:=ws.Range("B2"), Order1:=xlAscending

' RICHTIG - die ganze Tabelle sortieren; jede Spalte reist mit ihrer Zeile.
ws.Range("A1").CurrentRegion.Sort Key1:=ws.Range("B2"), Order1:=xlAscending, Header:=xlYes

Die Regel: sortieren Sie den kleinsten Bereich, der noch ein vollständiger Datensatz ist. In der Praxis heißt das die ganze Tabelle — Range("A1").CurrentRegion greift den zusammenhängenden Block für Sie. Der Sortierschlüssel kann eine einzelne Spalte sein; der Sortierbereich muss jede Spalte des Datensatzes umfassen. Das ist genau dieselbe Ausrichtungslektion wie das Löschen einer einzelnen Zelle statt einer ganzen Zeile — ordnen Sie einen Teil eines Datensatzes um, und Sie beschädigen ihn ganz.

Header:=xlYes, sonst werden Ihre Titel in die Daten sortiert

Range.Sort hat ein Header-Argument, und sein Standardwert ist xlGuess — Excel versucht zu erkennen, ob die erste Zeile eine Kopfzeile ist. Rät es falsch, werden Ihre Spaltentitel wie jede andere Zeile in die Daten hinuntersortiert und landen irgendwo in der Mitte. Lassen Sie es nie raten:

.Sort Key1:=.Columns(1), Order1:=xlAscending, Header:=xlYes   ' erste Zeile sind Titel - liegen lassen

Übergeben Sie Header:=xlYes, wenn Ihr Bereich die Kopfzeile einschließt (der übliche Fall), xlNo, wenn es reine Daten sind. Dieses eine Argument verhindert den klassischen „meine Kopfzeilen landeten in Zeile 43“-Bug.

Zwei Wege zu sortieren: Range.Sort gegenüber dem Sort-Objekt

VBA gibt Ihnen zwei APIs, und sie tauschen Kürze gegen Mächtigkeit.

Range.Sort ist der schnelle — eine einzige Anweisung mit bis zu drei Sortierschlüsseln (Key1/Key2/Key3). Perfekt für den häufigen Fall:

' Nach Region (aufsteigend), dann nach Amount (absteigend) innerhalb jeder Region sortieren.
ws.Range("A1").CurrentRegion.Sort _
    Key1:=ws.Range("B1"), Order1:=xlAscending, _
    Key2:=ws.Range("C1"), Order2:=xlDescending, _
    Header:=xlYes

Das Worksheet.Sort-Objekt ist der ausführliche — Sie fügen SortFields einzeln hinzu —, aber es hebt die Grenze von drei Schlüsseln auf und unterstützt das Sortieren nach Zellfarbe, Schriftfarbe und Symbol, was Range.Sort nicht kann. Es bleibt zudem bestehen: Die Sortiereinstellungen haften am Blatt, was genau der Grund für seine scharfe Kante ist.

With ws.Sort
    .SortFields.Clear                       ' <-- KRITISCH: zuerst verbliebene Schluessel verwerfen
    .SortFields.Add Key:=ws.Range("B2:B100"), Order:=xlAscending
    .SortFields.Add Key:=ws.Range("C2:C100"), Order:=xlDescending
    .SetRange ws.Range("A1").CurrentRegion
    .Header = xlYes
    .Apply
End With

Die Falle, die das Sort-Objekt ausmacht: SortFields.Clear muss zuerst kommen. Weil die Sortierfelder am Arbeitsblatt bestehen bleiben, sind alle Schlüssel, die ein früherer Makrolauf — oder ein von Hand sortierender Nutzer — hinterlassen hat, immer noch da. Lassen Sie .Clear weg, und Sie sortieren nach den alten Schlüsseln plus Ihren neuen, in einer Mischung, um die Sie nie gebeten haben. Meine Regel: Greifen Sie für alles bis zu drei Schlüsseln zu Range.Sort und wechseln Sie nur dann zum Sort-Objekt, wenn Sie wirklich mehr Schlüssel oder eine Farb-/Symbolsortierung brauchen — und wenn ja, ist SortFields.Clear die erste Zeile innerhalb des With.

Die Datentyp-Falle: als Text gespeicherte Zahlen

Ein Sortiervorgang, der „in der falschen Reihenfolge herauskommt“, ist fast immer ein Datentyp-Problem. Ist eine Spalte mit Zahlen tatsächlich als Text gespeichert — häufig nach dem Import aus CSV oder dem Web —, sortiert Excel sie lexikalisch, Zeichen für Zeichen: „1“, „10“, „2“, „21“, „3“. Die Werte sehen aus wie Zahlen und sortieren wie Wörter.

Die Lösung liegt weiter oben: Wandeln Sie die Spalte vor dem Sortieren in echte Zahlen um, sodass 2 vor 10 sortiert. Das ist eine Umwandlungsaufgabe — siehe CStr, CDate und Val zum Verwandeln von importiertem Text in echte numerische Typen. Sobald die Spalte echte Zahlen enthält, stimmt die Sortierung; kein noch so ausgeklügeltes Anpassen der Sortierargumente behebt Text, der sich als Zahlen ausgibt.

Wie ExcelMaster hilft

Sortieren verbirgt seine Gefahren hinter einem vertrauten, freundlichen Vorgang: das fehlende Header:=xlYes, das Ihre Titel begräbt, die Einzelspaltensortierung, die Datensätze durcheinanderbringt, das fehlende SortFields.Clear, das veraltete Schlüssel erbt, die Text-als-Zahlen-Reihenfolge und vor allem die Tatsache, dass es kein Rückgängig gibt, sobald ein Makro gelaufen ist. Keine davon wirft einen Fehler — sie lassen Ihre Daten einfach falsch umgeordnet und nicht wiederherstellbar zurück.

ExcelMaster lässt Sie die gewünschte Sortierung beschreiben. Sagen Sie „sortiere nach Region, dann nach Betrag, höchster zuerst“, und es sortiert den ganzen Datensatz (nicht eine Spalte), setzt Header ausdrücklich, räumt veraltete Sortierfelder und — weil es das Blatt zuerst sichert — lässt Ihnen einen Weg zurück, obwohl Excels eigenes Rückgängig weg ist. Sie behalten die Arbeitsmappe und den Code; Sie sparen sich den Teil, in dem eine Einspaltensortierung klammheimlich jeden Namen von seiner Nummer löst.

Häufig gestellte Fragen

Kann ich eine von einem VBA-Makro durchgeführte Sortierung rückgängig machen?

Nein. Das Ausführen eines Makros leert Excels Undo-Stapel, sodass weder Ihr Code noch der Nutzer eine von einem Makro durchgeführte Sortierung mit Ctrl+Z rückgängig machen kann. Schützen Sie die ursprüngliche Reihenfolge vor dem Sortieren selbst — am einfachsten, indem Sie eine Indexspalte einprägen (1, 2, 3…), sodass Sie später zu ihr zurücksortieren können, oder das Blatt zuerst sichern.

Warum hat meine VBA-Sortierung die Daten durcheinandergebracht?

Fast immer, weil Sie eine einzelne Spalte statt des ganzen Datensatzes sortiert haben. Das Sortieren einer Spalte ordnet nur diese Spalte um und lässt die anderen an Ort und Stelle, sodass die Werte jeder Zeile nicht mehr zusammengehören. Sortieren Sie die gesamte Tabelle — Range("A1").CurrentRegion — mit dem Sortierschlüssel, der auf die Spalte zeigt, die Sie geordnet haben wollen.

Wie hindere ich VBA daran, meine Kopfzeile in die Daten zu sortieren?

Übergeben Sie Header:=xlYes an .Sort (oder setzen Sie .Header = xlYes am Sort-Objekt). Der Standardwert ist xlGuess, der Excel die Kopfzeile zu erkennen versuchen lässt und Ihre Titel manchmal in die Zeilen hinuntersortiert. xlYes ausdrücklich zu setzen hält die erste Zeile als Kopfzeile fest.

Was ist der Unterschied zwischen Range.Sort und dem Sort-Objekt in VBA?

Range.Sort ist eine einzige Anweisung, begrenzt auf drei Sortierschlüssel — schnell und richtig für die meisten Aufgaben. Das Worksheet.Sort-Objekt fügt Schlüssel einzeln mit SortFields.Add hinzu, unterstützt unbegrenzt viele Schlüssel und das Sortieren nach Farbe oder Symbol und behält seine Einstellungen am Blatt — Sie müssen also zuerst SortFields.Clear aufrufen, um nicht alte Schlüssel zu erben.

Warum setzt meine VBA-Sortierung 10 vor 2?

Weil diese Zahlen als Text gespeichert sind, und Text sortiert lexikalisch („1“, „10“, „2“) statt numerisch. Wandeln Sie die Spalte vor dem Sortieren in echte Zahlen um — siehe die CStr/Val-Umwandlungsanleitung — und die Werte sortieren in echter numerischer Reihenfolge.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 08.08.2026.

Verwandte Anleitungen: VBA Find · VBA AutoFilter · VBA CStr, CDate und Val · VBA Zeilen löschen · VBA Range