Excel VBA Felder Sortieren

Temujin123

Cadet 2nd Year
Registriert
Feb. 2005
Beiträge
29
Hallo,

ich hab Probleme bei nem Teil von meinem Makro. Ich habe ich für die Sortierung bereiche den Rekorder benutzt, weil ich nicht wusste, wie das in VBA zu schreiben ist. Dieser aufgenommene Code funktioniert bei einigen Excel Files einwandfrei, bei manchen spuckt er allerdings einen Laufzeitfehler 91 aus.

Es geht um folgenden Code:

Range("A1: D1").Select
Selection.AutoFilter
ActiveWorkbook.Worksheets("Messdaten").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Messdaten").AutoFilter.Sort.SortFields.Add Key:= _
Range("D1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Messdaten").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With


Die Zeile in fetter Schrift löst den Fehler aus.
Eigentlich möchte ich nichts anderes, als die Spalte "D" der Zeit aufsteigend zu sortieren ohne die Reihenfolge der restlichen 3 Spalten durcheinander zu bringen. Habe hierfür beim rekorden den Datenfilter von A bis D gesetzt und dann "Von A bis Z sortieren" ausgewählt. Wäre für jede Hilfe dankbar.

Liebe Grüße
 
eser aufgenommene Code funktioniert bei einigen Excel Files einwandfrei, bei manchen spuckt er allerdings einen Laufzeitfehler 91 aus.

Heißen die Tabellenblätter in den anderen Dateien euach "Messdaten"? Sonst kann er das Blatt ja nicht finden.
Sind die Arbeitsmappen beim Ausführen auch wirklich aktiv im Vordergrund? Sonst greift "ActiveWorkbook nicht.
 
Ja, das Macro benennt das erste Tabellenblatt in "Messdaten" bevor mit der restlichen Arbeit begonnen wird.
 
Hi, versuchs mal so:

oben diese Variable definieren:

Dim LetzteZelle As Long


Und dann folgendes in deinen Code:

ActiveWorkbook.Worksheets("Messdaten").Activate
LetzteZelle = IIf(IsEmpty(Cells(Rows.Count, 4)), Cells(Rows.Count, 4).End(xlUp).Row, Rows.Count)
Range("D1", Cells(LetzteZelle, 3)).Sort Key1:=Range("D1"), Order1:=xlAscending

Also alles was du geschrieben hast durch diese drei Zeilen ersetzen.
Das Filtern und die Selections sind nicht nötig.

Sag bitte Bescheid obs funktioniert hat!

LG
 
Funktioniert. Allerdings kommt der Bezug zu den Zeilen der anderen Spalten A bis C dadurch durcheinander. Jede Zeile enspricht einer spezifischen Messung von WLAN Netzen, MAC´s, Signalstärken und die jeweilige Zeit. Dieser Bezug stimmt danach nicht mehr, weil dadurch nur die Spalte D für sich nach Zeit sortiert wird. Das Ergebnis ist somit ein anderes, als wenn ich den Excel Datenfilter manuell benutze ; (

Hab dazu 2 Screenshots gemacht. Das erste Bild ist nach dem Ausführen von Deinem Code. Das zweite stellt den Sollzustand dar, den ich via Datenfilter erzeugt habe. (Bei beiden habe ich zum Schluss den Datenfilter auf die erste Zeit umgestellt, um zu vergleichen, ob die MAC´s etc. die korrekte Reihenfolge haben!)

SOLL.JPG

IST.JPG
 
Ok, ich dachte es soll nur die Zeile D sortiert werden, ohne erweiterten Bezug. Dann so:

ActiveWorkbook.Worksheets("Messdaten").Activate
LetzteZelle = IIf(IsEmpty(Cells(Rows.Count, 4)), Cells(Rows.Count, 4).End(xlUp).Row, Rows.Count)
Range("A1", Cells(LetzteZelle, 4)).Sort Key1:=Range("D1"), Order1:=xlAscending

Edit: Ich sehe du hast eine Überschrift drüber, dann am besten noch ", header:=xlYes" hinten dran (ohne die anführungszeichen) nicht das excel die noch irgendwann mitreinsortiert.

Kurze Erklärung dazu, falls sich an deiner Datei was ändert: In der letzten Zeile, die Range (hier: "Range("A1", Cells(LetzteZelle, 4))") gibt an, welcher Bereich sortiert werden soll. "Key1:=Range("D1")" ist dabei dann das erste Sortierfeld, d.h. wenn du hier z.B. C1 hättest, würdest du nach Spalte C sortieren.

Grüße
 
Zuletzt bearbeitet:
Zurück
Oben