Autor: Uwe Küstner --- Aus Excel VBA - Gruppe:
Häufige FragenSortieren 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: |
---|
Spalte | Sortierung: | Kriterium: | Sortierfolge: | Sortierrichtung | B | benutzerdefiniert | Land | USA, D, GB | aufsteigend | |
|
|
| | A | B | C | D | E | 1 | | | | | | 2 | | Land | Produkt | Umsatz | | 3 | | USA | Platte | 10,82 | | 4 | | D | Teller | 7,55 | | 5 | | GB | Teller | 21,44 | | 6 | | D | Korb | 3,25 | | 7 | | USA | Tasse | 43,92 | | 8 | | USA | Korb | 11,31 | | 9 | | D | Platte | 24,68 | | 10 | | D | Tasse | 18,01 | | 11 | | | | | | 12 | | unsortierte Tabelle | |
---|
13 | | | | | | | |
|
|
| | A | B | C | D | E | 1 | | | | | | 2 | | Land | Produkt | Umsatz | | 3 | | USA | Platte | 10,82 | | 4 | | USA | Tasse | 43,92 | | 5 | | USA | Korb | 11,31 | | 6 | | D | Teller | 7,55 | | 7 | | D | Korb | 3,25 | | 8 | | D | Platte | 24,68 | | 9 | | D | Tasse | 18,01 | | 10 | | GB | Teller | 21,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: |
---|
Spalte | Sortierung: | Kriterium: | Sortierfolge: | Sortierrichtung | Rangfolge: | C | benutzerdefiniert | Produkt | Platte, Teller, Korb, Tasse | aufsteigend | untergeordnet | B | benutzerdefiniert | Land | USA, D, GB | aufsteigend | übergeordnet | |
|
|
| | A | B | C | D | E | 1 | | | | | | 2 | | Land | Produkt | Umsatz | | 3 | | USA | Platte | 10,82 | | 4 | | D | Teller | 7,55 | | 5 | | GB | Teller | 21,44 | | 6 | | D | Korb | 3,25 | | 7 | | USA | Tasse | 43,92 | | 8 | | USA | Korb | 11,31 | | 9 | | D | Platte | 24,68 | | 10 | | D | Tasse | 18,01 | | 11 | | | | | | 12 | | unsortierte Tabelle | |
---|
13 | | | | | | | |
|
|
| | A | B | C | D | E | 1 | | | | | | 2 | | Land | Produkt | Umsatz | | 3 | | USA | Platte | 10,82 | | 4 | | USA | Korb | 11,31 | | 5 | | USA | Tasse | 43,92 | | 6 | | D | Platte | 24,68 | | 7 | | D | Teller | 7,55 | | 8 | | D | Korb | 3,25 | | 9 | | D | Tasse | 18,01 | | 10 | | GB | Teller | 21,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: |
---|
Spalte | Sortierung: | Kriterium: | Sortierfolge: | Sortierrichtung | Rangfolge: | D | normal | Umsatz | | absteigend | untergeordnet | B | benutzerdefiniert | Land | USA, D, GB | aufsteigend | übergeordnet | |
|
|
| | A | B | C | D | E | 1 | | | | | | 2 | | Land | Produkt | Umsatz | | 3 | | USA | Platte | 10,82 | | 4 | | D | Teller | 7,55 | | 5 | | GB | Teller | 21,44 | | 6 | | D | Korb | 3,25 | | 7 | | USA | Tasse | 43,92 | | 8 | | USA | Korb | 11,31 | | 9 | | D | Platte | 24,68 | | 10 | | D | Tasse | 18,01 | | 11 | | | | | | 12 | | unsortierte Tabelle | |
---|
13 | | | | | | | |
|
|
| | A | B | C | D | E | 1 | | | | | | 2 | | Land | Produkt | Umsatz | | 3 | | USA | Tasse | 43,92 | | 4 | | USA | Korb | 11,31 | | 5 | | USA | Platte | 10,82 | | 6 | | D | Platte | 24,68 | | 7 | | D | Tasse | 18,01 | | 8 | | D | Teller | 7,55 | | 9 | | D | Korb | 3,25 | | 10 | | GB | Teller | 21,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