401 Aufrufe
Gefragt in Tabellenkalkulation von vernichter Mitglied (261 Punkte)

Hallo zusammen,

ich benötige Hilfe beim transponieren von Spalten und mehreren Zeilen. Ich habe es mit der Funktion transponieren beim einfügen probiert, jedoch ist das Ergebniss nicht das was ich benötige. Die Daten stehen aktuell hintereinander und sollen untereinander stehen. Eine Formellösung wäre so glaube ich nicht die beste Lösung da es sich in der richtigen Datei schon um sehr viele Daten handelt und es nach unten hin offen ist.

Selbst beim aufnehmen eines Makro steht im Modul nicht mehr drin als Transpose: True. Ich habe wie immer eine kleine Datei zum besseren Verständniss angehangen. Vielleicht kann mir hier einer weiterhelfen. Bis dahin noch einen schönen Sonntag.

https://www.dropbox.com/s/7oa6voh3h9qrh7b/untereinander.xlsb?dl=0

Gruß energun

7 Antworten

0 Punkte
Beantwortet von vernichter Mitglied (261 Punkte)

Hallo zusammen,

ich habe die Datei noch einmal angepasst Im IST Zustand sind zwischen den MHD 's und Mengen keine Lücken alles ist hintereinander gschrieben. es kann natürlich vorkommen das es bei einem Artikel nur 4 statt 5 MHD´s gibt.

Den SOLL Zustand habe ich ebenfalls noch einmal angepasst da man sonst nicht richtig filtern kann.

https://www.dropbox.com/s/a5lkb82j5zf3y3b/untereinander2.xlsb?dl=0

Gruß energun

+1 Punkt
Beantwortet von beverly_ Experte (3.3k Punkte)

Hi,

z.B. so:

Sub Transponieren()
    Dim lngZeile As Long
    Dim intSpalte As Integer
    Dim lngZiel As Long
    lngZiel = 2
    Dim intAnzahl As Integer
    For lngZeile = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        For intSpalte = 3 To 11 Step 2
            If Application.Count(Range(Cells(lngZeile, intSpalte), Cells(lngZeile, intSpalte + 1))) > 0 Then
                Range(Cells(lngZeile, 1), Cells(lngZeile, 2)).Copy Cells(lngZiel, 14)
                Range(Cells(lngZeile, intSpalte), Cells(lngZeile, intSpalte + 1)).Copy Cells(lngZiel, 16)
                lngZiel = lngZiel + 1
            End If
        Next intSpalte
    Next lngZeile
    Range(Cells(2, 14), Cells(lngZiel, 17)).Sort key1:=Cells(2, 14), order1:=xlAscending, Header:=xlNo
End Sub


Bis später, Karin

0 Punkte
Beantwortet von vernichter Mitglied (261 Punkte)
Hi Karin,

funktioniert aller erste Sahne. Hatte heute schon zufällig von Dir in einem anderen Forum gelesen, dort ging es wohl um etwas ähnliches was ich gleich probiert habe was bei mir natürlich nicht funktionierte weil man den Code nicht versteht. Werde es mal versuchen in meine richtige Datei einzubauen und mich dann wieder melden.

Bis hierhin schon mal ganz lieben Dank

Gruß energun
0 Punkte
Beantwortet von vernichter Mitglied (261 Punkte)

Hi Karin,

nach ein paar Tagen des probierens hab ich es zumindestens mal so weit gebracht das mir das Makro die Daten von Tabelle1 in Tabelle 2 schreibt. Ich hoffe ich habe das Makro richtig angepasst.

Problem 1:

die Sortierung in Tabelle 2 funktioniert nicht wenn ich die Zeile

Next lngZeile
    Worksheets("Tabelle1").Range(Cells(2, 14), Worksheets("Tabelle1").Cells(lngZiel, 17)).Sort key1:=Cells(2, 14), order1:=xlAscending, Header:=xlNo

in

Next lngZeile
    Worksheets("Tabelle2").Range(Cells(2, 1), Worksheets("Tabelle2").Cells(lngZiel, 4)).Sort key1:=Cells(2, 1), order1:=xlAscending, Header:=xlNo

ändere. Ich nehme mal an weil in dem Makro weiter oben:

For lngZeile = 2 To Worksheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).RowFor lngZeile = 2 To Worksheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Row

steht. Ist das so richtig gedacht?

Problem 2:

Ich würde z.B. gerne in beide Tabellen in Spalte B eine Spalte hinzufügen und diese Name benennen und dann von Zeile 2 bis Ende Hund reinschreiben. Dazu müsste ich diesen Teil von:

For intSpalte = 3 To 11 Step 2

in

For intSpalte = 4 To 12 Step 2

umändern. Aber wie geht es da weiter? In der Datei die ich hochgeladen habe funktioniert zumindestens das kopieren von Tabelle1 zu Tabelle2. :-) Spalten wurde hier noch nicht eingefügt.

https://www.dropbox.com/s/2epcvhk263u9xgu/untereinander3.xlsb?dl=0

Gruß

energun

+1 Punkt
Beantwortet von beverly_ Experte (3.3k Punkte)
ausgewählt von vernichter
 
Beste Antwort

Hi,

bei deinem Sortieren beziehst du dich nicht auf das aktive Tabellenblatt, deshalb muss vor ALLEN Zellangaben (Range und Cells) der Blattname stehen - bei dir fehlt er vor jeweils vor Cells(2, 14)

Einfacher ist es, wenn man sich  mittels With-Anweisung auf ein bestimmtest Tabellenblatt bezieht - das macht den Code kürzer und übersichtlicher. Allerdings muss man dabei darauf achten, dass vor ALLEN Zellangaben (Range und Cells) ein Punkt (.) steht. Dies ist für Excel der Hinweis, dass sich alle Zellangaben auf das innerhalb der With-Anweisung genannte Tabellenblatt beziehen - fehlt der Punkt, dann gibt es einen Laufzeitfehler, weil Excel die Zellangabe nicht zuordnen kann. In deiner Mappe gibt es zwar keinen Laufzeitfehler, aber das hängt einfach damit zusammen, dass du das Makro sicher ausgeführt hast, wenn Tabelle1 aktiv ist, dann erkennt Excel Zellangaben zum gerade aktiven Tabellenblatt zugehörig. Wenn du das Makro mit deinen Änderungen jedoch ausführst wenn Tabelle2 aktiv ist, gibt es Ärger.

Sub Transponieren()
    Dim lngZeile As Long
    Dim intSpalte As Integer
    Dim lngZiel As Long
    lngZiel = 2
    Dim intAnzahl As Integer
    With Worksheets("Tabelle1")
        For lngZeile = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            For intSpalte = 4 To 12 Step 2
                If Application.Count(.Range(.Cells(lngZeile, intSpalte), .Cells(lngZeile, intSpalte + 1))) > 0 Then
                    .Range(.Cells(lngZeile, 1), .Cells(lngZeile, 3)).Copy Worksheets("Tabelle2").Cells(lngZiel, 1)
                    .Range(.Cells(lngZeile, intSpalte), .Cells(lngZeile, intSpalte + 1)).Copy Worksheets("Tabelle2").Cells(lngZiel, 3)
                    lngZiel = lngZiel + 1
                End If
            Next intSpalte
        Next lngZeile
    End With
    With Worksheets("Tabelle2")
        .Range(.Cells(2, 1), .Cells(lngZiel, 5)).Sort key1:=.Cells(2, 1), order1:=xlAscending, Header:=xlNo
    End With
End Sub

Bis später, Karin

0 Punkte
Beantwortet von vernichter Mitglied (261 Punkte)

Hi Karin,

Problem 2 konnte ich lösen. Bleibt für mich immer noch dieses Sortierproblem.

Das Makro sieht aktuell so aus:

Sub Transponieren()
    Dim lngZeile As Long
    Dim intSpalte As Integer
    Dim lngZiel As Long
    lngZiel = 2
    Dim intAnzahl As Integer
    For lngZeile = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        For intSpalte = 4 To 12 Step 2
            If Application.Count(Worksheets("Tabelle1").Range(Cells(lngZeile, intSpalte), Worksheets("Tabelle1").Cells(lngZeile, intSpalte + 2))) > 0 Then
                Worksheets("Tabelle1").Range(Cells(lngZeile, 1), Worksheets("Tabelle1").Cells(lngZeile, 3)).Copy Worksheets("Tabelle2").Cells(lngZiel, 1)
                Worksheets("Tabelle1").Range(Cells(lngZeile, intSpalte), Worksheets("Tabelle1").Cells(lngZeile, intSpalte + 1)).Copy Worksheets("Tabelle2").Cells(lngZiel, 4)
                lngZiel = lngZiel + 1
            End If
        Next intSpalte
    Next lngZeile
    Worksheets("Tabelle2").Range(Cells(2, 1), Worksheets("Tabelle2").Cells(lngZiel, 5)).Sort key1:=Worksheets("Tabelle2").Cells(2, 1), order1:=xlAscending, Header:=xlNo
End Sub

Bei diesem Teil kommt dann die Fehlermeldung Objektdefinierter Fehler

Worksheets("Tabelle2").Range(Cells(2, 1), Worksheets("Tabelle2").Cells(lngZiel, 5)).Sort key1:=Worksheets("Tabelle2").Cells(2, 1), order1:=xlAscending, Header:=xlNo

Ich nehme mal an das dies mit diesem Teil zutun hat:

Next lngZeile

das bezieht sich wohl auf die Tabelle1, denn schreib ich in der letzten Zeile Tabelle1 statt Tabelle2 kommt keine Meldung aber sortiert wird in Tabelle1. Ich hab jetzt schon hin und her kopiert leider komm ich nicht drau. :-(

Gruß

energun

0 Punkte
Beantwortet von vernichter Mitglied (261 Punkte)

Hi Karin,

da haben sich wohl die Antworten irgendwie überschnitten. :-) Funktioniert nun wie geschnitten Brot und danke für die Erklärung.
Gruß
energun

...