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

Spaltenreihenfolge prüfen, gegebenenf. umsortieren

Spaltenreihenfolge prüfen, gegebenenf. umsortieren
17.11.2016 13:35:53
Bernd

Hallo zusammen,
nur mal eine Frage wie man sowas per VBA macht.
Je nach Exportformat aus SAP verschieben sich die angezeigten Spalten einer Liste. Da mein Makro nur funktioniert, wenn die Liste in korrekter Spaltenreihenfolge vorliegt, wollte ich diese Prüfung noch voranstellen und gegebenenfalls die Liste in die richtige Spaltenreihenfolge umsortieren.
Hab mir das irgendwie so vorgestellt:
Zuerst im Makro die korrekte Reihenfolge mit der konkreten Überschrift definieren und prüfen, also bspw.:
Spalte A = Überschrift A
Spalte B = Überschrift B
Spalte C = Überschrift C
Spalte D = Überschrift D
Spalte E = Überschrift E
Liegen diese Überschriften der Listet in einer anderen Reihenfolge vor, soll nach obiger sortiert werden.
Schön wäre noch, wenn eine Fehlermeldung erscheint, sollten Spaltenüberschriften in der Liste vorhanden sein, welche oben nicht definiert sind.
Und nun eben die Frage wie man sowas am geschicktesten in VBA realisiert.
Kann mir da wer helfen, wie man sowas variabel per VBA realisieren kann.
Vielen Dank vorab. Gruß Bernd

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Spaltenreihenfolge prüfen, gegebenenf. umsortieren
17.11.2016 14:28:53
Michael
Hi,
nur mal so als Ansatz:
Option Explicit
Sub colTest()
Dim nurDie, welche As Range, c As Range, dorthin&(), i, fehler As Boolean, fehler2 As Boolean
nurDie = Array("ÜberschriftA", "ÜberschriftB", "ÜberschriftC", "ÜberschriftD", "ÜberschriftE")
ReDim dorthin(1 To UBound(nurDie) + 1) ' ab 1 = Spaltennummer
Set welche = Intersect(Range("1:1"), ActiveSheet.UsedRange)
For Each c In welche
i = Application.Match(c.Value, nurDie, 0)
If IsNumeric(i) Then dorthin(i) = c.Column _
Else MsgBox c.Value & " nicht in nurDie enthalten.": fehler = True
Next
For i = 1 To UBound(dorthin)
If dorthin(i) = 0 Then MsgBox nurDie(i - 1) & " nicht belegt.": fehler2 = True
Next
If fehler Then MsgBox "Fehler: was tun?"   ' *** der Fehler kann toleriert werden
If fehler2 Then MsgBox "Fehler2: was tun?": Exit Sub ' *** dieser nicht.
' Das Blatt "Temp" muß existieren...
For i = 1 To UBound(dorthin)
ActiveSheet.Columns(dorthin(i)).Copy Sheets("Temp").Columns(i)
Next
End Sub

Ich kopiere die Spalten in der richtigen Reihenfolge in ein weiteres Blatt "Temp". Es ginge auch anders, aber so muß man nicht groß herumrechnen.
Evlt. kann man in der ersten Schleife noch prüfen, ob in dorthin(i) bereits ungleich 0 steht: das wäre bei theoretisch möglichen, mehrfach vorhandenen Überschriften denkbar.
Schöne Grüße,
Michael
Anzeige
AW: Spaltenreihenfolge prüfen, gegebenenf. umsortieren
17.11.2016 16:46:50
Bernd
Hallo zusammen,
so, ein wenig getestet. Funktioniert eigentlich auch bestens... Eine Rückfrage trotzdem noch:
Im Normalfall ist ja die Liste korrekt, somit wäre also auch die ganze Kopiererei überflüssig.
Kann man das noch irgendwie vorher prüfen?
Dass dann praktisch nur kopiert wird, wenn es auch zu Verschiebungen zur Vorgabe kommt?
Folgend der auf meine Bedürfnisse angepaßte Teil:
Dim nurDie, welche As Range, c As Range, dorthin&(), i, fehler As Boolean, fehler2 As Boolean
aktName = ActiveSheet.name
'Prüfung, ob alle benötiten Spalten vorhanden sind - je nach Übergabeformat werden diese in die
'für die Aufbereitung benötigte Spaltenreihenfolge gebracht
'PersNr
'Nachname Vorname
'StammKST
'SenderKST
'KST-BAB
'LA man.
'LA-Kurztext
'Dauer/Std.
'Bemerk.APL-Wechsel
nurDie = Array("PersNr", "Nachname Vorname", "StammKST", "SenderKST", "KST-BAB", "LA man.", "LA- _
Kurztext", "Dauer/Std.", "Bemerk.APL-Wechsel")
ReDim dorthin(1 To UBound(nurDie) + 1) ' ab 1 = Spaltennummer
Set welche = Intersect(Range("1:1"), ActiveSheet.UsedRange)
For Each c In welche
i = Application.Match(c.Value, nurDie, 0)
If IsNumeric(i) Then dorthin(i) = c.Column _
Else MsgBox c.Value & " nicht in nurDie enthalten.": fehler = True
Next
For i = 1 To UBound(dorthin)
If dorthin(i) = 0 Then MsgBox nurDie(i - 1) & " nicht belegt.": fehler2 = True
Next
If fehler Then MsgBox "Fehler: was tun?"   ' *** der Fehler kann toleriert werden
If fehler2 Then MsgBox "Fehler2: was tun?": Exit Sub ' *** dieser nicht.
Sheets.Add(After:=Sheets(Sheets.Count)).name = "temp"
Sheets(aktName).Activate
' Das Blatt "Temp" muß existieren...
For i = 1 To UBound(dorthin)
ActiveSheet.Columns(dorthin(i)).Copy Sheets("Temp").Columns(i)
Next
Application.DisplayAlerts = False
Sheets(aktName).Delete
Application.DisplayAlerts = True
ActiveSheet.name = aktName
Vielen Dank vorab. Gruß Bernd
Anzeige
Weitere Bedingung
18.11.2016 13:28:20
Michael
Hi,
in der Schleife kann man zusätzlich (für eine weitere ok as boolean) ermitteln, ob die Positionen übereinstimmen und wenn ja entsprechend reagieren:
Option Explicit
Sub colTest()
Dim nurDie, welche As Range, c As Range, dorthin&(), i, fehler As Boolean, fehler2 As Boolean
Dim ok As Boolean
nurDie = Array("ÜberschriftA", "ÜberschriftB", "ÜberschriftC", "ÜberschriftD", "ÜberschriftE")
ReDim dorthin(1 To UBound(nurDie) + 1) ' ab 1 = Spaltennummer
Set welche = Intersect(Range("1:1"), ActiveSheet.UsedRange)
For Each c In welche
i = Application.Match(c.Value, nurDie, 0)
If IsNumeric(i) Then dorthin(i) = c.Column _
Else MsgBox c.Value & " nicht in nurDie enthalten.": fehler = True
Next
ok = True
For i = 1 To UBound(dorthin)
If dorthin(i) = 0 Then
MsgBox nurDie(i - 1) & " nicht belegt.": fehler2 = True
ElseIf dorthin(i) <> i Then ok = False
End If
Next
If ok And Not fehler Then MsgBox "Alle Spalten stimmen überein.": Exit Sub
If fehler Then MsgBox "Fehler: was tun?"   ' *** der Fehler kann toleriert werden
If fehler2 Then MsgBox "Fehler2: was tun?": Exit Sub ' *** dieser nicht.
' Das Blatt "Temp" muß existieren...
' Sheets("Temp").Cells.Clear ggf. Kommentarzeichen entfernen
For i = 1 To UBound(dorthin)
ActiveSheet.Columns(dorthin(i)).Copy Sheets("Temp").Columns(i)
Next
End Sub

Deine Erweiterungen mit dem "Temp" habe ich jetzt nicht eingebaut: aber wenn Du das anlegst, paß bitte auf die Schreibweise auf: Du legst "temp" (klein) an.
Schöne Grüße,
Michael
Anzeige
AW: Weitere Bedingung
18.11.2016 14:50:26
Bernd
Hallo Michael,
vielen lieben Dank, paßt jetzt perfekt.
So ists auch flexibel und für ein anderes Aufbereitungsmakro bräuchte man nur die zu prüfenden Überschriften des Arrays anpassen.
Der Listenexport aus SAP ist da einfach etwas blöd, im alten XXL-Format werden die Spalten umsortiert, erst Text, dann Zahlen. Im 2007er Format dagegen bleibt alles wie angezeigt. Und jeder übernimmts wieder anders... so bereitet das dann wenigstens keine Probleme mehr.
Auch die Groß-Kleinschreibung hab ich angepaßt, war mir so auch nicht bewußt, dass das von irgendeiner Relevanz wäre.
Echt genial... schönes Wochenende
Gruß Bernd
Anzeige
freut mich, schöne Grüße zurück ... owT
18.11.2016 20:57:51
Michael
AW: Spaltenreihenfolge prüfen, gegebenenf. umsortieren
17.11.2016 14:30:36
UweD
Hallo
- Bereich kopieren
- Transponiert einfügen in neues Blatt
- Sortieren nach neuer Spalte A (= erste Zeile)
- copieren
- Transponiert in alten Bereich einfügen
- Temporäres Blatt löschen
Sub Sortieren_Spalte()
    Dim LR As Integer, TB
    With ActiveSheet
        LR = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set TB = Sheets.Add(after:=Sheets(Sheets.Count))
        .Cells(1, 1).CurrentRegion.Copy
        TB.Cells(1, 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=True
        
        With TB
            .Sort.SortFields.Clear
            .Sort.SortFields.Add Key:=TB.Range("A:A"), SortOn:=xlSortOnValues, _
                Order:=xlAscending, DataOption:=xlSortNormal
            .Sort.SetRange .Cells(1, 1).CurrentRegion
            .Sort.Header = xlNo
            .Sort.MatchCase = False
            .Sort.Orientation = xlTopToBottom
            .Sort.SortMethod = xlPinYin
            .Sort.Apply
        End With
    
        TB.Cells(1, 1).CurrentRegion.Copy
        .Cells(1, 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=True
    End With
    With Application
        .DisplayAlerts = False
        TB.Delete
        .CutCopyMode = False
        .DisplayAlerts = True
    End With
End Sub

LG UweD
Anzeige
AW: :-(
17.11.2016 19:29:21
UweD
Hallo
anonymisierte Beispiele sind ja gut und schön..
Aber nach Sortierung zu fragen,
bei diesen Vorgaben:
Überschrift A, Überschrift B, Überschrift C usw.
und dann nachher stellt sich raus, dass das real ist
PersNr, Nachname Vorname, StammKST, SenderKST, KST-BAB, LA man., usw
Da scheiden die gewöhnlichen Sortierungen aus.
schon ärgerlich...
AW: :-(
18.11.2016 09:52:54
Bernd
Hallo,
ja das ist richtig, hätte wohl mein Vorhaben gestern ein bisschen besser erklären sollen. Wollt mich auch gestern diesbezüglich schon melden, was jedoch dann doch irgendwie auf der Strecke blieb.
Ganz ehrlich gesagt hatte ich da erst Schwierigkeiten diese Möglichkeit zu verstehen, hab mich dann halt erstmal mit dem anderen beschäftigt. Ich denke diese Vorgehensweise kommt bei mir dann auch aus dem Grund nicht in Frage, da es sich teils doch um größere Listen handelt mit mehreren Tausend Zeilen, transponieren ist da denk nicht der richtige Ansatz.
Trotzdem natürlich vielen Dank und sry für die Missverständnisse. Gruß Bernd
Anzeige
AW: Spaltenreihenfolge prüfen, gegebenenf. umsortieren
17.11.2016 14:55:37
Bernd
Hallo,
vielen Dank Euch, werde ich testen und versuchen bei mir einzubaun.
Ist aber echt gut, irgendwie bin ich noch nie auf den Gedanken gekommen die Daten einfach entsprechend in ein neues Blatt zu übernehmen und dann das alte zu löschen.
Gruß Bernd

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige