Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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
Anzeige

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
Anzeige
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

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Spalten mit VBA sortieren anhand der Überschrift


Schritt-für-Schritt-Anleitung

  1. Öffne deine Excel-Datei und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Klicke auf Einfügen und wähle Modul, um ein neues Modul zu erstellen.

  3. Kopiere den folgenden VBA-Code in das Modul:

    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
  4. Schließe den VBA-Editor und gehe zurück zu Excel.

  5. Drücke ALT + F8, wähle SpaltenUmsortieren und klicke auf Ausführen.

Mit diesem Code kannst du in Excel Spalten nach ihrer Überschrift sortieren, was besonders nützlich ist, wenn du mehrere Spalten nach bestimmten Kriterien anordnen möchtest.


Häufige Fehler und Lösungen

  • Fehler: Das Makro wird nicht ausgeführt.

    • Lösung: Stelle sicher, dass du die richtige Arbeitsmappe und das richtige Arbeitsblatt im Code angibst.
  • Fehler: Einige Spalten werden nicht sortiert.

    • Lösung: Überprüfe die Schreibweise der Überschriften in deinem Array. Sie müssen genau mit den Überschriften in der ersten Zeile übereinstimmen.
  • Fehler: Das neue Blatt wird nicht erstellt.

    • Lösung: Überprüfe, ob bereits ein Blatt mit dem Namen "Daten_sortiert" existiert. Ändere den Namen im Code, wenn nötig.

Alternative Methoden

Wenn du keine VBA-Lösung verwenden möchtest, kannst du auch die integrierten Sortierfunktionen in Excel verwenden:

  1. Wähle die gesamte Datenreihe aus.
  2. Gehe zu Daten > Sortieren.
  3. Wähle unter Sortieren nach die erste Zeile als Referenz.
  4. Füge die gewünschten Spalten und Reihenfolgen hinzu.

Diese Methode ist jedoch weniger flexibel, wenn du mit dynamischen Daten arbeitest.


Praktische Beispiele

Hier siehst du ein Beispiel für den VBA-Code, der Spalten in einer Excel-Tabelle sortiert:

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

Dieser Code sortiert die Spalten paarweise und fügt sie in der gewünschten Reihenfolge zusammen.


Tipps für Profis

  • Makros automatisieren: Du kannst das Sortieren von Spalten automatisieren, indem du das Makro an bestimmte Ereignisse (z. B. Öffnen der Datei) bindest.
  • Benutzerdefinierte Listen: Verwende benutzerdefinierte Listen, um die Sortierreihenfolge zu definieren und damit die Sortierung effizienter zu gestalten.
  • Fehlerbehandlung einbauen: Füge Error-Handling in deinen VBA-Code ein, um unvorhergesehene Situationen besser zu managen.

FAQ: Häufige Fragen

1. Frage: Funktioniert dieser VBA-Code auch in älteren Excel-Versionen? Antwort: Ja, der Code sollte in den meisten Excel-Versionen ab 2007 funktionieren, solange VBA unterstützt wird.

2. Frage: Kann ich mehrere Arbeitsblätter mit demselben Code sortieren? Antwort: Ja, du kannst den Code so anpassen, dass er mehrere Arbeitsblätter nacheinander durchläuft und die Sortierung auf jedes anwendet.

3. Frage: Was passiert, wenn die Überschriften doppelt vorkommen? Antwort: Der Code wird die erste gefundene Übereinstimmung verwenden. Es ist empfehlenswert, eindeutige Überschriften zu haben, um Verwirrung zu vermeiden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige