299 Aufrufe
Gefragt in Tabellenkalkulation von
Hallo zusammen,

[b]kurz ein paar Daten:[/b]

es geht um benutzerdefiniertes sortieren.

Die Spalte E in Tabelle1 welche eine Überschrift hat soll nach einen von mir bestimmten Muster sortiert werden.

[b]Tabelle1 - Spalte E [/b] - E2 bis E11 hat den Namen Lagersort1
[b]Tabelle2 - Spalte A   [/b] - A:A hat den Namen sort1
[b]Tabelle1 - Spalte E [/b] - hat eine Überschrift
[b]Tabelle2 - Spalte A[/b] - hat eine Überschrift
[b]Tabelle1 - Spalte A bis E[/b] - A1 bis E11 hat den Namen Lagersort2

Mit diesem Makro funktioniert es auch bisher:

[code]Sub sortieren()
    Application.ScreenUpdating = False
    ActiveWorkbook.Worksheets("Tabelle1").sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Tabelle1").sort.SortFields.Add Key:=Range( _
        "Lagersort1"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "1,3,5,7,9,2,4,6,8,nix" & "", DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Tabelle1").sort
        .SetRange Range("Lagersort2")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        .SortFields.Clear
    End With
    Application.ScreenUpdating = True
End Sub[/code]

Ich muss also in dem Makro die Sortierreihenfolge eingeben und hier kommen wir zu meinem Problem.

Ich möchte dem User selber entscheiden lassen wie er dies sortieren möchte aber nicht das da jeder im Makro rummacht.

Hierzu soll [b]Tabelle2 - Spalte A[/b] dienen welche den Namen [b]sort1 [/b]trägt.

Sollte im Makro in etwa so aussehen:

[code]Sub sortieren()
    Application.ScreenUpdating = False
    ActiveWorkbook.Worksheets("Tabelle1").sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Tabelle1").sort.SortFields.Add Key:=Range( _
        "Lagersort1"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "sort1" & "", DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Tabelle1").sort
        .SetRange Range("Lagersort2")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        .SortFields.Clear
    End With
    Application.ScreenUpdating = True
End Sub[/code]

Funktioniert natürlich nicht!. :-) Wie kann ich denn sowas realisieren?

Im Anhang mal meine Testdatei:

[url]https://www.dropbox.com/s/eu0ix3qnnrvm2oi/sort2.xlsm?dl=0[/url]


Danke euch.

Gruß
energun222

7 Antworten

+1 Punkt
Beantwortet von m-o Profi (20.4k Punkte)
Hallo,

so einfach mit einem Verweis auf die Spalte funktioniert die Sortierung leider nicht.
Du musst den Sortierschlüssel in eine Variable schreiben. So sollte das Makro funktionieren, wie du willst:

[code]Sub sortieren_neu()

Dim lngLetzte As Long
Dim strSort As String
Dim lngZeile As Long

Application.ScreenUpdating = False

With ThisWorkbook.Worksheets("Tabelle2")
 'letzte Zeile im Tabellenblatt mit den Sort-Kriterien einlesen
 lngLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
 'Sort-Kriterien in Variable schreiben und durch Komma trennen
 For lngZeile = 2 To lngLetzte
  strSort = .Cells(lngZeile, 1).Value & ","
 Next lngZeile

End With

'letztes Komma abschneiden
strSort = Left(strSort, Len(strSort) - 1)

'nun sortieren
ActiveWorkbook.Worksheets("Tabelle1").sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Tabelle1").sort.SortFields.Add Key:=Range( _
        "Lagersort1"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        strSort & "", DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Tabelle1").sort
        .SetRange Range("Lagersort2")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        .SortFields.Clear
    End With

Application.ScreenUpdating = True

End Sub[/code]
Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.

die Sortierung in Tabelle 1 sah vorher so aus:

1 2 3 4 5 6 7 8 9 nix

die Sortierung in Tabelle 1 sieht nach der Sortierung so aus:

nix 1 2 3 4 5 6 7 8 9

und so soltte sie aussehen:

1 3 5 7 9 2 4 6 8 nix

Ich habe dein Code einfach mal so übernommen. Der Code sortiert auch nur nicht so richtig. Muss ich da etwas anpassen oder überseh ich einfach nur was.?

Gruß
energun222
+1 Punkt
Beantwortet von m-o Profi (20.4k Punkte)
Hallo,

ja, da hat sich im Code leider ein Fehler eingeschlichen ;-(.
Ersetze die Zeile
[code]strSort = .Cells(lngZeile, 1).Value & ","[/code]
durch
[code]strSort = strSort & .Cells(lngZeile, 1).Value & ","[/code]
Dann sollte der Code richtig funktionieren.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.

funktioniert 1A.

Ich Dank Dir wieder einmal. Super Arbeit!

Gruß
energun222
+1 Punkt
Beantwortet von m-o Profi (20.4k Punkte)
Hallo,

immer wieder gern und danke für die Rückmeldung :-).

Gruß

M.O.
0 Punkte
Beantwortet von vernichter Mitglied (199 Punkte)

Hallo M.O.

bin immer noch der selbe Fragesteller, damals konnte man sich nicht registrieren deshalb steht jetzt hier ein anderer Name.

Es geht mir noch einmal um das Sortiermakro was natürlich nach 4 Jahren immer noch funktioniert. Ich versuche mich ein bisschen an diesen intelligenten Tabellen, was mir hier gefällt ist das man Formeln nicht bis sonst wohin ziehen muss. Jetzt hab ich natürlich die besagte Tabelle in eine intelligente Tabelle formatiert und schon funktionierte das Makro nicht mehr.

Ein bisschen Weiter bin ich aber schon.

Sub Lagerplaetze_sortieren()

    ' Hier erfolgt die Sortierung der KOM Plätze nach Lagerplätzen
    
    Dim lngLetzte As Long
    Dim strSort As String
    Dim lngZeile As Long

    Application.ScreenUpdating = False

    With ThisWorkbook.Worksheets("SORTIERREIHENFOLGE")
        'letzte Zeile im Tabellenblatt mit den Sort-Kriterien einlesen
        lngLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
        'Sort-Kriterien in Variable schreiben und durch Komma trennen
        For lngZeile = 2 To lngLetzte
         strSort = strSort & .Cells(lngZeile, 1).Value & ","
        Next lngZeile
    End With

    'letztes Komma abschneiden
    strSort = Left(strSort, Len(strSort) - 1)

    'nun sortieren
        ActiveWorkbook.Worksheets("KOM").ListObjects("TBL_KOM").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("KOM").ListObjects("TBL_KOM").Sort.SortFields.Add Key:=Range("TBL_KOM[Platz]"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=strSort & "", DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("KOM").ListObjects("TBL_KOM").Sort
        .SetRange Range("TBL_KOM[[#Headers],[Material]:[Platz]]")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        .SortFields.Clear
    End With
    
    Application.ScreenUpdating = True

End Sub

an dieser Stelle bringt es mir aber noch ein Fehler und komm einfach nicht dahinter

.SetRange Range("TBL_KOM[[#Headers],[Material]:[Platz]]")

Anwendungs- oder objektdefinierter Fehler

Vielleicht hast du noch einmal einen Tipp.

Mit freundlichen Grüßen

energun222

0 Punkte
Beantwortet von vernichter Mitglied (199 Punkte)

Hallo zusammen, hallo M.O.,

ich glaube ich weiß woran es liegt. Bei festen Tabellen kann man, auch "nur" einen bestimmten Bereich sortieren. Mir ist aufgefallen das, wenn ich nur einen Teil einer dynamischen Tabelle zum sortieren auswähle und dann auf sortieren klicke immer die komplette dynamische Tabelle ausgewählt und somit komplett sortiert wird.

Von daher hab ich jetzt einfach mal diesen Teil:

.SetRange Range("TBL_KOM[[#Headers],[Material]:[Platz]]")

weggelassen und es funktionierte wieder wie vorher. Ob das jetzt Auswirkung auf bestimmte Formeln oder andere Auswirkung hat kann ich noch nicht sagen.

Gruß

energun222

...