Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1524to1528
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

Spalten per VBA sortieren anhand der Überschrift

Spalten per VBA sortieren anhand der Überschrift
16.11.2016 14:36:42
Andreas
Hallo miteinander,
ich habe wieder mal ein Problem und möchte wissen ob es mit VBA, lösbar ist, da die Datei relativ groß ist und solche Dateien immer wieder vorkommen. Manuell ist es zwar machbar, aber relativ zeitaufwändig.
Ich habe zwar danach gesucht, aber leider nichts gefunden, vielleicht auch übersehen.
Ich möchte in einer Datei die Spalten anhand ihrer Überschrift anordnen.
Die Überschrift steht in der ersten Zelle der Spalte.
Beispiel:
vorher: Butter = Spalte 1, Milch = Spalte 2, Käse = Spalte 3 usw.
nachher: Milch = Spalte 1, Käse = Spalte 2, Butter = Spalte 3 usw.
Ist sowas mit VBA möglich?
Gruß
Andreas

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Beispieldatei...
16.11.2016 15:23:21
Michael
Hallo Andreas!
Ist sowas mit VBA möglich?
Evtl. ja, allerdings wäre dazu eine Bsp-Datei Deinerseits äußerst hilfreich, um das zweifelsfrei zu beantworten. Einerseits weil die Datei relativ groß ist , d.h. es gilt abzuschätzen welches Datenvolumen hier herumgeschoben/sortiert wird und außerdem solche Dateien immer wieder vorkommen, da ist die Frage ob die herzustellende Sortierung immer die gleiche ist, oder ob die Ausgangsdaten immer wieder neu durcheinandergewürfelt daherkommen - das hat dann alles Auswirkungen auf die angewandte Sortierstrategie.
Das von Dir gegebene Beispiel zeigt, dass das durchaus komplex werden kann, denn Du willst hier ja keine numerische oder alphabetische Sortierung, sondern eine Sortierung aufgrund einer bestimmten Logik - das muss also programmatisch extra umgesetzt werden, standardmäßig geht das nicht. Und programmatisch umsetzen ist nur dann sinnvoll bei wiederkehrenden Sortierungen, wenn die Logik gleich bleibt, sonst muss der Sortier-Algorithmus jedes Mal neu entwickelt werden - damit schließt sich der Kreis zu meinem ersten Absatz.
Daher: Ohne Kenntnis Deiner Verhältnisse und Zielsetzungen, kann hier kaum eine Aussage getroffen werden. Eine Bsp-Mappe muss Deinen echten Verhältnissen entsprechen, allerdings kannst Du die entsprechenden Daten an sich mit Dummy-Daten ersetzen.
LG
Michael
Anzeige
AW: Beispieldatei...
16.11.2016 18:27:08
Andreas
Danke erstmal für die Antwort.
Das es wahrscheinlich nicht einfach ist, habe ich mir schon gedacht, aberanscheinend war ich da zu "blauäugig".
Momentan kann ich auch kein Beispiel hochladen, da ich mich mittlerweile daheim befinde. Das müsste ich morgen nachholen.
Aber um das nochmals zu beschreiben:
Ich habe eine Datei, die ich mit Daten aus einem externen Programm befülle. Copy / paste.
Diese Daten haben werden in immer die gleiche Anzahl an Spalten geschrieben, mit immer dem gleichen Namen in der ersten Zeile (Überschrift). Die Spalten sind allerdings nich immer gleich angeordnet und ich möchte die Reihenfolge vorgeben.
Das eigentliche Problem ist aber, dass immer 2 nebeneinander stehende Spalten zusammengehören und beim Verschieben zusammen verschoben werden sollten.
Sowas ist immer schwer zu erklären.
Werde mal nen Beispiel herrichten und hochladen.
Gruß
Andreas
Anzeige
AW: Spalten per VBA sortieren anhand der Überschrift
17.11.2016 07:11:10
Uwe
Hallo Andreas,
unter Start - Sortieren und Filtern - Benutzerdefiniertes Sortieren...:
Optionen: Spalten sortieren
Sortieren nach: Zeile 1
Reihenfolge: Benutzerdefinierte Liste...
entweder Neue Liste: Listeneinträge eintragen und dann Hinzufügen
oder vorhandene Liste auswählen.
OK.
Gruß Uwe
Schöne Idee! Bin auf's Bsp von Andres gespannt, oT
17.11.2016 15:36:45
Andres
AW: Schöne Idee! Bin auf's Bsp von Andres gespannt
17.11.2016 16:34:08
Andres
Hallo,
leider komme ich erst jetzt dazu eine Beispieldatei hochzuladen.
In der Original datei können auch mehr Spalten vorhanden sein.
Die Spaltenlänge ist auch unterschiedlich.
Wenn sich die Spalten immer an der gleichen Stelle befinden würden, wäre es kein Problem mit z.B.:
Columns("I:J").Cut
Columns("E:F").Insert Shift:=xlToRight
usw...
Aber das ist leider nicht der Fall. Und weil immer zwei Spalten zusammengehören kann ich das mit Uwe's Vorschlag auch nicht realisieren (danke dafür).
Die zweiten Spalten haben die gleiche Überschrift.
Sie werden richtig zugeordnet in die Datei reinkopiert.
Zur besseren Veranschaulichung, habe ich die zusammengehörenden Spalten farbig markiert.
Auch die Spaltenüberschriften sind im Original länger.
Hier das Beispiel: https://www.herber.de/bbs/user/109515.xlsm
Vielen Dank schonmal im Voraus.
Gruß
Andreas
Anzeige
Variante mit normaler Sortmethode
18.11.2016 18:51:07
Uwe
Hallo Andreas,
der Vollständigkeit halber hier noch per Sort-Methode:
Sub SpaltenPaarweiseUmsortieren()
Dim i As Long
Dim Ueberschriften As Variant
Ueberschriften = Array("X-Daten", "Table", "X1", "X", "Y", "Z")
With ActiveWorkbook.Worksheets("Daten")
.Rows(1).Insert
With .Cells(1).CurrentRegion
For i = 1 To .Columns.Count Step 2
.Cells(1, i).Value = Application.Match(.Cells(2, i).Value, Ueberschriften, 0) * 2 - 1
.Cells(1, i + 1).Value = .Cells(1, i).Value + 1
Next i
.Sort Key1:=.Rows(1), Order1:=xlAscending, Header:=xlNo, Orientation:=xlLeftToRight
End With
.Rows(1).Delete
End With
End Sub
Gruß Uwe
Anzeige
AW: Schöne Idee! Bin auf's Bsp von Andres gespannt
17.11.2016 16:37:31
Andres
Das Problem ist noch nicht gelöst.
Habe das Häckchen vergessen.
Versuch mal...
17.11.2016 17:49:42
Michael
Hallo Andreas,
...das hier (in Deiner Bsp-Datei):
Sub SpaltenUmsortieren()
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Daten")
Dim WsZ As Worksheet, Spalten, i As Long
Dim Kopf As Range, Block As Range, Z As Long, X As Long
Spalten = Array("X-Daten", "Table", "X1", "X", "Y", "Z")
Application.ScreenUpdating = False
Set WsZ = Wb.Worksheets.Add
WsZ.Name = "Daten_sortiert"
With WsQ
Set Kopf = .Range(.Cells(1, 1), .Cells(1, 1).End(xlToRight))
For i = LBound(Spalten) To UBound(Spalten)
Set Block = Kopf.Find(Spalten(i), LookIn:=xlValues)
With Block
Z = .End(xlDown).Row
.Resize(Z, 2).Copy
End With
With WsZ
X = .Cells(1, .Columns.Count).End(xlToLeft).Column
.Cells(1, X).PasteSpecial xlPasteValuesAndNumberFormats
End With
Next i
End With
Application.ScreenUpdating = True
End Sub
Das gibt Dir die neu sortierten Spalten in einem neuen Blatt aus.
Kommt das hin?
LG
Michael
Anzeige
Sorry, da war noch ein Fehler... Versuch so...
17.11.2016 17:53:13
Michael
Andreas
Sub SpaltenUmsortieren()
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Daten")
Dim WsZ As Worksheet, Spalten, i As Long
Dim Kopf As Range, Block As Range, Z As Long, X As Long
Spalten = Array("X-Daten", "Table", "X1", "X", "Y", "Z")
Application.ScreenUpdating = False
Set WsZ = Wb.Worksheets.Add
WsZ.Name = "Daten_sortiert"
With WsQ
Set Kopf = .Range(.Cells(1, 1), .Cells(1, 1).End(xlToRight))
For i = LBound(Spalten) To UBound(Spalten)
Set Block = Kopf.Find(Spalten(i), LookIn:=xlValues)
Z = .Cells(.Rows.Count, Block.Column).Row
Block.Resize(Z, 2).Copy
With WsZ
X = .Cells(1, .Columns.Count).End(xlToLeft).Column
.Cells(1, X).PasteSpecial xlPasteValuesAndNumberFormats
End With
Next i
End With
Application.ScreenUpdating = True
End Sub
LG
Michael
Anzeige
Sorry, noch ein Fehler, es ist zu spät, aber jetzt
17.11.2016 17:55:05
Michael
Sub SpaltenUmsortieren()
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Daten")
Dim WsZ As Worksheet, Spalten, i As Long
Dim Kopf As Range, Block As Range, Z As Long, X As Long
Spalten = Array("X-Daten", "Table", "X1", "X", "Y", "Z")
Application.ScreenUpdating = False
Set WsZ = Wb.Worksheets.Add
WsZ.Name = "Daten_sortiert"
With WsQ
Set Kopf = .Range(.Cells(1, 1), .Cells(1, 1).End(xlToRight))
For i = LBound(Spalten) To UBound(Spalten)
Set Block = Kopf.Find(Spalten(i), LookIn:=xlValues)
Z = .Cells(.Rows.Count, Block.Column).Row
Block.Resize(Z, 2).Copy
With WsZ
X = .Cells(1, .Columns.Count).End(xlToLeft).Column
.Cells(1, X + 1).PasteSpecial xlPasteValuesAndNumberFormats
End With
Next i
End With
Application.ScreenUpdating = True
End Sub
Jetzt sollt's klappen
LG
Michael
Anzeige
AW: Sorry, noch ein Fehler, es ist zu spät
18.11.2016 13:10:35
Andreas
Hallo Michael,
vielen Dank für Deine Hilfe. In der Beispiel-Datei funktioniert es. Zwar mit einer "Hilfe" (zusätzliches Blatt), aber einwandfrei. In der Original-Datei konnte ich es aus Zeitgründen noch nicht ausprobieren, da ich ja noch einiges anpassen muss, aber ich sehe da kein Problem.
Ich bin immer wieder begeistert über die Hilfsbereitschaft hier im Forum.
Und natürlich auch über die Möglichkeiten, die Excel offeriert. Da ich nicht immer als "Bittsteller" auftreten möchte, habe ich mir jetzt einige Bücher gekauft, damit ich auch den ein oder anderen Code selber schreiben kann.
Vielen Dank nochmal für Deine Hilfe und Deine investierte Zeit.
Gruß
Andreas
Anzeige
Das freut mich...
18.11.2016 13:36:13
Michael
Andreas,
...und bzgl. Zwar mit einer "Hilfe" (zusätzliches Blatt): das ist einfach eine "bequemere" Variante, als die diversen Spalten am selben Blatt herumzuschieben - das Quell-Blatt ließe sich auch noch automatisiert löschen nach dem Umsortieren ins neue Blatt, dann bleibt Dir ein Tabellenblatt in richtiger Sortierung über.
Falls Du das möchtest, müsstest Du so ergänzen:

Next i
End With
Application.displayAlerts = False
.Delete
damit ich auch den ein oder anderen Code selber schreiben kann
Viel Erfolg; und nach dem grdl. Aneignen von Basisbegriffen und Strukturen raus aus den Büchern und am "lebenden Objekt" ausprobieren nicht vergessen ;-) (und ins Forum schauen, evtl. ja auch als Helfer?!)
Wenn Du noch Kommentare zu meinem o.a. Code haben willst, damit Du das evtl. später nachvollziehen kannst, gib Bescheid.
LG
Michael
Anzeige

43 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige