Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1716to1720
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Sortierfunktion als Makro

Sortierfunktion als Makro
15.10.2019 14:26:20
Tobias
Hallo,
ich möchte folgenden händischen Ablauf als Makro automatisieren:
- Ausgang ist eine Tabelle mit Überschriften
- die Tabelle ist mitsamt der Überschriftszeile markiert/ausgewählt
Ablauf:
- Register Daten Sortieren
- im Dialogfenster Sortieren wird (durch dreimaliges Hinzufügen einer weiteren Ebene) zuerst nach Spalte A, dann B, dann C, dann D sortiert
- bei den Einstellungen unter Sortieren nach steht Werte
- bei den Einstellungen unter Reihenfolge steht A bis Z bzw. nach Größe (aufsteigend)
Danke für jeden Hinweis! Tobias

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Makrorecorder? owT
15.10.2019 14:36:15
Pierre
AW: Makrorecorder? owT
15.10.2019 14:48:09
Tobias
Hallo Pierre,
mit dem Recorder kommt das dabei heraus:
Sub Sortieren()
Rows("1:1").Select
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("A1:A53" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("B1:B53" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("C1:C53" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("D1:D53" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Tabelle1").Sort
.SetRange Range("A1:H53")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
blöd sind die konkreten Range-Angaben, da die Länge der Tabelle immer unterschiedlich ist ...
(Wie) lassen diese sich „verallgemeinern“?
Danke, Tobias
Anzeige
AW: Makrorecorder? owT
15.10.2019 15:10:31
Tobias
So scheint es zu funktionieren, danke für den Makro-Tipp!
Sub Sortieren ()
Columns("A:H").Select
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("A:A"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("B:B"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("C:C"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("D:D"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Tabelle1").Sort
.SetRange Range("A:H")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub

Anzeige
AW: Makrorecorder? owT
15.10.2019 15:55:49
Daniel
Hi
ich würde dir empfehlen, den aufgezeichneten Code noch so umzuschreiben.
With Sheets("Tabelle1")
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending,  _
DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=.Range("B:B"), SortOn:=xlSortOnValues, Order:=xlAscending,  _
DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=.Range("C:C"), SortOn:=xlSortOnValues, Order:=xlAscending,  _
DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=.Range("D:D"), SortOn:=xlSortOnValues, Order:=xlAscending,  _
DataOption:=xlSortNormal
.Sort.SetRange .Range("A:H")
.Sort.Header = xlYes
.Sort.MatchCase = False
.Sort.Orientation = xlTopToBottom
.Sort.SortMethod = xlPinYin
.Sort.Apply
End With
Vom Recorder aufgezeichneter Code ist meist nicht optimal (nicht nur in Bezug auf die festgelegten Zellbereiche), sondern aufgezeichneter Code funktioniert immer nur im aktiven Tabellenblatt.
der so umgeschriebene Code läuft auch, wenn das zu sortierende Tabllenblatt nicht das aktive Blatt ist.
Eine weitere Methode um den Zellbereich flexibel zu machen ist, dass man .sort.setrange nur die obere linke Zelle des Bereichs angibt. .Sort.SetRange .range("A1")
Excel erweitert dann diesen Bereich automatisch soweit, bis er vollständig von einer Leerzeile und Leerspalte begrenzt wird.
Gruß Daniel
Anzeige
AW: Makrorecorder? owT
15.10.2019 16:34:32
Tobias
Hi Daniel,
erstmal Danke!
Zu Deiner ersten Antwort, so funktioniert es super:
With Sheets("Tabelle1")
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=.Range("B:B"), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=.Range("C:C"), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
.Sort.SortFields.Add Key:=.Range("D:D"), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
.Sort.SetRange .Range("A:H")
.Sort.Header = xlYes
.Sort.MatchCase = False
.Sort.Orientation = xlTopToBottom
.Sort.SortMethod = xlPinYin
.Sort.Apply
End With
Wenn ich aber den unteren Bereich so abwandle (bzw. die erste Zeile), da passiert dann bei Ausführung des Makros einfach nichts ...:
.Sort.SetRange .Range("A1")
.Sort.Header = xlYes
.Sort.MatchCase = False
.Sort.Orientation = xlTopToBottom
.Sort.SortMethod = xlPinYin
.Sort.Apply
End With
Vermutlich habe ich das mit dem Hinweis
.Sort.SetRange .range("A1")
falsch verstanden?
Zu Deiner zweiten Variante: ich verstehe zu wenig von VBA, bzw. wurschtle mich durch das Makro so durch – aber es klappt ja jetzt mit der korrigierten Makro-Aufzeichnung, dabei würde ich es belassen.
Grüße,
Tobias
Anzeige
AW: Makrorecorder? owT
15.10.2019 17:17:57
Daniel
HI
kann sein, dass die neue Sortierfunktion damit nicht umgehen kann.
oder du hast ne Leerzeile in Zeile 2.
dann lass es so wie du es hast. Wenn die Spaltenanzahl konstant ist, ist das ja kein Fehler.
oder probiers mal mit .Range("A1").currentRegion
Gruß Daniel
AW: Makrorecorder? owT
16.10.2019 09:14:02
Tobias
Hi Daniel,
in der betreffenden Zeile, also anstelle
.Sort.SetRange .Range("A:H")
dann:
.Sort.Range("A1").currentRegion
funktioniert es nicht, aber als grundsätzliche Auswahl der Gesamt-Tabelle schon:
Range("A1").CurrentRegion.Select
Das kann ich bestimmt ein andermal gebrauchen! Den Rest lasse ich so wie er ist – funktioniert ja ...
Danke! Tobias
Anzeige
AW: Sortierfunktion als Makro
15.10.2019 14:44:18
Günther
Moin,
das kann 2016 auch prima ohne Makro automatisieren; => Daten | Abrufen und transformieren packt's!
Gruß
Günther
AW: Sortierfunktion als Makro
15.10.2019 14:51:02
Tobias
Hallo Günther,
Daten | Abrufen und transformieren sagt mir leider nichts. Es handelt sich hier auch um eine Funktion innerhalb eines umfangreicheren Makros.
Danke, Tobias
AW: Sortierfunktion als Makro
15.10.2019 14:54:18
Günther
Das hat auch nichts mit VBA zu tun sondern ist im ganz normalen Menü des Excel 2016 integriert.
Gruß
Günther
AW: Sortierfunktion als Makro
15.10.2019 15:01:01
Tobias
... hm, es scheint doch grundsätzlich zu gehen (s. meine Antwort an Pierre bzgl. des Recorders) – oder was meinst Du mit „hat auch nichts mit VBA zu tun“? Danke, Tobias
Anzeige
AW: Sortierfunktion als Makro
15.10.2019 15:23:52
Tobias
Ich korrigiere mich zur besseren Verständlichkeit:
Daten | Abrufen und transformieren sagt mir leider nichts. Es handelt sich hier – bei der gesuchten Anwendung der Sortierfunktion in Form eines Makros – auch um – nur eine – Funktion innerhalb eines – am Ende dann – umfangreicheren Makros.
AW: Sortierfunktion als Makro
15.10.2019 16:12:10
Daniel
Hi
fürs sortieren bevorzuge ich immer noch Schreibweise der alten Sortierfunktion von Excel 2003.
da diese nur 3 Sortierkriterien beherrscht, muss man in einer Schleife "rückwärts" sortieren:
dim sp
for each sp in Array(4, 3, 2, 1)
ActiveSheet.Cells(1, 1).Sort Key1:=Cells(1, sp) order1:=xlascending, Header:=xlyes
Next
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige