Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Sortierung mit variablen XLSortOrder

Betrifft: Sortierung mit variablen XLSortOrder von: Jens
Geschrieben am: 16.10.2014 11:31:35

Hallo zusammen,

ich brauche etwas Hilfe bei einer VBA-Programmierung fürs Sortieren per Userform. Mein momentaner Code sieht wie folgt aus: (Der Code ist noch nicht optimiert, versuche ihn erst zum laufen zu bringen)

Private Sub cmdSortierungAnwenden_Click()
    Dim i, lngSpalte1, lngSpalte2, lngSpalte3, lngSpalte4, lngSpalte5, lngLetzteZeile,  _
lngLetzteSpalte, AnzahlKriterien As Long
    Dim strSortierkriterien As String
    Dim strSortierArt1, strSortierArt2, strSortierArt3, strSortierArt4, strSortierArt5 As  _
XlSortOrder
    
    AnzahlKriterien = 0
    
    Call SortierenZurücksetzen
       
    With Sheets("Trafo")
        lngLetzteZeile = .Cells(1048576, 1).End(xlUp).Row
        lngLetzteSpalte = .Cells(1, 16384).End(xlToLeft).Column
        .AutoFilter.sort.SortFields.Clear
    End With
    
    'Anzahl Kriterien ermitteln und XlSortOrder festlegen
    With Befehle_Sortierung
    
        If .cboSortierSpalte1 <> vbNullString And .cboSortierArt1 <> vbNullString Then
            AnzahlKriterien = 1
            lngSpalte1 = Sheets("Trafo").Range("1:1").Find(What:=.cboSortierSpalte1).Column
            If .cboSortierArt1 = "aufsteigend" Then strSortierArt1 = "xlAscending" Else  _
strSortierArt1 = "xlDescending"
        Else
            If .cboSortierSpalte1 <> vbNullString Xor .cboSortierArt1 <> vbNullString Then GoTo  _
Fehlermeldung
        End If
        
        If AnzahlKriterien = 1 And Not .cboSortierSpalte2 = vbNullString And Not . _
cboSortierArt2 = vbNullString Then
            AnzahlKriterien = 2
            lngSpalte2 = Sheets("Trafo").Range("1:1").Find(What:=.cboSortierSpalte2).Column
            If .cboSortierArt2 = "aufsteigend" Then strSortierArt2 = "xlAscending" Else  _
strSortierArt2 = "xlDescending"
        Else
            If .cboSortierSpalte2 <> vbNullString Xor .cboSortierArt2 <> vbNullString Then GoTo  _
Fehlermeldung
        End If
        
        If AnzahlKriterien = 2 And .cboSortierSpalte3 <> vbNullString And .cboSortierArt3 <>  _
vbNullString Then
            AnzahlKriterien = 3
            lngSpalte3 = Sheets("Trafo").Range("1:1").Find(What:=.cboSortierSpalte3).Column
            If .cboSortierArt3 = "aufsteigend" Then strSortierArt3 = "xlAscending" Else  _
strSortierArt3 = "xlDescending"
        Else
            If .cboSortierSpalte3 <> vbNullString Xor .cboSortierArt3 <> vbNullString Then GoTo  _
Fehlermeldung
        End If
        
        If AnzahlKriterien = 3 And .cboSortierSpalte4 <> vbNullString And .cboSortierArt4 <>  _
vbNullString Then
            AnzahlKriterien = 4
            lngSpalte4 = Sheets("Trafo").Range("1:1").Find(What:=.cboSortierSpalte4).Column
            If .cboSortierArt4 = "aufsteigend" Then strSortierArt4 = "xlAscending" Else  _
strSortierArt4 = "xlDescending"
        Else
            If .cboSortierSpalte4 <> vbNullString Xor .cboSortierArt4 <> vbNullString Then GoTo  _
Fehlermeldung
        End If
        
        If AnzahlKriterien = 4 And .cboSortierSpalte5 <> vbNullString And .cboSortierArt5 <>  _
vbNullString Then
            AnzahlKriterien = 5
            lngSpalte5 = Sheets("Trafo").Range("1:1").Find(What:=.cboSortierSpalte5).Column
            If .cboSortierArt5 = "aufsteigend" Then strSortierArt5 = "xlAscending" Else  _
strSortierArt5 = "xlDescending"
        Else
            If .cboSortierSpalte5 <> vbNullString Xor .cboSortierArt5 <> vbNullString Then GoTo  _
Fehlermeldung
        End If
    
    End With
    
    'Sortierfall aussuchen
    Select Case AnzahlKriterien
    Case 1:
        Sheets("Trafo").Range(Cells(1, 1), Cells(lngLetzteZeile, lngLetzteSpalte)).sort _
        Key1:=Sheets("Trafo").Columns(lngSpalte1), Order1:=strSortierArt1, _
        Header:=xlYes
    Case 2:
        Sheets("Trafo").Range(Cells(1, 1), Cells(lngLetzteZeile, lngLetzteSpalte)).sort _
        Key1:=Sheets("Trafo").Columns(lngSpalte1), Order1:=strSortierArt1, _
        Key2:=Sheets("Trafo").Columns(lngSpalte1), Order2:=strSortierArt2, _
        Header:=xlYes
    Case 3:
        Sheets("Trafo").Range(Cells(1, 1), Cells(lngLetzteZeile, lngLetzteSpalte)).sort _
        Key1:=Sheets("Trafo").Columns(lngSpalte1), Order1:=strSortierArt1, _
        Key2:=Sheets("Trafo").Columns(lngSpalte1), Order2:=strSortierArt2, _
        Key3:=Sheets("Trafo").Columns(lngSpalte1), Order3:=strSortierArt3, _
        Header:=xlYes
    Case 4:
        Sheets("Trafo").Range(Cells(1, 1), Cells(lngLetzteZeile, lngLetzteSpalte)).sort _
        Key1:=Sheets("Trafo").Columns(lngSpalte1), Order1:=strSortierArt1, _
        Key2:=Sheets("Trafo").Columns(lngSpalte1), Order2:=strSortierArt2, _
        Key3:=Sheets("Trafo").Columns(lngSpalte1), Order3:=strSortierArt3, _
        Key4:=Sheets("Trafo").Columns(lngSpalte1), Order4:=strSortierArt4, _
        Header:=xlYes
    Case 5:
        Sheets("Trafo").Range(Cells(1, 1), Cells(lngLetzteZeile, lngLetzteSpalte)).sort _
        Key1:=Sheets("Trafo").Columns(lngSpalte1), Order1:=strSortierArt1, _
        Key2:=Sheets("Trafo").Columns(lngSpalte1), Order2:=strSortierArt2, _
        Key3:=Sheets("Trafo").Columns(lngSpalte1), Order3:=strSortierArt3, _
        Key4:=Sheets("Trafo").Columns(lngSpalte1), Order4:=strSortierArt4, _
        Key5:=Sheets("Trafo").Columns(lngSpalte1), Order5:=strSortierArt5, _
        Header:=xlYes
    End Select
    
    'Sortierung ausführen
    With Sheets("Trafo").AutoFilter.sort
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Trafo.txtSortierkriterien = strSortierkriterien
    Call EingabenEntfernen
    Call EingabefelderDeaktivieren
    Befehle_Sortierung.Hide

Exit Sub

Fehlermeldung:
    MsgBox "Sie haben nicht alle nötigen Eingaben für eine Sortierung eingegeben." & Chr(13) &  _
Chr(13) & "Bitte vervollständigen Sie ihre Eingaben.", , "BSC-Programm"

End Sub

Nun habe ich in der Userform ein Suchkriterium ausgesucht und habe xlDescending als XlSortOrder festgelegt, dann gibt mir Excel eine Fehlermeldeung in der fett markierten Zeile aus: "Die Sort-Methode des Range-Objektes konnte nicht ausgeführt werden."

Da ich die strSortierArt1-5 oben als XlSortOrder deklariert habe, verstehe ich nicht warum der Fehler kommt. Wäre schön wenn mir jemand helfen könnte.

Grüße
Jens

  

Betrifft: AW: Sortierung mit variablen XLSortOrder von: Daniel
Geschrieben am: 16.10.2014 11:39:02

Hi

wenn du eine Range über zwei Cells definierst und dabei ein bestimmtes Tabellenblatt angeben willst, dann muss dieses Tabellenblatt vor den beiden Cells stehen:

Range(Sheets("Trafo").Cells(1, 1), Sheets("Trafo").Cells(lngLetzteZeile, lngLetzteSpalte)).sort
befindet sich der Code in einem Tabellenblattmodul (ist hier nicht der fall), dann muss das Tabellenblatt zusätzlich vor der Range stehen:
Sheets("Trafo").Range(Sheets("Trafo").Cells(1, 1), Sheets("Trafo").Cells(lngLetzteZeile, lngLetzteSpalte)).sort
da das den Code etwas aufbläht, kann man mit Hilfe der Resize-Funktion den Zellbereich etwas weniger aufwendig beschreiben:
Sheets("Trafo").Cells(1, 1).Resize(lngLetzteZeile, lngLetzteSpalte).sort


als Key sollte man nur eine einzelne Zelle angeben, diese Zelle muss bestandteil des Sortierbereichs sein:
...Key1:=Sheets("Trafo").cells(1, lngSpalte1)...
Gruß Daniel


  

Betrifft: AW: Sortierung mit variablen XLSortOrder von: Jens
Geschrieben am: 16.10.2014 11:47:10

Hallo Daniel,

danke für die Tips, werde sie beim optimieren beachten.

Die Sortierung funktioniert so lange ich bei den Ordern "xlAscending" oder "xlDescending" direkt eingegeben habe. Sobald ich aber dort die Variable z.B. strSortierArt1 eingebe funktioniert die Sortierung nicht mehr.

Es hängt also an der Deklaration oben von der XlSortOrder oder vom benutzen unten der Variablen ab. Verstehe aber nicht was ich falsch gemacht habe.

Gruß
jens


  

Betrifft: AW: Sortierung mit variablen XLSortOrder von: Daniel
Geschrieben am: 16.10.2014 12:55:09

Hi
du verwechselst an dieser Stelle Variablen bzw Konstanten mit Textstrings.
die Ausdrücke xlAscending und xlDescending sind von VBA vorbelegte Konstanten, die einen Zahlenwert vom Typ LONG enthalten (xlAscending = 1, xldescending = 2)

deswegen muss du so programmiern:

Dim SortierArt1 as Long
...
if .cboSortierArt1 = "aufsteigend" Then strSortierArt1 = xlAscending Else _
 strSortierArt1 = xlDescending
für SortierArt2 und ähnliche dann entsprechend.

Gruß Daniel


  

Betrifft: AW: Sortierung mit variablen XLSortOrder von: Jens
Geschrieben am: 16.10.2014 13:39:44

Hallo Daniel,

ah ok, einfach die Gänsefüßchen weglassen und schwups hat es funktioniert.

Ich danke dir vielmals...

Gruß Jens


 

Beiträge aus den Excel-Beispielen zum Thema "Sortierung mit variablen XLSortOrder"