Excel: Sortieren nach 5 Schlüsseln

  • #1
T

tomcat13

Bekanntes Mitglied
Themenersteller
Dabei seit
05.01.2003
Beiträge
117
Reaktionspunkte
0
Ort
Bornheim
Hi @all,

leider kann Excel nur nach 3 Kriterien sortieren, ich brauche aber 5 Spalten, nach denen ich sortieren muß. Kann man das irgendwie machen?
 
  • #2
Hallo Tomcat13

Das geht:
Erst nach den 2 Untergeordneten- Kriterien, dann nach den 3 Haupt- Kriterien sortieren.
 
  • #3
Hallo zusammen,

wenn das öfter durchgeführt werden soll, kann man ein Makro verwenden.
Beispiel für ein rudimentäres:
Code:
Sub Excel_SortSpalten()

'<<< A N P A S S E N >>>

'erste Zeile mit Werten
Const cZ_ERSTEWERTEZEILE = 2

'SpaltenNr. der Spalte,
'aus der die letzte Zeile bestimmt werden soll
'(muß also einen Wert in der letzten Zeile haben)
Const cSP_LETZE_ZEILE_AUS_SPALTE = 1

'Array der Spalten, nach denen sortiert werden soll
'mindestens 1, nach oben keine Grenze
'Reihenfolge nach Priorität, höchste Priorität am Anfang
Dim SortierSpalten As Variant
SortierSpalten = Array(6, 3, 2, 5, 4, 7)

'<<< A N P A S S E N E N D E >>>

Dim lRows As Long, lCols As Long, x As Long, y As Long, sp As Long
Dim bOK As Boolean
Dim s As String, sTxt As String
Dim ws As Worksheet, r As Range
Set ws = ActiveSheet

'letzte Zeile des zu sortierenden Bereiches feststellen
lRows = ws.Cells(ws.Rows.Count, cSP_LETZE_ZEILE_AUS_SPALTE).End(xlUp).Row

'kann nicht sortiert werden ?
If cZ_ERSTEWERTEZEILE = lRows Then GoTo AUFRAEUMEN

'letzet Spalte des zu sortierenden Bereiches feststellen
lCols = ws.UsedRange.Column + ws.UsedRange.Columns.Count - 1

'zu sortierenden Range festlegen
Set r = ws.Range(ws.Cells(cZ_ERSTEWERTEZEILE, 1), ws.Cells(lRows, lCols))

'nacheinander nach den Spalten sortieren
'Reihenfolge: niedrige Priorität -> hoher Priorität
For x = UBound(SortierSpalten) To LBound(SortierSpalten) Step -1
 
 sTxt = SortierSpalten(x)
->Spaltenangabe auf Zulässigkeit prüfen
 bOK = True
 If Len(sTxt) = 0 Then
  bOK = False
 Else
  For y = 1 To Len(sTxt)
   s = Mid(sTxt, y, 1)
   Select Case s
    Case 0 To 9:
    Case Else:
     bOK = False: Exit For
   End Select
  Next
 End If
 
 If Not bOK Then
  MsgBox Spaltenangabe ist keine einfache Zahl & vbLf &-> & sTxt &->
 Else
  sp = sTxt
  If (sp < 1) Or (sp > lCols) Then
   MsgBox _
    Spaltenangabe außerhalb benutztem Bereich & vbLf &-> & sTxt &->
  Else
   r.Sort Key1:=ws.Cells(cZ_ERSTEWERTEZEILE, sp), ORDER1:=xlAscending, Header:=xlNo
  End If
 End If
Next

AUFRAEUMEN:
 Set ws = Nothing: Set r = Nothing
End Sub

Die anzupassenden Zeilen sind gekennzeichnet.


Oder noch eine 2.Variante, bei der die Sortierrichtung bzgl. der Spalten mit anzugeben ist.
Code:
Sub Excel_SortSpalten2()

'<<< A N P A S S E N >>>

'erste Zeile mit Werten
Const cZ_ERSTEWERTEZEILE = 2

'SpaltenNr. der Spalte,
'aus der die letzte Zeile bestimmt werden soll
'(muß also einen Wert in der letzten Zeile haben)
Const cSP_LETZE_ZEILE_AUS_SPALTE = 1

'Array der Spalten, nach denen sortiert werden soll
'mindestens 1, nach oben keine Grenze
'Reihenfolge nach Priorität, höchste Priorität am Anfang
'als 2. Parameter ist aufsteigend oder absteigend anzugeben

Const cAUF As String = aufsteigend
Const cAB As String = absteigend
Dim SortierSpalten As Variant

SortierSpalten = Array(6, cAUF, 3, cAB, _
            2, cAUF, 5, cAUF, _
            4, cAUF, 7, cAUF)

'<<< A N P A S S E N E N D E >>>

Dim lRows As Long, lCols As Long, x As Long, y As Long, sp As Long, lSortRichtung As Long
Dim bOK As Boolean
Dim s As String, sTxt As String, sAufAbSteigend As String
Dim ws As Worksheet, r As Range
Set ws = ActiveSheet

'letzte Zeile des zu sortierenden Bereiches feststellen
lRows = ws.Cells(ws.Rows.Count, cSP_LETZE_ZEILE_AUS_SPALTE).End(xlUp).Row

'kann nicht sortiert werden ?
If cZ_ERSTEWERTEZEILE = lRows Then GoTo AUFRAEUMEN

'letzet Spalte des zu sortierenden Bereiches feststellen
lCols = ws.UsedRange.Column + ws.UsedRange.Columns.Count - 1

'zu sortierenden Range festlegen
Set r = ws.Range(ws.Cells(cZ_ERSTEWERTEZEILE, 1), ws.Cells(lRows, lCols))

'nacheinander nach den Spalten sortieren
'Reihenfolge: niedrige Priorität -> hoher Priorität
For x = UBound(SortierSpalten) To LBound(SortierSpalten) Step -2
 
 sTxt = SortierSpalten(x - 1)
 sAufAbSteigend = SortierSpalten(x)
 
 If ((sAufAbSteigend = cAB) Or (sAufAbSteigend = cAUF)) Then
  
 ->Sortierrichtung
  If (sAufAbSteigend = cAUF) Then
   lSortRichtung = xlAscending
  Else
   lSortRichtung = xlDescending
  End If
 
 ->Spaltenangabe auf Zulässigkeit prüfen
  bOK = True
  If Len(sTxt) = 0 Then
   bOK = False
  Else
   For y = 1 To Len(sTxt)
    s = Mid(sTxt, y, 1)
    Select Case s
     Case 0 To 9:
     Case Else:
      bOK = False: Exit For
    End Select
   Next
  End If
  
  If Not bOK Then
   MsgBox Spaltenangabe ist keine einfache Zahl & vbLf &-> & sTxt &->
  Else
   sp = sTxt
   If (sp < 1) Or (sp > lCols) Then
    MsgBox _
     Spaltenangabe außerhalb benutztem Bereich & vbLf &-> & sTxt &->
   Else
    r.Sort Key1:=ws.Cells(cZ_ERSTEWERTEZEILE, sp), ORDER1:=lSortRichtung, Header:=xlNo
   End If
  End If
 Else
  MsgBox _
   Angabe Sortierrichtung unzul. & vbLf &-> & sAufAbSteigend &->
 End If
Next

AUFRAEUMEN:
 Set ws = Nothing: Set r = Nothing
End Sub
Gruß Matjes :)
 
Thema:

Excel: Sortieren nach 5 Schlüsseln

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.965
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben