Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1552to1556
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

Sortierung
11.04.2017 08:31:27
Daniel2
Hallo Leute :)
Ich habe eine Tabelle mit mehreren 100ten Einträgen.
Als kleinen Auszug hab ich mal eine Beispielmappe beigefügt.
Ich möchte gerne die Werte sortieren. Da durch die Filtermethode die Werte leider nicht richtig sortiert werden, habe ich es mit einem Bubblesort versucht.
Auch hier klappt es nicht, seht selbst.
Ich wär euch sehr dankbar, wenn mir jmd. sagen kann was ich am Code ändern muss bzw. warum der Computer so handelt.
https://www.herber.de/bbs/user/112797.xls
Gruß
Daniel

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sortierung
11.04.2017 08:58:12
ChrisL
Hi Daniel
Ich denke du müsstest Text und Zahl getrennt sortieren (aufteilen in zwei Spalten).
Aktuell werden die Werte als Text-String behandelt. Wenn du dir folgende Zahlen als Buchstaben vorstellst (0=A, 1=B, 2=C usw.):
134
3370
610
BDE
DDHA
GBA
So gesehen funktionieren die Sortmethoden richtig. Bei einer Text-Sortierung ist nicht die Länge des Wortes entscheiden, sondern die Buchstaben.
cu
Chris
AW: Sortierung
11.04.2017 09:01:58
Daniel
Hi
wenn du selber sortieren willst, solltest du Quicksort verwenden, das ist um Welten schneller als Bubblesort (gibt auch funktionierende Codebeispiele im Netz)
das Grundproblem ist jedoch folgendes:
du hast Texte und bei Texten ist für die Sortierung bzw für die Größer/Kleiner-Entscheidung zwischen zwei Werten immer das erste unterschiedliche Zeichen von links entscheidend. Was danach folgt, spielt keine keine Rolle.
es ist ja auch normal, dass
"Abraham" vor "Achim" kommt ("b" ist kleiner als "c") und genauso kommt auch "1234567" vor "131"
Entscheidend ist immer das erste unterschiedliche Zeichen (hier an zweiter stelle)
damit Zahlen in Texten richtig sortiert werden müssen daher alle Zahlen auf die gleiche Länge gebracht werden und ggf mit führenden Nullen aufgefüllt werden:
E0000.1 anstelle von E0.1
E0133.4 anstelle von E133.4
E3370.4 als längste Ziffernfolge kann bleiben
du müsstest also deine Texte zerlegen und nach dem ersten Buchstaben die Nullen auffüllen.
das geht beispielsweise mit dieser Formel in deiner Beispieldatei:
=LINKS(A5;1)&RECHTS("0000"&TEIL(A5;2;99);6)
und dann mit dieser Hilfsspalte sortieren.
wenn du deine eigene Sortierroutine nutzen willst, kannst du das umgestalten des Textes auch dort einbauen.
bei großen Datenmengen wäre vielleicht auch folgendes sinnvoll:
1. Trenne den Text aus Spalte A in drei spalten auf. Hierzu kannst du TEXT IN SPALTEN verwenden.
du musst es 2x ausführen.
- beim ersten mal eilst du den Text mit fester Breite nach dem ersten Zeichen.
hierbei bitte eine neue Spalte als Ziel angeben, damit das Original nicht überschrieben wird.
formatiere die zweite Spalte als Text (im Schritt 3), sonst wird aus "2.7" ein Datum!
- beim zweiten mal trennst du die entstandene zweite Spalte beim Punkt.
hierbei kannst du dann die gleiche Spalte als Einfügebereich auswählen und das Zahlenformat "Standard" im Schritt 3
hierbei werden dann echte Zahlen erzeugt.
dann kannst du mit der Excelsortierroutine nach diesen drei Spalten sortieren und die Reihenfolge sollte korrekt sein.
die letzte Variante scheint mir bei der genannten Datenmenge und deinem VBA-Level die geeignetste.
Gruß Daniel
Anzeige
AW: Sortierung
11.04.2017 09:07:49
Rainer
Hallo Daniel,
hier mal eine Lösung (ohne VBA):
https://www.herber.de/bbs/user/112799.xls
Die Spalte A wird in dieser Form richtig sortiert.
Das Problem wurde schon beschrieben, die Sortierung nimmt die Zahlen als Text.
Gruß,
Rainer
AW: Sortierung
11.04.2017 09:48:38
Daniel2
Vielen Dank für die Antworten :)
Jetzt weiß ich zu mindestens wie der Computer das Ganze verarbeitet.
Ich lade mal die original Datei hoch.
Das Ganze muss leider mit VBA passieren.
Mein Beispiel hier war evtl. zu banal.
Mein Gedanke ist den Bereich A3:D(letzte beschriebene Zeile) in ein Array einzulesen und dann nach der Spalte C also (i,3) zu sortieren.
Natürlich müssen dabei (i,1) (i,2) und (i,4) immer mitgeführt werden.
Wenn es nur Zahlen wären würde ich es hinbekommen.
Wär super wenn jmd. eine Idee hat wie man das hinbekommt.
Anstatt des BubbleSort würde ich natürlich gerne den Quicksort benutzen nur den hab ich noch nicht ganz durchdrungen.
Hier die Datei
https://www.herber.de/bbs/user/112801.zip
@Daniel du kannst dir den Code gerne mal angucken. Evtl. würdest du auch sagen, dass meine Kenntnisse in VBA doch besser sind, als ich denke.
Gruß
Anzeige
AW: Sortierung
11.04.2017 10:18:06
Daniel
Hi
ich würde es so machen, wie ich beschrieben habe (Variante 2)
1. drei freie Hilfsspalten nach der zu sortierenden Liste einfügen
2. in die erste Spalte kommt der Buchstabe, in die zweite die Zahl vor dem Punkt und in die 3. die Zahl nach dem Punkt
das geht am einfachsten wie beschrieben mit 2x TextInSpalte
beim ersten TextInSpalten nach dem ersten Zeichen trennen, hierbei die erste Hilfsspalte als Ziel eingeben und für die zweite TEXT als Format einstellen
im zweiten TextInSpalten dann die zweite Spalte erneut mit dem Punkt als Trennzeichen auftrennen, hierbei Ziel = Quelle und Standard für beide Spalten als Format
3. dann den ganzen Block nach diesen drei Hilfsspalten sortieren.
das kannst du zum Testen erstmal manuell ausführen.
Wenn dabei das richtige Ergebnis rauskommt, kannst dir das ganze ja von einem Makro so ausführen lassen (der Recorder ist dein Freund)
Gruß Daniel
Anzeige
AW: Sortierung
11.04.2017 09:48:42
UweD
Hallo
Sortieren mit Formel mit 2 Hilfsspalten (ausblenden)

Tabelle1
 ABCD
4Org.Hilfsspalte1Sortieren per FormelZiel
5E0.0E000000,0A000002,7A2.7
6E0.1E000000,1A000003,0A3.0
7E857.2E000857,2A000003,2A3.2
8E0.3E000000,3A000600,0A600.0
9A2.7A000002,7A000600,0A600.0
10A600.0A000600,0A000624,6A624.6
11E3370.4E003370,4E000000,0E0.0
12A3.2A000003,2E000000,1E0.1
13A600.0A000600,0E000000,3E0.3
14A3.0A000003,0E000133,4E133.4
15E610.2E000610,2E000133,6E133.6
16A624.6A000624,6E000133,7E133.7
17E133.4E000133,4E000134,1E134.1
18E133.7E000133,7E000610,2E610.2
19E133.6E000133,6E000857,2E857.2
20E134.1E000134,1E003370,4E3370.4

verwendete Formeln
Zelle Formel Bereich N/A
B5:B20=LINKS(A5;1)&TEXT(WECHSELN(TEIL(A5;2;99);".";",");"000000,0")  
C5:C20{=INDEX(B$5:B$20;VERGLEICH(KKLEINSTE(ZÄHLENWENN(B$5:B$20;"<"&B$5:B$20);ZEILEN($1:1));ZÄHLENWENN(B$5:B$20;"<"&B$5:B$20);0))}$C$5 
D5: D20=WECHSELN(LINKS(C5;1)&TEXT((--TEIL(C5;2;99));"0,0");",";".")  
{} Matrixformel mit Strg+Umschalt+Enter abschließen
Matrixformeln sind durch geschweifte Klammern {} eingeschlossen
Diese Klammern nicht eingeben!!

http://excel-inn.de/dateien/vba_beispiele/tabellenanzeige_in_html_addin.zip
http://Hajo-Excel.de/tools.htm
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 21.10 einschl. 64 Bit


Mit Hilfe von http://www.excelformeln.de/formeln.html?welcher=236
LG UweD
Anzeige
AW: Sortierung
11.04.2017 11:03:36
Daniel2
Vielen Dank.
Mit den Formeln klappt es.
Ich hoffe man kann evtl. genau diesen Schritt auch per VBA ausführen aber ohne das man durch den Code Excel diese Schritte in der Tabelle durchführen lässt.
Evtl. durch transformieren und wieder retransformieren des Arrays?
Originale Datei 2 Nachrichten weiter oben.
AW: Sortierung
11.04.2017 13:14:00
UweD
Hallo nochmal
- Ich hab mal die Idee mit der Aufspaltung in 3 Spalten ausgegriffen
- die Hilfssplten werden am hinteren Ende der Tabelle eingebaut und später wieder gelöscht.
- Die Formeln waren etwas komplexer, um alle "Sonderlocken" abzufangen
Versuch es mal so...
Sub Sortieren()
    Dim LR As Double, ZE As Integer, CC As Integer, SP As Integer, TB1
    SP = 1 'Spalte A 
    ZE = 3 'Werte ab Zeile 
    With Sheets("Tabelle1")
        LR = .Cells(.Rows.Count, SP).End(xlUp).Row 'letzte Zeile der Spalte 
        CC = .Cells.SpecialCells(xlCellTypeLastCell).Column + 1 ' erste Freie Spalte für 
        
        .Range(.Cells(ZE, CC), .Cells(LR, CC)).FormulaR1C1 = _
            "=LEFT(SUBSTITUTE(RC3,""-"",""""),1)"
        
        .Range(.Cells(ZE, CC + 1), .Cells(LR, CC + 1)).FormulaR1C1 = _
            "=IFERROR(--MID(SUBSTITUTE(RC3,""-"",""""),2,FIND(""."",RC3)-2),--MID(SUBSTITUTE(RC3,""-"",""""),2,99))"
        
        .Range(.Cells(ZE, CC + 2), .Cells(LR, CC + 2)).FormulaR1C1 = _
            "=IFERROR(--MID(RC3,FIND(""."",RC3)+1,99),-1)"
        
                
        .Range(.Cells(ZE, CC), .Cells(LR, CC + 2)).Value = .Range(.Cells(ZE, CC), .Cells(LR, CC + 2)).Value
        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=Range(Cells(ZE, CC), Cells(LR, CC)) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SortFields.Add Key:=Range(Cells(ZE, CC + 1), Cells(LR, CC + 1)) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SortFields.Add Key:=Range(Cells(ZE, CC + 2), Cells(LR, CC + 2)) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange Range(Cells(ZE, 1), Cells(LR, CC + 2))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        .Range(.Columns(CC), Columns(CC + 2)).Delete xlToLeft
    End With

End Sub

LG UweD
Anzeige
AW: Sortierung
11.04.2017 17:40:39
Daniel2
Ich hab es jetzt gerade mal ausporbiert.
Funktioniert erstmal super.
Ich beschäftige mich mal mit dem Code :)
Danke!
AW: Sortierung
12.04.2017 08:37:17
UweD
Hallo
Es wird die Exceleigenen Sortierung verwendet.
dazu wird der Eintrag in 3 Teile gesplittet.
Folgende Formeln werden dabei verwendet und ab der ersten freien Spalte eingetragen:
=LINKS(WECHSELN($C3;"-";"");1)
- Ein eventuelles '-' wird gelöscht und dann das erste Zeichen extrahiert
War für das -Q10 erforderlich

=WENNFEHLER(--TEIL(WECHSELN($C3;"-";"");2;FINDEN(".";$C3)-2);--TEIL(WECHSELN($C3;"-";"");2;99))
- Auch hier wird ein eventuelles '-' gelöscht.
- der Punkt wird gesucht und der Teil ab Pos.2 bis dahin extrahiert.
- im Fehlerfall, also wenn kein . vorhanden ist, wird Alles ab Pos2 verwendet
- Der gefundenen Text wird durch das -- in eine Zahl umgewandelt
=WENNFEHLER(--TEIL($C3;FINDEN(".";$C3)+1;99);-1)
- der Punkt wird gesucht und ab da der Rest verwendet
- Der gefundenen Text wird durch das -- in eine Zahl umgewandelt
- Ist kein Punkt da, wird -1 gesetzt. Dadurch wandert dieser Wert ganz nach oben

Im Anschluss dann erst nach Spalte 1, dann Spalte 2 und Spalte 3 sortiert.
Zum Schluss werden die Hilfsspalten wieder entfernt
LG UweD
Anzeige
AW: Sortierung
12.04.2017 11:45:04
Daniel2
Hallo UweD,
Danke für die Erklärung!
Eine Sache müsste sich noch ändern, die ich leider nicht hinbekommen habe.
Wär es möglich, dass die Suche sich nur auf den Bereich A-D bezieht?
Würde dann eine zweite Sortierung für den Bereich F - I dann noch brauchen.
Was genau muss ich dann ändern? Komm mit dem Formula etc. nicht ganz klar.
Gruß
Daniel
AW: Sortierung
12.04.2017 14:06:42
UweD
Hallo
- dann je ein Aufrufmakro für die Bereiche mit Variablenübergabe
- und ein Unterprogramm für beide Fälle

Sub Sortieren_A_bis_D()
    Call Sortieren(3, 5)
End Sub


Sub Sortieren_F_bis_F()
    Call Sortieren(8, 10)
End Sub


Private Sub Sortieren(SP As Integer, CC As Integer)
    Dim LR As Double, ZE As Integer, TB1
    ZE = 3 'Werte ab Zeile 
    With Sheets("Tabelle1")
        LR = .Cells(.Rows.Count, SP).End(xlUp).Row 'letzte Zeile der Spalte 
        .Columns(CC).Resize(, 3).Insert xlToRight
        .Columns(CC).Resize(, 3).NumberFormat = "General"
        .Columns(CC).Resize(, 3).ColumnWidth = 10
        
        .Range(.Cells(ZE, CC), .Cells(LR, CC)).FormulaR1C1 = _
            "=LEFT(SUBSTITUTE(RC[-2],""-"",""""),1)"
            
        .Range(.Cells(ZE, CC + 1), .Cells(LR, CC + 1)).FormulaR1C1 = _
            "=IFERROR(--MID(SUBSTITUTE(RC[-3],""-"",""""),2,FIND(""."",RC[-3])-2),--MID(SUBSTITUTE(RC[-3],""-"",""""),2,99))"
        
        .Range(.Cells(ZE, CC + 2), .Cells(LR, CC + 2)).FormulaR1C1 = _
            "=IFERROR(--MID(RC[-4],FIND(""."",RC[-4])+1,99),-1)"
        
                
        .Range(.Cells(ZE, CC), .Cells(LR, CC + 2)).Value = .Range(.Cells(ZE, CC), .Cells(LR, CC + 2)).Value
        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=Range(Cells(ZE, CC), Cells(LR, CC)) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SortFields.Add Key:=Range(Cells(ZE, CC + 1), Cells(LR, CC + 1)) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SortFields.Add Key:=Range(Cells(ZE, CC + 2), Cells(LR, CC + 2)) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange Range(Cells(ZE, SP), Cells(LR, CC + 2))
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        .Columns(CC).Resize(, 3).Delete xlToLeft
    End With

End Sub


LG UweD
Anzeige
AW: Sortierung
12.04.2017 15:53:47
Daniel2
Hallo UweD,
vielen vielen Dank.
Jetzt passt es und ich hab es auch verstanden :)
Ich sollte auch öfter mal Private Subs benutzen und dieser Werte übergeben, sparrt ja echt viel Code und schafft Übersicht.
Hast mir sehr geholfen.
Schöne Woche und schöne Feiertage
Gruß
Daniel
AW: gern geschehen owt
12.04.2017 16:05:30
UweD

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige