Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1384to1388
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 mit variablen XLSortOrder

Sortierung mit variablen XLSortOrder
16.10.2014 11:31:35
Jens
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

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sortierung mit variablen XLSortOrder
16.10.2014 11:39:02
Daniel
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

Anzeige
AW: Sortierung mit variablen XLSortOrder
16.10.2014 11:47:10
Jens
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

AW: Sortierung mit variablen XLSortOrder
16.10.2014 12:55:09
Daniel
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

Anzeige
AW: Sortierung mit variablen XLSortOrder
16.10.2014 13:39:44
Jens
Hallo Daniel,
ah ok, einfach die Gänsefüßchen weglassen und schwups hat es funktioniert.
Ich danke dir vielmals...
Gruß Jens

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige