Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1872to1876
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

Sortierung per VBA

Sortierung per VBA
10.03.2022 13:28:11
Chris
Hallo Forum,
ich möchte einen Liste per VBA sortieren.
1) Spalte O soll im ersten Schritt alphabetisch sortiert werden (hierbei sollen auch die Inhalte aus Spalte E jeweils erhalten bleiben)
2) In einem zweiten Schritt soll die Spalte E alphabetisch sortieren werden, jedoch soll die Sortierung der Spalte O aus dem ersten Schritt erhalten bleiben.
Wie löse ich dies per VBA? Ich habe eine Beispieldatei angehangen.
https://www.herber.de/bbs/user/151691.zip
VG
Chris

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

Betreff
Datum
Anwender
Anzeige
AW: Sortierung per VBA
10.03.2022 13:31:34
Pierre
Hallo Chris,
mach das mal händisch bei eingeschaltetem Makrorekorder, dann hast du den grundsätzlichen Code schonmal zusammen.
Das Verschönern des Codes kann dann gerne hier passieren.
Gruß Pierre
AW: Sortierung per VBA
10.03.2022 14:01:39
Chris
Hallo Pierre,
hier der Code aus dem Makro-Rekorder:
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("O1:O7") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").Sort.SortFields.Add Key:=Range("E1:E7") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Tabelle1").Sort
.SetRange Range("E1:O7")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Anzeige
AW: Sortierung per VBA
10.03.2022 14:27:52
Pierre
Hallo Chris,
hier mal das Makro, wie ich es umbauen würde:

Sub Sortieren()
Dim i As Long
With ThisWorkbook.Worksheets("Tabelle1")
i = .Cells(.Rows.Count, 15).End(xlUp).Row
Range("E1:O" & i).Sort _
key1:=Range("O1:O" & i), order1:=xlAscending, _
key2:=Range("E1:E" & i), order2:=xlAscending, Header:=xlGuess
End With
End Sub
Das hat jetzt nicht mehr viel mit deiner Aufzeichnung zu tun, aber dabei kommt auch viel "Müll" raus, den man einfach nicht braucht.
Es reicht, im Makro zu sagen: "Sortiere Bereich E:O, zuerst Spalte O aufsteigend, danach E aufsteigend."
Viel mehr sagt mein Makro nun auch nicht mehr aus.
Was sein sollte, da der Recorder das nicht aufzeichnet, du solltest immer die letzte beschriebene Zeile suchen lassen, was du mit der Zeile "i = .Cells ..." tust.
Hier ist nur zu beachten, in deiner echten Tabelle, dass du in der gleichen Zeile die 15 durch die Spalte austauschst, die definitiv am weitesten nach unten reicht. Habe jetzt einfach mal Spalte O (=15) genommen.
Du musst also deinen Code wieder löschen und dann meinen stattdessen einfügen, einen Button aufs Blatt legen und das Makro damit verknüpfen.
Hoffe, du kommst klar damit.
Im Prinzip könntest du deinen Code auch einfach stehen lassen, ich würde trotzdem empfehlen, die letzte Zeile dynamisch suchen zu lassen.
Achja: ganz WICHTIG: Header:=xlGuess würde ich vermeiden, du weißt ja, ob du Überschriften hast, oder nicht. Also entweder xlYes statt xlGuess nehmen, wenn du Überschriften hast, ansonsten xlNo.
Bei Guess kann (muss nicht) grober Unfug rauskommen, deswegen bitte vermeiden.
Gruß Pierre
Anzeige
AW: Sortierung per VBA
10.03.2022 15:53:22
Chris
Hallo Pierre,
danke, komme damit klar. Ich habe das Makro auf meine Bedürfnisse angepasst und lasse es über jede Sheet laufen.
Da die erste Zeile bei mir eine verbundene Zelle ist, funktioniert cells.rows.count nicht.... hab das mal ersetzt.
Das Hauptproblem ist, dass nur das aktive Sheet sortiert wird, die anderen nicht.
Hast du eine Idee woran das liegt?

Sub Sortierung
Dim ws As Worksheet
For Each ws In Sheets
With ws
i = Range("E:E").Find(What:="*", LookIn:=xlValues, Lookat:=xlWhole, SearchDirection:=xlPrevious).Row   '.Cells(.Rows.Count, 5).End(xlUp).Row
Range("E3:O" & i).Sort _
key1:=Range("O3:O" & i), order1:=xlAscending, _
key2:=Range("H3:H" & i), order2:=xlAscending, Header:=xlNo
End With
End If
Next
End Sub

Anzeige
AW: Sortierung per VBA
10.03.2022 16:12:05
Pierre
Hm...außer, dass dort ein "End If" steht und ich das "If" dazu nicht finde, kann ich leider gerade nichts dazu sagen.
Evtl. "Next ws"? Kann es aber eigentlich auch nicht sein.
Vielleicht löschst du mal das "End If", da sehe ich zumindest keinen Sinn hinter. (Meckert VBA da nicht eh rum?)
AW: Sortierung per VBA
10.03.2022 16:15:01
Chris
Hi,
ja, sorry.
End if habe ich bereits gelöscht...
Weiß auch nicht, warum nicht aktualisiert wird. Hilft vieleicht Application.windowstate = xlminimized und nach der Sortierung wieder maximized?
Gruß
Chris
AW: Sortierung per VBA
10.03.2022 17:20:34
Daniel
Hi
Du musst deinem VBA auch mitteilen, dass es auf dem Blatt DRS schleifenzählers arbeiten soll und nicht auf dem aktiven Blatt. Also WS.Range(...) oder wenn du die With WS-Klammer hast auch .Range (...), aber den Punkt bitte setzen.
Das gilt für jedes Range, auch in den Keys.
Apropos Keys: beim Key reicht es aus eine beliebige Zelle der Sortierspalte anzugeben.
Gruß Daniel
Anzeige
AW: Sortierung per VBA
11.03.2022 08:50:51
Pierre
Da war ich unaufmerksam gestern, die Punkte, ja klar...
Dass man nur eine Zelle angeben braucht beim sortieren, wusste ich nicht. Wieder was gelernt, danke!
In manchen (einigen) Punkten bin ich echt noch nicht soweit.
Gruß Pierre
AW: Sortierung per VBA
10.03.2022 17:07:51
peterk
Hallo
Du hast ein paar "." vergessen

Sub Sortierung
Dim ws As Worksheet
For Each ws In Sheets
With ws
i = .Range("E:E").Find(What:="*", LookIn:=xlValues, Lookat:=xlWhole, SearchDirection:=xlPrevious).Row   '.Cells(.Rows.Count, 5).End(xlUp).Row
.Range("E3:O" & i).Sort _
key1:=.Range("O3:O" & i), order1:=xlAscending, _
key2:=.Range("H3:H" & i), order2:=xlAscending, Header:=xlNo
End With
End If
Next
Peter
Anzeige
AW: Sortierung per VBA
11.03.2022 06:32:56
Chris
Hi,
ich habe die fehlenden Punkte eingearbeitet, erhalte jedoch "Laufzeitfehler 91 - ObjektVariabel oder With-BlockVariabel nicht festgelegt...."
Wo liegt der Fehler? Markiert wird die Zeile i =.range("E:E")....

Dim ws As Worksheet
Dim i As Long
For Each ws In Sheets
If ws.Name  "X1" And ws.Name  "X2" And ws.Name  "X3" And ws.Name  "X4" And ws.Name  "X5" Then
With ws
i = .Range("E:E").Find(What:="*", LookIn:=xlValues, Lookat:=xlWhole, SearchDirection:=xlPrevious).Row '.Cells(.Rows.Count, 5).End(xlUp).Row
.Range("E3:O" & i).Sort _
key1:=.Range("O3:O" & i), order1:=xlAscending, _
key2:=.Range("H3:H" & i), order2:=xlAscending, Header:=xlNo
End With
End If
Next ws
end sub

Anzeige
AW: Sortierung per VBA
11.03.2022 09:12:07
peterk
Hallo
Dann ist Deine Spalte E leer.
Peter
AW: Sortierung per VBA
11.03.2022 13:00:14
Chris
Hallo Peter,
danke für den Hinweis. Mir fällt nur on error resume next ein, um diesen fehler abzufangen, da manchmal tatsächliche die Spalte E leer ist.
Gruß
Chris
AW: Sortierung per VBA
11.03.2022 13:34:52
peterk
Hallo

Sub Sortierung()
Dim ws As Worksheet
Dim gefunden As Range
Dim i As Long
For Each ws In Worksheets
With ws
Set gefunden = .Range("E:E").Find(What:="*", LookIn:=xlValues, Lookat:=xlWhole, SearchDirection:=xlPrevious)
If Not (gefunden Is Nothing) Then
i = gefunden.Row
Range("E3:O" & i).Sort _
key1:=.Range("O3:O" & i), order1:=xlAscending, _
key2:=.Range("H3:H" & i), order2:=xlAscending, Header:=xlNo
End If
End With
Next
End Sub
Peter
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige