mehrere Zeilen in einer Zeile einfügen

  • Excel

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von zorroot.

    mehrere Zeilen in einer Zeile einfügen

    Hallo Forum,

    ich möchte, dass Excel (per Makro?) die Daten aus mehreren Zeilen in eine Zeile zusammenfasst. Es handelt sich hierbei um eine Pivottabelle die mehrere Angebotsnummer beinhaltet, zu denen alle Details(Volumen aller Angebotenen Flaschen) in mehrerer Teile = mehrere Zeilen die untereinander stehen und alle zu einer Angebotsnummer gehören.
    z.B.
    Vol. A.Nr
    0,5 123
    0,2 123
    0,3 124
    0,5 125
    0,2 125

    Jetzt möchte ich ein eine andere Tabelle alle Volumen der Flasche in eine Zeile untereinander schreiben.
    z.B.
    Vol. A.Nr
    0,5 123
    0,2

    0,3 124

    0,5 125
    0,2


    Hab keine Ahnung, ob das überhaupt machbar ist und mit welchem Ansatz.

    Hat jemand von euch eine Idee?

    Vielen Dank, :)
    Meiner Meinung nach würde sich da folgende Vorgehensweise anbieten:
    - ​Daten in eine neue Tabelle kopieren
    ​- Die Funktion Sort anwenden, Key1 ist die Artikel Nr., Key2 ist die Flaschengröße
    msdn.microsoft.com/de-de/libra…rop.excel.range.sort.aspx
    ​Lass dich von den vielen möglichen Parametern von Sort nicht abschrecken, alle sind optional.

    Nicoleka95 schrieb:

    Ich bekomme das irgendwie nicht hin.
    Keine informationsträchtige Aussage. Was klappt denn genau nicht?

    Mein Vorgehen bei solchen Sachen
    • Excel-Makrorecorder anwerfen
    • das gewünschte Vorgehen per Hand machen
    • Excel-Makrorecorder beenden
    • den entstandenen Makrocode aufrufen, anschauen, versuchen zu verstehen, an die eigenen Bedürfnisse anpassen
    Wie weit kommst Du damit und an welcher Stelle stockt es?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich verstehe den Beispiel Code nicht direkt und mein Problem ist, dass es nicht immer die selben Daten sind, sonder eine Tabelle die sich ständig aktualisiert. Von dieser Tabelle möchte ich zum Beispiel alle Volumen, die die angebotsnummer 124 haben, in eine zelle einer anderen Tabelle untereinander kopieren. Also dass mehrere Volumen untereinander in einer Zelle stehen, diese sich aber ebenfalls in einer fortlaufenden Tabelle befindet.
    Ich versuche das mal mit einem Beispiel.
    In Tabelle1 liegen diese Daten vor:
    drive.google.com/open?id=1OBqdMPDRjnoeaFdrvabWOaRCBTx_2BBF

    Das Ergebnis in Tabelle2, die Daten sind nach deinen Wünschen sortiert:
    drive.google.com/open?id=1xwlmeqZOIwGxXZK9YGBkQN2fA4tmy0yG

    Dann wäre das ein einfacher Zweizeiler:

    Quellcode

    1. Worksheets(1).Range("A1:B6").Copy Worksheets(2).Range("A1:B6")
    2. Worksheets(2).Range("A1:B6").Sort key1:=Worksheets(2).Range("B1:B6"), key2:=Worksheets(2).Range("A1:A6"), order2:=xlDescending, Header:=xlYes​



    ​Hast du das ganze mal, wie von VaporiZed vorgeschlagen, mit dem Makrorekorder ausprobiert ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „zorroot“ ()

    Visual Basic-Quellcode

    1. Public Sub RefFlasche()
    2. Dim objekt As Worksheet 'Quelle
    3. Dim angebot As Worksheet 'Ziel
    4. Set objekt = Worksheets("Kundenobjekte")
    5. Set angebot = Worksheets("Angebotsliste")
    6. Dim zeileQuelle As Integer
    7. Dim zeileZiel As Integer
    8. Dim spalteQuelle As Integer
    9. Dim spalteZiel As Integer
    10. Dim counter As Integer
    11. zeileQuelle = 6
    12. zeileZiel = 4
    13. spalteQuelle = 29
    14. spalteZiel = 1
    15. 'Angebotsliste druchlaufen
    16. While Not IsEmpty(angebot.Cells(zeileZiel, spalteZiel))
    17. 'Maschiene durchlaufen
    18. For zeileQuelle = 6 To objekt.Cells(Rows.Count, 1).End(xlUp).Row
    19. 'Wenn Verkaufsbeleg, Position Maschiene = Angebostliste
    20. If objekt.Cells(zeileQuelle, spalteQuelle).Value = angebot.Cells(zeileZiel, 2).Value And objekt.Cells(zeileQuelle, spalteQuelle + 1).Value = angebot.Cells(zeileZiel, 3).Value Then
    21. angebot.Cells(zeileZiel, 14).Value = objekt.Cells(zeileQuelle, spalteQuelle + 2).Value
    22. Exit For
    23. End If
    24. Next zeileQuelle
    25. zeileQuelle = 6
    26. zeileZiel = zeileZiel + 1
    27. Wend
    28. End Sub


    Das wäre der Code wenn ich in jeder zeile einen wert schreiben möchte.
    Aber die Zeile 28. soll so nicht stehen bleiben.
    Ich müsste die Zeile durch eine Zeile ersetzten, die, wenn in der zeile darüber geprüft wird, ob die Nummer übereinstimmten, ein Array erstellt, dort die Daten speichert und darin auch bei jedem durchlauft der if-Schleife, alle Daten hinein kommen, die die selbe nummern besitzen.
    Das am Ende in diesem Array mehrere Werte vorhanden sind, die ich dann später alle in einer Zelle stehen haben möchte(keine fest definierte Zelle sondern nur fest definierte Spalte)




    So nach einigem Weihnachtsstress konnte ich mich wieder um eine Lösung kümmern. Dazu eine Anmerkung:
    Ich programmiere sonst nur mit Visual Basic .NET. Dies ist mein erstes Programm mit VBA und sieht deshalb sehr nach Spagetti Code aus.

    Die Screenshots zu meiner Lösung:
    - Ganz rechts die Ausgangslage in Tabelle1
    - In der Mitte die neue Tabelle2
    - Ganz links das Ergebnis in Tabelle3
    Warum das Forum die Screenshots in dieser Reihenfolge anordnet, ist mir ein Rätsel.

    VB.NET-Quellcode

    1. Sub xyz_Test_1()
    2. Dim msg As String
    3. Dim Anzahl_Zeilen As Integer
    4. Anzahl_Zeilen = WorksheetFunction.Count(Worksheets(1).Range("A1:A999"))
    5. Dim Alle_Daten As Range
    6. Set Alle_Daten = Worksheets(2).Range(Worksheets(2).Cells(1, 1), Worksheets(2).Cells(Anzahl_Zeilen + 1, 2))
    7. 'Daten in Tabelle2 löschen
    8. Alle_Daten.Delete
    9. 'Daten von Tabelle1 nach Tabelle2 kopieren, auch die Überschrift
    10. Worksheets(1).Range(Worksheets(1).Cells(1, 1), Worksheets(1).Cells(Anzahl_Zeilen + 1, 2)).Copy Worksheets(2).Range(Worksheets(2).Cells(1, 1), Worksheets(2).Cells(Anzahl_Zeilen + 1, 2))
    11. 'Daten in Tabelle2 sortieren. Zuerst nach Spalte B, dann nach Spalte A.
    12. Set Alle_Daten = Worksheets(2).Range(Worksheets(2).Cells(1, 1), Worksheets(2).Cells(Anzahl_Zeilen + 1, 2))
    13. Alle_Daten.Sort key1:=Worksheets(2).Range("B1:B1"), key2:=Worksheets(2).Range("A1:A1"), order2:=xlDescending, Header:=xlYes
    14. 'Blöcke ermitteln
    15. Dim Blöcke(99) As Integer
    16. Dim t, zähler As Integer
    17. zähler = 0
    18. For t = 2 To Anzahl_Zeilen + 1
    19. If Worksheets(2).Cells(t, 2).Value <> Worksheets(2).Cells(t + 1, 2).Value Then
    20. Blöcke(zähler) = t
    21. zähler = zähler + 1
    22. End If
    23. Next
    24. 'Rückmeldung an Benutzer, wie die Blöcke aussehen
    25. Dim Anzahl_Blöcke As Integer
    26. Anzahl_Blöcke = zähler
    27. msg = ""
    28. For t = 0 To Anzahl_Blöcke - 1
    29. msg = msg & "Block " & t & ": " & Blöcke(t) & vbCrLf
    30. Next
    31. MsgBox (msg)
    32. 'Tabelle3 löschen
    33. Worksheets(3).Range(Worksheets(3).Cells(1, 1), Worksheets(3).Cells(Anzahl_Zeilen, 2)).Delete
    34. 'Erste Zeile (die mit den Überschriften) kopieren
    35. Worksheets(2).Range("A1:B1").Copy Worksheets(3).Range("A1:B1")
    36. 'Vorbereiten fürs Kopieren der Blöcke
    37. Dim Zeile_Ziel As Integer
    38. Zeile_Ziel = 2
    39. Dim Anfang, Ende As Integer
    40. Anfang = 2
    41. Dim z As Integer
    42. 'Kopieren der einzelnen Blöcke von Tabelle2 nach Tabelle3
    43. For t = 0 To Anzahl_Blöcke - 1
    44. Ende = Blöcke(t)
    45. 'Spalte A kopieren
    46. If Ende = Anfang Then
    47. 'Nur eine Zeile kopieren
    48. Worksheets(3).Cells(Zeile_Ziel, 1).Value = Worksheets(2).Cells(Anfang, 1).Value
    49. Else
    50. 'Mehrere Zeilen in eine kopieren
    51. For z = 0 To Ende - Anfang
    52. If Worksheets(3).Cells(Zeile_Ziel, 1).Value = "" Then
    53. Worksheets(3).Cells(Zeile_Ziel, 1).Value = Worksheets(2).Cells(Anfang + z, 1).Value
    54. Else
    55. Worksheets(3).Cells(Zeile_Ziel, 1).Value = Worksheets(3).Cells(Zeile_Ziel, 1).Value & vbCrLf & Worksheets(2).Cells(Anfang + z, 1).Value
    56. End If
    57. Next z
    58. End If
    59. 'Spalte B kopieren
    60. Worksheets(3).Cells(Zeile_Ziel, 2).Value = Worksheets(2).Cells(Anfang, 2).Value
    61. 'In Tabelle3 die nächste Zeile auswählen
    62. Zeile_Ziel = Zeile_Ziel + 1
    63. 'Der Anfang des nächsten Blocks ist das Ende des aktuellen + 1 Zeile
    64. Anfang = Ende + 1
    65. Next t
    66. End Sub


    Zur Erklärung des Programmcodes:
    1. Da ich die Daten auf eine bestimmte Weise sortieren muss und ich nicht weiß, ob man die Originaldaten sortieren darf (um z.B. eine zeitliche Abfolge der Daten zu erhalten), kopiere ich die Daten von Tabelle1 nach Tabelle2.
    2. Die Daten in Tabelle2 werden nun anhand der Artikel Nr sortiert.
    3. In Zeile 18-23 wird ermittelt, wieviele Zeilen jeweils die selbe Artikel Nr. haben. Das Ergebnis wird in Blöcke() abgelegt.
    4. In Zeile 36-65 werden dann die Blöcke() ausgewertet. Die Startzeile des ersten Blocks ist 2, die Endzeile der Wert aus Blöcke(). Für alle folgenden Blöcke ist der Start jeweils das Ende des vorhergehenden Blocks +1, das Ende wieder der Wert aus Blöcke(). Dann werden die Daten von Tabelle2 nach Tabelle3 kopiert. Wenn es nur ein Volumen für eine Artikel Nr. gibt, dann nur eine Zeile, ansonsten mehrere.
    5. In Zeile 4 wird die Anzahl der gesamten Datenzeilen mit 999 angenommen. In Zeile 15 wird die Anzahl der verschiedenen Artikel Nr. mit 99 angenommen. Diese Werte bitte entsprechend an die tatsächlichen Werte anpassen (mit einem ausreichenden Puffer).
    Bilder
    • makro_1.jpg

      44,01 kB, 271×372, 764 mal angesehen
    • makro_2.jpg

      44,06 kB, 271×375, 798 mal angesehen
    • makro_3.jpg

      42,23 kB, 270×554, 762 mal angesehen