Autor: Uwe Küstner  --- Aus Excel VBA - Gruppe: Häufige Fragen

Sortieren benutzerdefiniert per Makro

Autor: Uwe Küstner - Erstellt: 2006-05      - Letzte Revision: --
Sortieren benutzerdefiniert per Makro

Sie möchten eine Tabelle per Makro benutzerdefiniert sortieren. Das ist machbar, wenn man vor der Sortierung eine benutzerdefinierte Liste definiert bzw. eine existente benutzerdefinierte Liste zur Sortierung heranzieht. Wie das "per Hand" funktioniert, habe ich Ihnen im Beitrag Sortieren Benutzerdefiniert geschildert. Nun hier die Beschreibung, wie Sie benutzerdefinierte Sortierung auch im Makro nutzen können.

Pro Sortiervorgang (also maximal drei Spalten) kann man nur eine Liste bestimmen. Excel wendet diese Liste dann auf die Spalte/n an, in der/denen es die entsprechenden Begriffe antrifft. Die Spalte/n in denen Excel diese Begriffe nicht vorfindet, werden standardmäßig je nach Angabe im Code auf- oder absteigend sortiert.

Nachstehend stelle ich Ihnen die nachfolgenden Varianten vor: Ableitend von diesen Beispielen können Sie nun Ihre eigene benutzerdefinierten Sortiermakros erstellen. Sie brauchen nur die Sortierkriterien im Array sowie die Zellbereiche (1. Zelle der Liste und zu sortierende Spalten anzupassen. Unter Beachtung, ob es sich um auf- oder absteigende Sortierung (descending/ascending) handeln soll.

Und hier eine Erklärung zum Code:

  • zu Beginn definieren wir in einem Array die gewünschte Sortierfolge und fügen diese als benutzerdefinierte Liste hinzu, wenn die Liste nicht bereits existierte
  • wenn Sie noch nicht existierte, wird sie an letzte Stelle der benutzerdefinierten Listen angehängt
  • falls die Liste vorher bereits existierte, wird gezählt, an wievielter Stelle sich die Liste innerhalb der Listen befindet
  • ansonsten wird davon ausgegangen, dass es die letzte neu zugefügte Liste ist
  • egal, ob die Liste bereits existierte oder nicht, wird die Listennummer jeweils für die Sortierung um 1 erhöht, da bei der Sort-Methode die 1 die Nummer für die Standardsortierung ist
  • nun folgt der Sortiercode, für den Einsatz der Liste sorgt dabei OrderCustom:=lngOC
  • falls die Liste vor Makroablauf noch nicht existierte, wird sie am Codeende wieder gelöscht
  • somit hinterlassen wir die benutzerdefinierten Listen nach Makroablauf im Ausgangszustand

Zum Blattanfang

Benutzerdefinierte Sortierung mit einer Liste:

 
Nachstehende Ausgangsliste soll nach unseren speziellen Anforderungen sortiert werden:
SpalteSortierung:Kriterium:Sortierfolge:Sortierrichtung
BbenutzerdefiniertLandUSA, D, GBaufsteigend
 

 
 ABCDE
1     
2 LandProduktUmsatz 
3 USAPlatte10,82 
4 DTeller7,55 
5 GBTeller21,44 
6 DKorb3,25 
7 USATasse43,92 
8 USAKorb11,31 
9 DPlatte24,68 
10 DTasse18,01 
11     
12 unsortierte Tabelle 
13     
 

 
 ABCDE
1     
2 LandProduktUmsatz 
3 USAPlatte10,82 
4 USATasse43,92 
5 USAKorb11,31 
6 DTeller7,55 
7 DKorb3,25 
8 DPlatte24,68 
9 DTasse18,01 
10 GBTeller21,44 
11     
12 sortierte Tabelle 
13     
 

Das erreichen Sie mit diesem Code:

Sub benutzerdefiniert_sortieren_mit_einer_Liste()
'von Uwe Küstner
Dim lngCLC As Long
Dim lngListExist As Long
Dim lngOC As Long
Dim vListArr As Variant
vListArr = Array("USA", "D", "GB")
lngListExist = Application.GetCustomListNum(vListArr)
If lngListExist > 0 Then
    lngOC = lngListExist + 1
Else
    Application.AddCustomList listArray:=vListArr
    lngCLC = Application.CustomListCount
    lngOC = lngCLC + 1
End If
Range("B2").Sort Key1:=Range("B3"), Order1:=xlAscending, _
    Header:=xlGuess, OrderCustom:=lngOC, _
    MatchCase:=False, Orientation:=xlTopToBottom
If lngListExist = 0 Then Application.DeleteCustomList ListNum:=lngCLC
End Sub


Grundsätzlich gilt die obige Codeerklärung.

Zum Blattanfang

Benutzerdefinierte Sortierung mit zwei Listen:

Wenn Sie nach verschiedenen Listen sortieren wollen, dann müssen Sie die Sortiercodes hintereinander reihen, da Excel pro Sortiervorgang nur eine Liste berücksichtigt.

Jeweils nach dem Muster:
Prüfen, ob Liste vorhanden, sonst neue Liste definieren - sortieren - Liste löschen, falls voher nicht vorhanden.
Dabei wird die untergeordnete Sortierung zuerst vorgenommen. Grundsätzlich trifft die obige Codeerklärung hier auch zu, halt so oft wie nötig wiederholt.

 
Nachstehende Ausgangsliste soll nach unseren speziellen Anforderungen sortiert werden:
SpalteSortierung:Kriterium:Sortierfolge:SortierrichtungRangfolge:
CbenutzerdefiniertProduktPlatte, Teller, Korb,  Tasseaufsteigenduntergeordnet
BbenutzerdefiniertLandUSA, D, GBaufsteigendübergeordnet
 

 
 ABCDE
1     
2 LandProduktUmsatz 
3 USAPlatte10,82 
4 DTeller7,55 
5 GBTeller21,44 
6 DKorb3,25 
7 USATasse43,92 
8 USAKorb11,31 
9 DPlatte24,68 
10 DTasse18,01 
11     
12 unsortierte Tabelle 
13     
 

 
 ABCDE
1     
2 LandProduktUmsatz 
3 USAPlatte10,82 
4 USAKorb11,31 
5 USATasse43,92 
6 DPlatte24,68 
7 DTeller7,55 
8 DKorb3,25 
9 DTasse18,01 
10 GBTeller21,44 
11     
12 sortierte Tabelle 
13     
 

Das erreichen Sie mit diesem Code:

Sub benutzerdefiniert_sortieren_mit_zwei_Listen()
'von Uwe Küstner
Dim lngCLC As Long
Dim lngListExist As Long
Dim lngOC As Long
Dim vListArr As Variant
'erste Sortierung
vListArr = Array("Platte", "Teller", "Korb", "Tasse")
lngListExist = Application.GetCustomListNum(vListArr)
If lngListExist > 0 Then
    lngOC = lngListExist + 1
Else
    Application.AddCustomList listArray:=vListArr
    lngCLC = Application.CustomListCount
    lngOC = lngCLC + 1
End If
Range("B2").Sort Key1:=Range("C3"), Order1:=xlAscending, _
    Header:=xlGuess, OrderCustom:=lngOC, _
    MatchCase:=False, Orientation:=xlTopToBottom
If lngListExist = 0 Then Application.DeleteCustomList ListNum:=lngCLC
'zweite Sortierung
vListArr = Array("USA", "D", "GB")
lngListExist = Application.GetCustomListNum(vListArr)
If lngListExist > 0 Then
    lngOC = lngListExist + 1
Else
    Application.AddCustomList listArray:=vListArr
    lngCLC = Application.CustomListCount
    lngOC = lngCLC + 1
End If
Range("B2").Sort Key1:=Range("B3"), Order1:=xlAscending, _
    Header:=xlGuess, OrderCustom:=lngOC, _
    MatchCase:=False, Orientation:=xlTopToBottom
If lngListExist = 0 Then Application.DeleteCustomList ListNum:=lngCLC
End Sub



Zum Blattanfang

Sortiermix: Benutzerdefinierte Liste kombiniert mit normaler Sortierung:

Wie Sie eine normale Sortierung mit einer benutzerdefinierten Sortierung kombinieren, zeige ich Ihnen hier:

 
Nachstehende Ausgangsliste soll nach unseren speziellen Anforderungen sortiert werden:
SpalteSortierung:Kriterium:Sortierfolge:SortierrichtungRangfolge:
DnormalUmsatz absteigenduntergeordnet
BbenutzerdefiniertLandUSA, D, GBaufsteigendübergeordnet
 

 
 ABCDE
1     
2 LandProduktUmsatz 
3 USAPlatte10,82 
4 DTeller7,55 
5 GBTeller21,44 
6 DKorb3,25 
7 USATasse43,92 
8 USAKorb11,31 
9 DPlatte24,68 
10 DTasse18,01 
11     
12 unsortierte Tabelle 
13     
 

 
 ABCDE
1     
2 LandProduktUmsatz 
3 USATasse43,92 
4 USAKorb11,31 
5 USAPlatte10,82 
6 DPlatte24,68 
7 DTasse18,01 
8 DTeller7,55 
9 DKorb3,25 
10 GBTeller21,44 
11     
12 sortierte Tabelle 
13     
 

Grundsätzlich trifft die obige Codeerklärung hier auch zu, halt nun in Kombination mit der normalen Sortierung. Um auszuschließen, dass die benutzersortierte Liste zufällig auch auf die normale Sortierung zutrifft, bauen sie zwei Sortierungen hintereinander im Code ein!

Das erreichen Sie mit diesem Code:

Sub Sortiermix()
'von Uwe Küstner
Dim lngCLC As Long
Dim lngListExist As Long
Dim lngOC As Long
Dim vListArr As Variant
vListArr = Array("USA", "D", "GB")
lngListExist = Application.GetCustomListNum(vListArr)
If lngListExist > 0 Then
	lngOC = lngListExist + 1
Else
	Application.AddCustomList listArray:=vListArr
	lngCLC = Application.CustomListCount
	lngOC = lngCLC + 1
End If
'erste sortierung "normal" und untergeordnet
Range("B2").Sort Key1:=Range("D3"), Order1:=xlDescending, Header:= _
	xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
'zweite Sortierung benutzerdefiniert übergeordnet
Range("B2").Sort Key1:=Range("B3"), Order1:=xlAscending, _
	Header:=xlGuess, OrderCustom:=lngOC, _
	MatchCase:=False, Orientation:=xlTopToBottom
If lngListExist = 0 Then Application.DeleteCustomList ListNum:=lngCLC
End Sub


Weitere Artikel der Gruppe: Häufige Fragen Aus Excel VBA
Nach oben