Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.10.2025 10:28:49
16.10.2025 17:40:39
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Spalten anordnen nach Vorgabe

Spalten anordnen nach Vorgabe
Thore
Hallo Liebe VBA Freunde,
Also ich bekomme jeden Tag von x Mitarbeitern 5 verschiedene Tabellen die alle zwar die gleichen Spalten
beinhalten aber in unterschiedlicher Reihenfolge.
Könnt Ihr mir eine Makro basteln das folgendes tut:
Vorhandene Spalten anordnen wie folgt:
Suchbegriff | Debitor | Anlage A | Anlage B | Summe | Datum | Diff. AB | x Über | usw.
Wäre auch gut wenn es die Möglichkeit beinhaltet die zu verschiebenen Spalten um x Spalten zu erweitern in dem man vielleicht vorhandenen Strings kopiert und den Spaltennamen anpasst.
Hoffe das ist so verständlich.
Danke schon einmal
Gruß
Thore
Anzeige
AW: Spalten anordnen nach Vorgabe
21.05.2012 20:11:30
Rolf
Hallo Thore,
wozu so ein Aufwand?
Ist es dir nicht möglich, den Mitarbeitern zu sagen, sie möchten bitte alle ein einheitliches
Format (das du vorgibst) verwenden?
Gruß, Rolf
AW:Bitte um eure Hilfe bei Makro Erstellung
21.05.2012 21:36:29
Thore
Rolf / Thore
Das war Hypothetisch gemeint um die Aufgabe zu erläutern.
Richtig ist aber auch dass dieses Verfahren gängige Praxis werden wird
da in einem Testverfahren Spalten erstellt werden durch "Wenn;Dann usw"
So ergibt sich nachher ein Kuddelmuddel durch die Abhängigkeit der Reihenfolge der jeweiligen Eingaben.
Das ist aber noch weg!!!
Ich frage nun mal anders:
Ist es überhaupt möglich Spalten nach Schema F über ein Makro in einer Vorgegebenen Reihenfolge in Abhängigkeit der Spaltenüberschriften (A1 bis AZ1 - sind immer gleich nur nicht sortiert) von links nach rechts anzuordnen?
Ich habe dieses Makro gefunden. Ist aber kaum zu gebrauchen da ich hier alles manuell eingeben müsste:
Sub Spalte_verschieben()
Dim QS, ZS As String
Q = InputBox("Welche Spalte soll verschoben werden?")
Z = InputBox("Vor welcher Spalte soll eingefügt werden?")
QS = Q & ":" & Q
ZS = Z & ":" & Z
Columns(QS).Select
Selection.Cut
Columns(ZS).Select
Selection.Insert Shift:=xlToRight
End Sub
Danke schon einmal für die Hilfe!!!
Gruß
Thore
Anzeige
AW: Spalten anordnen nach Vorgabe
21.05.2012 22:37:45
Josef

Hallo Thore,
ein (ausbaubares) Beispiel.
Sub rearangeColumns()
  Dim vntColumns As Variant, vntAranged() As Variant
  Dim vntRet As Variant
  Dim lngindex As Long
  Dim lngCalc As Long
  
  On Error GoTo ErrExit
  
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    lngCalc = .Calculation
    .Calculation = xlCalculationManual
    .DisplayAlerts = False
  End With
  
  vntColumns = Array("Datum", "Name", "Wert2", "Wert1") 'Spalten in der gewünschten Reihenfolge
  
  Redim vntAranged(1 To UBound(vntColumns) + 1)
  
  For lngindex = 0 To UBound(vntColumns)
    vntRet = Application.Match(vntColumns(lngindex), Rows(1), 0)
    If IsNumeric(vntRet) Then
      vntAranged(lngindex + 1) = Columns(vntRet)
    End If
  Next
  
  For lngindex = 1 To UBound(vntAranged, 1)
    Cells(1, lngindex).Resize(Rows.Count, 1) = vntAranged(lngindex)
  Next
  
  ErrExit:
  
  With Err
    If .Number <> 0 Then
      MsgBox "Fehler in Prozedur:" & vbTab & "'rearangeColumns'" & vbLf & String(60, "_") & _
        vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
        "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
        .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
        "VBA - Fehler in Modul - Modul1"
      .Clear
    End If
  End With
  
  On Error GoTo 0
  
  With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = lngCalc
    .DisplayAlerts = True
  End With
  
End Sub



« Gruß Sepp »

Anzeige
AW: rearangeColumns - WAHNSINN
22.05.2012 00:48:15
Thore
Josef / Thore
Nicht einmal im Ansatz hätte ich so etwas schreiben können.
Ich habe gerade fast alle "menschlichen" Variablen durchgespielt, mit aktuell 26 Spalten, und bestätige hiermit (mit Beschränkung auf meine Tabellen) dass Dein Makro Lupenrein ist.
Ich glaube damit hast du ein derweil "einzigartiges" Makro geschrieben.
Vielen Lieben Dank.
PS: Vielleicht hast Du noch Ideen zur Performance des Makros ?
Gruß
Thore
Anzeige
AW: rearangeColumns - WAHNSINN
22.05.2012 18:00:56
Josef

Hallo Thore,
ein wenig ausgebaut. Es werden nicht mehr die ganzen Spalten verschoben, sondern nur mehr die gefüllten Zellen. Außerdem werden die Formate (von der ersten Datenzeile) übernommen und die Spaltenbreiten angepasst.
Sub rearangeColumns()
  Dim vntColumns As Variant, vntAranged() As Variant, vntFormat() As Variant
  Dim vntRet As Variant
  Dim lngindex As Long, lngCalc As Long, lngLast As Long
  
  On Error GoTo ErrExit
  
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    lngCalc = .Calculation
    .Calculation = xlCalculationManual
    .DisplayAlerts = False
  End With
  
  vntColumns = Array("Datum", "Name", "Wert2", "Wert1") 'Spalten in der gewünschten Reihenfolge
  
  Redim vntAranged(1 To UBound(vntColumns) + 1)
  Redim vntFormat(1 To UBound(vntColumns) + 1)
  
  For lngindex = 0 To UBound(vntColumns)
    vntRet = Application.Match(vntColumns(lngindex), Rows(1), 0)
    If IsNumeric(vntRet) Then
      lngLast = Application.Max(2, Cells(Rows.Count, vntRet).End(xlUp).Row)
      vntAranged(lngindex + 1) = Cells(1, vntRet).Resize(lngLast, 1)
      vntFormat(lngindex + 1) = Cells(2, vntRet).NumberFormat
    End If
  Next
  
  For lngindex = 1 To UBound(vntAranged, 1)
    Columns(lngindex) = ""
    Columns(lngindex).NumberFormat = vntFormat(lngindex)
    Cells(1, lngindex).Resize(UBound(vntAranged(lngindex)), 1) = vntAranged(lngindex)
    Columns(lngindex).AutoFit
  Next
  
  ErrExit:
  
  With Err
    If .Number <> 0 Then
      MsgBox "Fehler in Prozedur:" & vbTab & "'rearangeColumns'" & vbLf & String(60, "_") & _
        vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
        "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
        .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
        "VBA - Fehler in Modul - Modul1"
      .Clear
    End If
  End With
  
  On Error GoTo 0
  
  With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = lngCalc
    .DisplayAlerts = True
  End With
  
End Sub



« Gruß Sepp »

Anzeige
Bei "rearange" fehlt immer noch 1 r! ;-) Gruß owT
22.05.2012 18:51:33
Luc:-?
:-?
AW: schnell, schneller - TOP
22.05.2012 19:58:48
Thore
Moin Josef,
jau, das ist es!!!
Für alle anderen auch mal veranschaulicht, siehe Dateipfad, wie gut der Code funktioniert.
https://www.herber.de/bbs/user/80259.zip
Datei ist über 300kb deswegen gepackt!!!
Versucht auch mal in Kombination mit Doppelte Spalten löschen um Laufzeitfehler zu vermeiden falls doppelte vorhanden sein sollten/könnten.
Sub rearangeColumns0()
Sheets("Tabelle1").Select
CC = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column 'Letzte Spalte
For i = CC To 2 Step -1
If Cells(1, i).Value = Cells(1, i - 1).Value Then
Columns(i).Delete Shift:=xlToLeft
End If
Next
...und dann wie gehabt weiter
Danke und Gruß
Thore
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Spalten nach Vorgabe anordnen und sortieren


Schritt-für-Schritt-Anleitung

Um die Excel-Spaltenreihenfolge zu ändern und sie nach einer bestimmten Vorgabe anzuordnen, kannst Du ein VBA-Makro verwenden. Hier ist ein einfaches Beispiel, das Du anpassen kannst:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Wähle im Menü Einfügen die Option Modul, um ein neues Modul zu erstellen.
  3. Füge den folgenden Code in das Modul ein:
Sub rearangeColumns()
    Dim vntColumns As Variant
    Dim vntAranged() As Variant
    Dim vntRet As Variant
    Dim lngindex As Long

    vntColumns = Array("Suchbegriff", "Debitor", "Anlage A", "Anlage B", "Summe", "Datum", "Diff. AB", "x Über") ' Spalten in der gewünschten Reihenfolge

    ReDim vntAranged(1 To UBound(vntColumns) + 1)

    For lngindex = 0 To UBound(vntColumns)
        vntRet = Application.Match(vntColumns(lngindex), Rows(1), 0)
        If IsNumeric(vntRet) Then
            vntAranged(lngindex + 1) = Cells(1, vntRet).Resize(Rows.Count, 1)
        End If
    Next

    For lngindex = 1 To UBound(vntAranged, 1)
        Cells(1, lngindex).Resize(UBound(vntAranged(lngindex)), 1) = vntAranged(lngindex)
    Next
End Sub
  1. Schließe den VBA-Editor und gehe zurück zu Excel.
  2. Drücke ALT + F8, wähle das Makro rearangeColumns aus und klicke auf Ausführen.

Dieses Makro wird die Spaltenreihenfolge ändern und die Spalten gemäß der angegebenen Reihenfolge anordnen.


Häufige Fehler und Lösungen

  • Fehler: "Fehler in Prozedur"

    • Ursache: Eine der angegebenen Spaltenüberschriften existiert nicht in der ersten Zeile.
    • Lösung: Überprüfe die Schreibweise der Spaltenüberschriften im Array und stelle sicher, dass sie korrekt sind.
  • Fehler: "Typen unverträglich"

    • Ursache: Das Makro versucht, einen Wert zuzuweisen, der nicht im erwarteten Format vorliegt.
    • Lösung: Stelle sicher, dass die Daten in den Spalten, die Du anordnen möchtest, die gleichen Datentypen haben.

Alternative Methoden

  1. Manuelle Methode:

    • Du kannst die Spalten auch manuell anordnen, indem Du die Spaltenüberschrift anklickst, sie ziehst und an die gewünschte Position ablegst. Diese Methode ist jedoch zeitaufwendig, besonders bei vielen Spalten.
  2. Sortieren mit Filter:

    • Du kannst die Daten auch mit der Filterfunktion sortieren. Wähle die Spalten aus und benutze die Sortieren-Option im Menüband, um die Spalten nach einer bestimmten Reihenfolge anzuordnen.

Praktische Beispiele

  • Beispiel 1: Angenommen, Du hast die Spalten "Name", "Alter", "Beruf", und Du möchtest sie in der Reihenfolge "Beruf", "Name", "Alter" anordnen. Verwende das oben stehende Makro und passe das vntColumns Array entsprechend an:
vntColumns = Array("Beruf", "Name", "Alter")
  • Beispiel 2: Wenn Du eine Excel-Datei mit doppelt vorhandenen Spalten hast, kannst Du den folgenden Code verwenden, um diese zu löschen, bevor Du die Spalten anordnest:
Sub removeDuplicates()
    Dim CC As Long
    CC = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column
    For i = CC To 2 Step -1
        If Cells(1, i).Value = Cells(1, i - 1).Value Then
            Columns(i).Delete Shift:=xlToLeft
        End If
    Next
End Sub

Tipps für Profis

  • Verwendung von Arrays: Das Arbeiten mit Arrays kann die Performance Deines Makros erheblich verbessern. Überlege, ob Du die Daten zuerst in ein Array einliest, bevor Du sie in die Excel-Tabelle schreibst.

  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung in Deinem Makro, um sicherzustellen, dass es bei unerwarteten Daten nicht abstürzt. Dies kannst Du mit On Error-Anweisungen erreichen.


FAQ: Häufige Fragen

1. Wie kann ich mehrere Spalten gleichzeitig anordnen? Du kannst im vntColumns Array einfach die gewünschten Spaltenüberschriften angeben, um mehrere Spalten gleichzeitig neu anzuordnen.

2. Ist es möglich, das Makro für verschiedene Excel-Versionen zu verwenden? Ja, das vorgestellte Makro sollte in den meisten modernen Excel-Versionen funktionieren, solange VBA unterstützt wird. Achte darauf, dass die Datentypen und Spaltenüberschriften übereinstimmen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige