Daten sortieren in Excel Tabelle

  • Hallo zusammen,


    Ich habe eine Tabelle mit einigen tausend Zeilen.

    In jeder Zeile gibt es 60 Spalten die abwechselnd eine Bezeichnung und einen Wert beinhalten. Das sind 30 Paare, die im Beispiel jeweils mit 1a/1b, 2a/2b,... dargestellt sind.


    Am Ende der Tabelle gibt es eine andere Tabelle ab Zeile 10, in welche die Werte der oberen Tabelle in die passenden Spalten sortiert werden sollen.

    Bei Zeile 3 ist es relativ einfach. Diese beinhaltet 8 verschiedene Werte jeweils mit der Bezeichnung "Bestückung". Der Wert der Bestückung aus der Spalte 1b in Zeile 3 muss in der Spalte Bestückung 1 in Zeile 12 kopiert werden.

    Alles, was die Bezeichnung "Bestückung" trägt, gehört in die nächste leere Zelle, deren Spaltenkopf ebenfalls "Bestückung" lautet.


    Bei Zeile 4 ist es durcheinander:

    Da gibt es zunächst zwei Werte mit der Bezeichnung "Bestückung", gefolgt von vier Werten mit der Bezeichnung "sonstiges", dann wieder einmal "Bestückung" und schließlich einmal "sonstiges".

    Alle Werte gehören ebenfalls der Reihe nach unter die passenden Spaltenköpfe in Zeile 13 kopiert.


    Das sind nur zwei von insgesamt 30 Paaren. Im Endeffekt müssen alle Werte, die die gleiche Bezeichnung tragen nacheinander in die jeweiligen Spalten sortiert werden. Dabei wird es immer leere Zellen geben; das ist ok.


    Mir ist es im Grunde egal, wie das erreicht wird, ob mit Excel oder AutoIT oder sonstwas. Letzten Endes wird eine Tabelle benötigt, die zum Import der Daten in ein anderes System verwendet wird. Das kann auch eine CSV-Datei sein.

    Wie könnte man das erreichen?



  • Gerne, das zuvor angehängte Bild ist ein Screenshot von der hier angehängten Tabelle.

    Es muss nicht zwangsläufig mit Excel gemacht werden.


    Mein Gedanke war, alle Felder von A2 bis P4 in ein Array zu laden.


    Dann im ersten Durchlauf zu prüfen, ob die Bezeichnung "Bestückung" in der Spalte A1 enthalten ist. Wenn ja, wäre der Wert aus der Spalte rechts daneben in die Zelle A12 zu schreiben.

    Wenn nein, wird weiter geprüft, bis die nächste Bezeichnung "Bestückung" in der Zeile gefunden wurde und dann würde dessen rechter Wert in A12 geschrieben werden. Gäbe es weitere Bezeichnungen "Bestückung", würden die dann in B12, C12... abgelegt.

    Wenn "Bestückung" in dieser Zeile nicht mehr enthalten ist, wird nach der nächsten Bezeichnung "Sonstiges" gesucht. Und dessen rechts daneben stehender Wert würde in Zelle I12 abgelegt. Ist auch da keine weitere Bezeichnung "Sonstiges" zu finden und gibt es auch keine weiteren anders lautenden Bezeichnungen, ist der Vorgang für diese Zeile abgeschlossen und der Vorgang wird für die nächste Zeile wie oben beschrieben wiederholt.

  • Ich weiß, wie oft jede der insgesamt 30 Bezeichnungen maximal vorkommt

    Wenn man diese Infos hat kann man es ziemlich simpel aber statisch umsetzen.
    Für den ganz konkreten Fall des Beispieles hier könnte es so umgesetzt werden:

    Für die Excel-Geschichten nehme ich hier einfach meine xlsxNative-UDF. Man kann aber natürlich jede andere UDF dafür nehmen.


    Spannender wird es aber wenn man die Bezeichnungen dynamisch haben möchte.
    Dann wird es etwas witziger bei der Umsetzung:

  • Besten Dank für die Mühe!


    Ich probiere es gerade und zunächst fällt auf, dass diese Meldung ausgegeben wird, wenn ich in dem Verzeichnis, in dem das Skript liegt, die Datei 7za.exe enthalten ist (habe Deine xlsxNative-UDF installiert) :


    "C:\Test\Daten-sortieren.au3" (8) : ==> Variable subscript badly formatted.:

    Global $aOut[UBound($aDaten) - 1][16] = [["Bestückung 1", "Bestückung 2", "Bestückung 3", "Bestückung 4", "Bestückung 5", "Bestückung 6", "Bestückung 7", "Bestückung 8", "Sonstiges 1", "Sonstiges 2", "Sonstiges 3", "Sonstiges 4", "Sonstiges 5", "Sonstiges 6", "Sonstiges 7", "Sonstiges 8"]]

    Global $aOut[^ ERROR


    Benenne ich die Datei um, läuft es ohne Fehlermeldung. Allerdings ist die erzeugte Datei fehlerhaft - beim Öffnen kommt die Meldung:

    Von Excel wurde unlesbarer Inhalt in "out.xlsx" gefunden. Das liegt offenbar am kaufmännischen Und &, welches in einer Zelle steht. Ersetze ich dieses durch Plus +, funktioniert es - zumindest mit einer kurzen Datei, welche nur wenige Zeilen beinhaltet. Ich teste noch weiter.

  • Ich habe die Dateinamen und Bezeichnungen angepasst, hier das aktuelle Skript. Die Rohdaten und das Ergebnis sind angehängt.

    Im Ergebnis fehlt die erste Zeile von den Rohdaten ("Bestückung") und bei den Bezeichungen "Abmaß" und "Typ" fehlt jeweils ein Wert. Bei "Nennleistung" hingegen passt es.


    BRD4.7z


  • Im Ergebnis fehlt die erste Zeile von den Rohdaten ("Bestückung")

    Ja logisch. In deiner ersten Beispieldatei ging es mit der 3. Zeile los.
    In deinem Beispiel jetzt bereits ab der 2. Zeile.
    Das musst du natürlich entsprechend anpassen.


    Beim Schreiben ist mir aufgefallen, dass meine Lösung von oben als allgemeineres Problem gesehen werden kann - nämlich der Überführung von Dictinaries in ein Array.
    Ich habe daher für diesen Teil eine UDF gebastelt da ich dies bestimmt noch einmal gebrauchen kann.
    Damit wird das Skript bei dir auch gleich deutlich übersichtlicher (die DictionaryHelpers.au3 liegt im Anhang):

  • Danke, da hatte ich nicht aufgepasst, mein Fehler.


    Ich habe das Wunschergebnis hier angefügt.

    Die Zeilen 1-4 zeigen das aktuelle Ergebnis. Der Wunsch ist, dass alle gleichen Bezeichnungen sortiert werden und dann erst die Werte der nächsten Bezeichnung aufgezählt werden.

    Der Unterschied ist in Zeile 11 zu sehen:

    Zuerst werden alle Werte der Bezeichnung "Abmaß" aufgezählt und dann erst die Werte der Bezeichnung "Nennleistung".

    Gibt es eine Sortierfunktion für die Werte in Deiner UDF?


    Vielen Dank für Deine Mühe!

  • Bestens - vielen Dank für Deine superschnelle Hilfe!!

    Das hat mir sehr geholfen; ich hätte das nicht hinbekommen.

    Da wäre ich einige Tage daran gesessen und hätte mühevoll jede Zeile manuell umbauen müssen. Mit SVERWEIS kann ich mir schon einigermaßen helfen, aber das war zu komplex für mich.

    Das war riesig nett von Dir! :klatschen: :thumbup: :thumbup:

  • 32vroni

    Hat das Label von [ offen ] auf [ gelöst ] geändert.