Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1480to1484
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 über 2 Spalten (letzten Zeile erreicht)

Sortierung über 2 Spalten (letzten Zeile erreicht)
17.03.2016 13:49:42
Alexander
Hallo!
Ich würde gerne über mehrere Spalten sortieren - eigentlich ganz einfach.
Das Problem hierbei ist, dass ein Arbeitsblatt nicht unendlich viele Zeilen zur Verfügung stellt; daher kann es sein, dass ggf. die letzte Zeile des Tabellenblatts (1.048.576) erreicht wird, jedoch weitaus mehr Daten anfallen.
Zur Veranschaulichung habe ich euch einen Screenshot angefügt, um das Problem besser verstehen zu können - mit Vorher- und gewünschtem Nachherzustand:
Userbild
Sp. steht dabei für die Spalte, Z. für die Zeilennr.
Ich möchte nun den Bereich T2:U1048576 UND V2:W1048576 (die 1. Zeile ist für Überschriften reserviert) sortieren lassen - und zwar aufsteigend nach Spalte T und, wie hier dargestellt, bei "Überlauf" weiter mit Spalte V, so dass dann die Werte aufsteigend in den Spalten T und V zu sehen sind.
"Normales" Sortieren ist ja kein Problem - vgl. meinen Code zum Sortieren mit 2 Ebenen:
Private Function sortieren()
With ActiveWorkbook.Worksheets("Korpus").Sort
'Bezug auf Tabellenblatt "Korpus" der aktiven Arbeitsmappe
.SortFields.Clear
'vorherige Parameter des Sort-Objekts löschen
.SortFields.Add Key:=Range("T2:T1048576"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'1. Sortierebene: Spalte T aufsteigend sortieren
.SortFields.Add Key:=Range("U2:U1048576"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'2. Sortierebene: Spalte U aufsteigend sortieren
.SetRange Range("T2:U1048576")
'zu sortierender Bereich
.Header = xlNo
'keine Überschriften
.MatchCase = False
'keine case sensitive-Sortierung
.Orientation = xlTopToBottom
'aufsteigend sortieren
.Apply
'Sortierung durchführen
End With
End Function
Ich hatte schon gesucht und bin auf diesen Beitrag hier gestoßen:
https://www.herber.de/mailing/135401h.htm
Ich weiß aber nicht, ob das in die richtige Richtung geht; mich verwirrt der Code eher mehr als er hilft und ich weiß nicht so recht, was er anstellen soll (Warum etwa in 2-er-Schritten ("Step 2") verfahren?).
Hinweis:
Die 2 Spalten sind nur Beispiele. Im Endeffekt liegen 2 strukturell identische Tabellen mit Daten direkt nebeneinander; lassen wir es mal 5 Spalten sein.
Dann soll nach mehreren Ebenen sortiert werden, jedoch aufsteigend über 2 Spalten sobald mal die letzte Zeile der linken Tabelle erreicht wurde.
Access besitze ich nicht (daher die Behelfslösung mit Excel) und zur Aneignung anderer Programmierkenntnisse wie etwa PHP sitzt mir die Zeit zu sehr im Nacken.
Zudem verwende ich die Excel-Daten auch für Auswertungen in Word.
Bei Fragen fragen. :)
Hat jemand vielleicht einen Schubser in die richtige Richtung?
Danke für eure Hilfe!

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

Betreff
Datum
Anwender
Anzeige
AW: Sortierung über 2 Spalten (letzten Zeile erreicht)
17.03.2016 14:26:07
ChrisL
Hi Alex
Der Code im Link ist m.E. für deine Zwecke nicht brauchbar. Es werden alle Spalten untereinander in eine neue Mappe kopiert, sortiert und danach wieder in die Ursprungsdatei - aufgeteilt in Spalten - zurück kopiert.
Eine Möglichkeit wäre, alle Werte in ein Array/Datenfeld zu übernehmen, dann das Array zu sortieren und wieder zurück in die Tabelle zu schreiben. Zum Sortieren von Array gibt es diverse Sortiervarianten und Muster-Codes. z.B.
http://stackoverflow.com/questions/152319/vba-array-sort-function
Diese Variante wäre aber vermutlich recht aufwändig zu realisieren und ich habe meine Zweifel, ob es aufgrund der Datenmenge funktioniert (Array-Grösse und Performance beim Sortieren).
Wenn es sich nicht um eine Wiederkehrende Angelegenheit handelt, dann würde ich bei einem gratis Provider eine SQL-Datenbank erstellen (mittels Datenbank Manager auch ohne SQL oder PHP Kenntnisse möglich). Die Daten importieren, sortieren und danach wieder exportieren.
cu
Chris

Anzeige
AW: Sortierung über 2 Spalten (letzten Zeile erreicht)
17.03.2016 21:31:47
Alexander
Danke für deine Antwort, Chris.
Habe mal recherchiert:
Die Funktion UBound (zur Ermittlung der Anzahl der Elemente einer Dimension eines Arrays) gibt Long-Werte zurück. Somit wären maximal, beginnend beim 1. Arrayelement mit dem Index 0, 32.766 Elemente möglich und folglich sortierbar.
Da aber mitunter eine Anzahl von Einträgen im Millionenbereich anfällt, scheidet wohl deine vorgeschlagene Möglichkeit aus - aber das hattest du ja schon befürchtet.
Im Ansatz ist sie gut, jedoch scheitert's schließlich einzig daran, dass ein Array nicht mehr als 32.766 Elemente in einer Dimension haben darf.
Ich habe auch schon mal zu Testzwecken eine for-Schleife im Millionenbereich durchlaufen lassen (ein Counter, der sich mit jedem neuen Durchlauf der Schleife um 1 erhöht, bis die letzte Zeile erreicht wird); das zerrt schon an der Performance - womöglich noch mehr, wenn das Tabellenblatt umso mehr Daten enthält.
Ich scheine wohl nicht um Access herumzukommen; ich hatte bisher Excel als Access-Ersatz für kleinere Anwendungen genutzt.
Nochmals danke für deine Hilfe!
Ich lasse den Beitrag trotzdem noch geöffnet - für den Fall, dass jemand dahinter kommt, wie die beschriebene Sortierung zu gestalten wäre ohne dabei aufwändige eigene Sortieralgorhithmen programmieren zu müssen.

Anzeige
AW: Sortierung über 2 Spalten (letzten Zeile erreicht)
18.03.2016 08:23:40
ChrisL
Hi Alex
Danke für dein Feedback. Ich lasse die Frage weiterhin offen.
Kleine Präzisierung: Die Array-Dimension ist anscheinend durch den Datentyp Integer (nicht Long) beschränkt.
https://msdn.microsoft.com/en-us/library/b388cb5s%28v=vs.90%29.aspx
Die Beschränkung auf rund 32'000 wäre somit korrekt.
cu
Chris

AW: Sortierung über 2 Spalten (letzten Zeile erreicht)
18.03.2016 13:21:54
Alexander
Danke, Chris.
Hab wieder mal über 3 Ecken gedacht.
Klar, UBound() gibt Long-Werte zurück, also theoretisch 2.147.483.647 Elemente.
Da eine Dimension eines Arrays aber maximal 32.766 Elemente haben kann, entspricht dies natürlich dem Integer-Typ; hatte die ganze Zeit Integer und somit die knapp 32.000 im Kopf.
Das mit der Tatsache, dass sich Datentypen gegen einander einschränken (wie hier bei UBound() mit Long und der Dimensionsgröße eines Arrays mit Integer) nervt ehrlich gesagt ein wenig; zumindest für mehrdimensionale Arrays mit der jeweils gleichen Anzahl an Elementen pro Dimension (wie etwa beim Auslesen von Datensätzen), hätte man auch locker auf Long upgraden können. ;)

Anzeige
AW: Sortierung über 2 Spalten (letzten Zeile erreicht)
18.03.2016 13:27:47
Alexander
Kleiner Nachtrag:
Ich mach's jetzt per Access; die DB darf max. 2GB belegen, was für meine Bedürfnisse somit locker reicht.
Sortieren lassen kann ich das ganze dann ja eh über SQL-Statements und das Problem mit dem Erreichen der letzten Zeile des Tabellenblatts scheidet aus.

sehe ich nicht so
21.03.2016 19:35:47
Michael
Hi zusammen,
der link bezieht sich auf VB, NICHT auf VBA - was will ich in Excel mit Arrays, die bei 2^15 aufhören?
Zum Testen:
Sub test()
Dim i&
Dim a&(1 To 64000, 1 To 1)
For i = 1 To 64000: a(i, 1) = i: Next
Range("A1").Resize(64000) = a
End Sub
Evtl. könnte man auch ein Dictionary zu Hilfe nehmen: oDic("poner")=oDic("poner") & ",stellen"
Aber eigentlich geht es doch nur darum, daß man die untersten Werte in Spalte T mit den obersten in Spalte V vergleicht - wenn diese übereinstimmen, werden erstere aus T ausgeschnitten, unten an V angefügt und dann V sortiert - dann sollte es passen.
Oder habe ich da einen Denkfehler drin?
Im Beispiel sind ja beide Spalten zumindest "vorsortiert". Falls das in der Praxis nicht der Fall sein sollte, könnte man in T von unten nach dem obersten Wert von V suchen und das dann verwurschteln...
Schöne Grüße,
Michael

Anzeige
AW: sehe ich nicht so
22.03.2016 13:02:56
Alexander
Hallo Michael!
Hintergrund zum Sortieren:
Ein fremdsprachlicher Eintrag soll im Formular markiert werden können. Wenn man dann auf den Button "Übersetzung anzeigen" klickt, dann soll mittels Like-Operator und * für evtl. vorhergehende und nachfolgende Buchstaben die Übersetzung zum markierten Text über eine MsgBox angezeigt werden.
Der Übersichtlichkeit halber soll dann jede Übersetzung in einer neuen Zeile erscheinen, etwa so:
"Suchbegriff:
pone
Ergebnis:
poner
Übersetzung(en):
legen
setzen
stellen".
Der Kontext bestimmt die Übersetzungsmöglichkeit und neu aufgenommene Übersetzungen ergeben sich halt erst im Laufe der Arbeit mit der Anwendung - trotzdem sollen dann alle Übersetzungsmöglichkeiten ausgespuckt werden.
Das Löschen von Bedeutungen soll auch möglich sein. Hierdurch ergeben sich dann Lücken und es müsste neu sortiert werden.
Vielleicht hätte ich meinen Screenshot anders darstellen sollen.
Mir ging es nur darum, zu erfahren, ob (und wenn wie) es möglich ist, bei erreichter letzter Zeile im Tabellenblatt Excel vorzugaukeln, dass die Spalte in der übernächsten Spalte weitergeht und beide Spalten zum Sortieren als eine Spalte betrachtet werden und das Gesamtergebnis dann in beiden Spalten ausgegeben wird.

Anzeige
noch nicht ganz überzeugt
22.03.2016 15:31:17
Michael
Hi Alex,
so ganz bin ich immer noch nicht überzeugt...
Gib in der Beispieldatei mal "oa" ein (ganz unten in der Liste):
https://www.herber.de/bbs/user/104537.xlsm
Das mal nur so als Anregung. Man könnte vor der Suche auch den rechtesten Buchstaben abschneiden, man könnte so aber auch alle Wörter in Spalten pro Anfangsbuchstabe setzen, dann kommst Du eh so schnell nicht an die max. Zeilenanzahl.
Schöne Grüße,
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige