Man kann auch einfach umsortieren ;)
Ausgangstabelle:
Überschrift 1 |
Überschrift 2 |
Überschrift 3 |
Überschrift 4 |
Ü1-3 |
Ü2-4 |
Ü3-2 |
Ü4-6 |
Ü1-4 |
Ü2-2 |
Ü3-7 |
Ü4-3 |
Ü1-1 |
Ü2-3 |
Ü3-3 |
Ü4-7 |
Ü1-2 |
Ü2-9 |
Ü3-4 |
Ü4-1 |
das Makro macht in einem Zwischenschritt daraus:
1 |
2 |
3 |
4 |
|
1 |
|
0 |
Überschrift 1 |
Überschrift 2 |
Überschrift 3 |
Überschrift 4 |
Ü1-3 |
Ü2-4 |
Ü3-2 |
Ü4-6 |
Ü1-4 |
Ü2-2 |
Ü3-7 |
Ü4-3 |
Ü1-1 |
Ü2-3 |
Ü3-3 |
Ü4-7 |
Ü1-2 |
Ü2-9 |
Ü3-4 |
Ü4-1 |
und sortiert um (Spalte 4 nach links, dann Spalte 2 daneben, dann die zwei Spalten links wie gehabt sortieren, danach alles wieder zurück sortieren).
Am Ende kommt das heraus:
Überschrift 1 |
Überschrift 2 |
Überschrift 3 |
Überschrift 4 |
Ü1-3 |
Ü2-9 |
Ü3-2 |
Ü4-1 |
Ü1-4 |
Ü2-2 |
Ü3-7 |
Ü4-3 |
Ü1-1 |
Ü2-4 |
Ü3-3 |
Ü4-6 |
Ü1-2 |
Ü2-3 |
Ü3-4 |
Ü4-7 |
Wie man sieht wurde nach Spalten 4 sortiert, zusammen mit Spalte 2 (die Zeilenzugehörigkeiten zwischen diesen beiden sind gleich geblieben) - Spalte 1 und 3 sind unverändert.
Option Explicit
Sub Test()
With Range("A1:D5")
'2 Zeilen über dem Datenbereich einfügen
With .Rows(1).Resize(2)
Call .Insert(xlShiftDown)
'1. Zeile: originale Spalten-Indizes
.Rows(1).Offset(-2).Formula = "=COLUMN()"
.Rows(1).Offset(-2).Value = .Rows(1).Offset(-2).Value
'2. Zeile: neue Sortierung
' Beispiel: nach 'Überschrift 4' und 'Überschrift 2'
.Rows(1).Offset(-1).Value = Array(, 1, , 0)
End With
'gesamten Bereich referenzieren (inkl. unser zwei Zeilen von oben)
With .Offset(-2).Resize(.Rows.Count + 2)
'durch Sort Spalte 'Überschrift 2' und 'Überschrift 4' nach links bringen
Call .Sort(Key1:=.Rows(2), Order1:=xlAscending, Orientation:=xlSortRows, Header:=xlNo)
End With
'Daten sortieren:
' nur die zwei linken Spalten betrachtend
With .Columns(1).Resize(, 2)
Call .Sort(Key1:=.Columns(1), Order1:=xlAscending, Orientation:=xlSortColumns, Header:=xlYes)
End With
'originalen Zustand wiederherstellen
With .Offset(-2).Resize(.Rows.Count + 2)
'durch Sort Spalte 'Überschrift 2' und 'Überschrift 4' nach links bringen
Call .Sort(Key1:=.Rows(1), Order1:=xlAscending, Orientation:=xlSortRows, Header:=xlNo)
End With
'die 2 Zeilen über den Datenbereich löschen
With .Offset(-2).Resize(2)
Call .Delete(xlShiftUp)
End With
End With
End Sub
|