Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
804to808
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
804to808
804to808
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

alphanumerisch sortieren mit VBA

alphanumerisch sortieren mit VBA
26.09.2006 17:56:36
Harald
Hallo,
ich habe mal wieder ein Problem - nach der Eingabe einer zusätzlichen Spalte möchte ich die Tabelle (ab Zeile 2) bis zum Tabellenende nach Spalte A alphanumerisch sortieren.
In Spalte A stehen Strings wie z. B. B21, Ca24e, Fg204 usw.
Zum sortieren benutze ich folgenden Code:
Rows("2:" & Sheets("Liste").UsedRange.Rows.Count).Select
' Zeile 2 bis Tabellenende auswählen
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess
' sortieren nach Spalte A
Dabei ergibt sich aber folgendes Problem: A2 wird hinter A10, A11, A100, ... eingeordnet.
Die Werte in der Spalte A kann ich nicht mit vorangestellten Nullen eingeben,
da diese Werte vorgegeben sind.
Gibt es eine Möglichkeit, die Werte trotzdem korrekt zu sortieren?
m.f.g.
Harald

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: benutzerdefiniert sortieren
26.09.2006 19:17:17
Harald
Hallo,
es tut mir leid, aber das hilft mir leider nicht weiter - es Handelt sich um eine Bücherliste mit etwa 2000 Einträgen. An erster Stelle steht dabei ein Buchstabe, evtl ist auch an zweiter Stelle noch ein Buchstabe (nicht immer), danach kommen 1-4 Ziffern und danach manchmal noch ein Buchstabe.
m.f.g.
Harald
Anzeige
AW: benutzerdefiniert sortieren
26.09.2006 20:29:27
ingUR
Hallo, Harald,
ist es möglich, im Sinne von Eindeutig, für das Sortieren den String in die nun von Dir aufgezeiten drei Komponenten zu zerlegen und dann damit den Sortiervorgang durchzuführen? Als Ergebnis würde z.B. diese Reihenfolge entstehen:
A101Z
AA1Y
AA31B
AA1203B
Das ganze könnte mit Hilfsspalten unter Nutzung der Sortierfunktion erfolgen oder aber in einem VBA-Makro, in der eine Indexdatei, die die drei Komponenten enthält und die zugehörigen Orginalzeilennummern) nach diesen drei Komponenten (ggf. auf einer Hilfstabelle) sortiert wird und danach die Umordnung der Tabelle (neue Tabelle oder bestehenden Tabelle verwenden?) vornimmt.
Gruß,
Uwe
Anzeige
AW: benutzerdefiniert sortieren
26.09.2006 20:41:38
Harald
Hallo Uwe,
die Buchnummern beginnen mit A, B, Ca, Cb, D, E, und Fa bis Fi für den jeweiligen Themenbereich.
Danach kommt eine ein- bis vierstellige Zahl für das Buch im jeweiligen Bereich.
Am Ende kann noch ein Buchstabe folgen, falls das Buch mehrmals vorhanden ist.
Leider sind meine VBA-Kenntnisse nur gering, so dass ich nicht weiss, wie ich den Ausdruck trennen kann.
m.f.g.
Harald
AW: benutzerdefiniert sortieren
26.09.2006 21:13:35
ingUR
Hallo, Harald,
hier einmal eine Möglichkeit der Zerlegung Deiner Kennzahl
 
 ABCDE
1KennungTitelK1K2K3
2D43SBuch001D43S
Formeln der Tabelle
C2 : =LINKS(A2;1)&WENN(CODE(TEIL(A2;2;1))>64;TEIL(A2;2;1);"")
D2 : =WERT((TEIL(A2;LÄNGE(C2)+1;LÄNGE(A2)-LÄNGE(C2)-LÄNGE(E2))))
E2 : =WENN(CODE(RECHTS(A2;1))>64;RECHTS(A2;1);"")
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Wenn Du die Möglichkeit hast entsprechende Hilfsspalten, wie hier die Spalten C, D uns E, anzufügen, dann kannst Du die Zellenformeln dort hineinschreiben, herunter kopieren und anschließend nach diesen Spalten Sortieren lassen.
Für das Trennen innerhalb eines VBA-Codes gelten ähnliche Anweisungen, nur das hier die engliche Wörter verwendet werden (Left, Mid, Right und Len).
Die größere Arbeit wird jedoch der Sortieralgo. sein, wenn nicht mit (temporären) Hilfsspalten oder einer Hilfstabelle gearbeitet werden soll.
Sofern also eine VBA-Lösung angestrebt werden soll, wäre es vorteilhaft, ein Tabellenbalt mit ein paar Beispieleintragungen als Grundlage nutzen zu können (soll die Ausgangsreihenfolge erhalten bleiben?).
Gruß,
Uwe
Anzeige
AW: benutzerdefiniert sortieren
27.09.2006 07:01:22
Harald
Hallo Uwe,
vielen Dank für die bisherige Hilfe.
Hier ist eine Beispieldatei - das eigentliche Programm und viele Bücher habe ich gelöscht, damit die Datei nicht zu gross wird.
https://www.herber.de/bbs/user/37034.xls
m.f.g.
Harald
AW: benutzerdefiniert sortieren
27.09.2006 09:31:04
ingUR
Hallo, Harald,
nachflgende Programmroutine AlphaNumerischesSortieren() habe ich in Deine Beispieldatei (siehe Verweis am Ende dieses Beitrages) Standardmodulordner zugefügt.
Option Explicit Const WSNAME = "Buchliste" Const HEADERROW = 1 Const KENNCOLUMN = "A" Sub AlphaNumerischesSortieren() Dim ws As Worksheet Dim K0 As String, K1() As String, K2() As Integer, K3() As String Dim FirstRow As Long, LastRow As Long, LastColumn As Integer Dim maxItems As Long, idx As Long Dim OldUS As Boolean, OldCalc As Integer OldUS = Application.ScreenUpdating 'Schaltet aktualisierung des Bildschirmes aus 'Zeile ist auszukommentieren, wenn man im Debugmodus 'den Aufbau der Hilfsspalten verfolgen möchte Application.ScreenUpdating = False OldCalc = Application.Calculation 'Schalte automatisches Auswertung von Zellenformeln ab Application.Calculation = xlCalculationManual Set ws = Worksheets(WSNAME) ws.Select 'Erste Daten-Zeile FirstRow = HEADERROW + 1 'Letzte Daten-Zeile (letzte beschriebenen Zeile in der Spalte der Kennungen) LastRow = Cells(Rows.Count, KENNCOLUMN).End(xlUp).Row 'letzte beschriebene Spalte in der Überschriftsreihe 'ACHTUNG: Die letzte Daten-Spalte in der Überschiftszeile muß beschriftet sein! LastColumn = Cells(HEADERROW, Columns.Count).End(xlToLeft).Column 'Anzalhl der Datensätze maxItems = LastRow - HEADERROW For idx = 1 To maxItems 'Lese Kennung für Datensatz idx K0 = Cells(HEADERROW + idx, KENNCOLUMN) 'Ermittle Alpha-Präfix 'WENN das 2.Zeichen einen ASCII-Code > 64 hat (CHR(65)="A"!), 'DANN lese die beiden ersten Zeichen 'SONST das erste Zeichen := IIf(asc(Mid(KO,2,1))>64, 2, 1) K1 = Left(K0, IIf(Asc(Mid(K0, 2, 1)) > 64, 2, 1)) 'Wandle Strin ab Zeichen Len(K1)+1 in eine Zahl um '(nur in VBA so möglich, Zellenformel "TEIL" erfordert drei Parameter) K2 = Val(Mid(K0, Len(K1) + 1)) 'Wenn letztes Zeichen einen ASCII-Code > 64 hat, dann schreibe es in K3 If Right(K0, 1) > 64 Then K3 = Right(K0, 1) 'Fülle Hilfsspalten (hinter der letzten beschrifteten Kopfzeile) 'Präfix als Großbuchstabe(n) Cells(HEADERROW + idx, LastColumn + 1) = UCase(K1) 'Ziffer Cells(HEADERROW + idx, LastColumn + 2) = K2 'Suffix als Großbuchstabe Cells(HEADERROW + idx, LastColumn + 3) = UCase(K3) Next idx 'Sortiere Zeilen der Spalten A bis Letzte Listenspalte + drei Hilfsspalten 'nach den Inhalten der Hilfsspalten 1, 2 und 3 Columns("A:" & Chr(64 + LastColumn + 3)).Sort _ Key1:=Cells(2, LastColumn + 1), Order1:=xlAscending, _ Key2:=Cells(2, LastColumn + 2), Order2:=xlAscending, _ Key3:=Cells(2, LastColumn + 3), Order3:=xlAscending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom 'Lösche Hilfsspalten Columns(Chr(64 + LastColumn + 1) & ":" & Chr(64 + LastColumn + 3)).ClearContents 'Setze Focus auf Zelle "A1" Range("A1").Select '"Aufräumarbeit" Set ws = Nothing Application.ScreenUpdating = True Application.ScreenUpdating = OldUS Application.Calculation = xlCalculationAutomatic Application.Calculation = OldCalc End Sub
Zu beachten ist dabei bitte, dass ich die derzeitig verbundene Zelle wieder getrennt habe, da ich im Programm automatisch das Zeilenende der Überschriftszeile ermittle, um die daraudf folgenden drei Spalten als temporäre Hilfsspalten zu nutzen. Ich bin jedoch sicher, dass Du ggf. das Programmteil so verändern kannst, dass drei beliebige freie Spalten (z.B. X, Y, Z) dazu benutzt werden können.
Die Kommando-Schaltfläche in Deiner Benutzerform habe ich nicht eingebaut.
Die Konstanten kannst Du ggf. auch durch die entsprechnden direktwerte im Programmabschnitt ersetzen.
https://www.herber.de/bbs/user/37036.xls
Gruß,
Uwe
Anzeige
AW: benutzerdefiniert sortieren
27.09.2006 14:57:10
Harald
Hallo Uwe,
vielen Dank für deine Hilfe! Morgen am Arbeitsplatz werde ich den Code einbauen.
m.f.g.
Harald

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige