Excel: Umwandeln einer (vertikalen) Datenliste in eine (horizontale) Tabelle
Hallo,
also, mein Problem sieht folgendermassen aus: Ich habe eine Datenliste, die folgendermassen aussieht:
data1.1
data1.2
data2.1
data2.2
...
Damit das ganze besser bearbeitet werden kann (aufsummieren etc.), soll es aber so aussehen:
data1.1 data2.1 ...
data1.2 data2.2 ...
Natuerlich gibt es sehr viel mehr als 2 Datensaetze mit jeweils mehr als 2 Daten... sonst wuerde ich es einfach per Hand machen.
Bietet Excel fuer so etwas Funktionen an? Oder macht man das am Besten mit einem Makro?
Ich bin fuer jede Hilfe sehr dankbar.
Gruesse, Wasabi
Antwort schreiben
Antwort 1 von coros vom 02.11.2019, 16:14 Options
Hallo Wasabi,
gibt es in der Tabelle, in der sich die Daten befinden irgend eine Regelmäßigkeit, wie die Datensätze, die dann nebeneinander kopiert werden sollen, angeordnet sind. Also z.B. immer 2 Datensätze und dann eine Leerzelle dazwischen oder so?
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 2 von Wasabi vom 02.11.2019, 16:26 Options
Ja, es sind immer in jedem Datensatz gleich viele Daten drin, in meinem aktuellen Fall z.B. 3. Es koennen auch mal (dann in einer anderen Tabelle) zum Beispiel 6 sein, aber es ist in einer Tabelle immer die gleiche Anzahl.
Und das mit der Leerzeile, das kann ich steuern... ich kann mir die Datenliste also mit oder ohne Leerzeilen erstellen lassen, je nachdem, wie es praktischer ist (im Moment hab ich sie drin).
Antwort 3 von coros vom 02.11.2019, 16:34 Options
Hallo Wasabi,
nein, da hast Du mich mißverstanden. Ich meinte das bezogen auf Dein obiges Beispiel. Da führst Du 2 Werte (Datensätze) untereinander auf, dann sieht es so aus, als ob eine Leerzelle folgt und dann wieder 2 Werte. Das meinte ich mit der Regelmäßigkeit, ob immer 2 Werte untereinander stehen, dann eine Leerzelle und dann wieder 2 Werte untereinander usw.
PS: Wenn ich jetzt erst mal nicht mehr antworte, nicht nervös werden, aber ich habe gleich noch einen Termin bei einem Kunden. Sobald ich wieder da bin, schaue ich wieder hier hinein. Eventuell hat dann ja schon jemand anderes eine Lösung gepostet.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat..
Antwort 4 von Wasabi vom 02.11.2019, 16:48 Options
Hallo Oliver,
danke auf jeden Fall schon mal fuer deine Muehen :)
Ich glaube, ich habe dich schon richtig verstanden; das Missverstaendnis liegt im "Datensatz": Ich hatte das Wort gebraucht als Verbund von mehreren Daten (=Zahlen), im Beispiel oben waeren die Datensaetze also data1 und data2, die jeweils 2 Daten (data1.1, data1.2 usw.) haben.
Einfacher gesagt: Ja, es gibt diese Regelmaessigkeit, also immer n Zahlen, dann Leerzelle, dann n Zahlen etc.
n ist aber nicht unbedingt 2, das war nur fuer das Beispiel (aktuell bei mir z.B. 3, es ist auch schon mal mit 6 vorgekommen). Und die Leerzelle ist wie gesagt optional, momentan hab ich sie fuer bessere Uebersichtlichkeit drin, koennte sie aber auch herausnehmen, wenn es dann leichter zu bearbeiten waere.
So, ich hoffe, das hat die Missverstaendnisse erstmal ausgeraeumt :)
Gruesse, Wasabi
Antwort 5 von coros vom 03.11.2019, 07:37 Options
Hallo Wasabi,
wie versprochen hier ein Lösungsvorschlag.
Mit dem Makro werden zunächst 2 neue Tabellenblätter angelegt. Das eine ist eine Kopie es Blattes, in dem sich Deine Daten befinden und das andere dient zur Auflistung der Daten dann abschließend nebeneinander.
Für die Variante, dass ein Blatt angelegt wird, in dem sich die Daten dann nebeneinander befinden, habe ich mich deshalb entschieden, da aus Deiner Frage nicht hervorging, ob das im gleichen Tabellenblatt passieren soll, in dem sich die zu verschiebenden Werte befinden. Da ich aber die Daten ausschneide um sie dann nebeneinander aufzuführen, wusste ich nicht, ob Du die Originaldaten dennoch untereinander benötigst.
Danach wird nacheinander geprüft, wo ein Datenblock beginnt und endet. Dabei ist egal, wieviele Zeilen ein Datenblock hat.
Bedingung ist allerdings, dass jeder Datenblock durch eine Leerzelle getrennt ist. Das ist aber nach Dienen Angaben kein Problem.
Der gefundene Datenblock wird dann in das Blatt "Ergebnis" in Zeile 2 verschoben.
Am Ende werden die Daten der Reihe nach sortiert, da das Prüfen der Datenblöcke und das verschieben am Ende des Tabellenblatte "Kopie" beginnt und somit der letzte Datenblock aus "Blatt Kopie" am Anfang im Tabellenblatt "Ergebnis" stehen würde, ob das Egal wäre, kann ich nicht beurteilen.
Kopiere das Makro in ein StandardModul und starte es z.B. über eine Befehlsschaltfläche
Teste das Makro aber bitte in einer Testdatei und nicht gleich in Deiner Originaldatei.[b]Option Explicit
Sub Transponieren()
Dim iRowBeginn As Long
Dim iRowEnd As Long
Dim lBeginn As Long
Dim lEnd As Long
Dim iColumn As Integer
Dim iSheet As Integer
'Bildschirmaktualisierung ausschalten
Application.ScreenUpdating = False
'Prüfen ob bereits ein Blatt mit dem Namen "Kopie" oder "Ergebns" existiert, _
wenn ja, Tabellenblatt löschen
For iSheet = Worksheets.Count To 1 Step -1
If Sheets(iSheet).Name = "Kopie" Or Sheets(iSheet).Name = "Ergebnis" Then
Application.DisplayAlerts = False
Sheets(iSheet).Delete
Application.DisplayAlerts = True
End If
Next iSheet
'Kopie des Blattes, das Ausgewertet werden soll, anlegen
ActiveSheet.Copy Before:=Sheets(1)
Sheets(1).Name = "Kopie"
'Blatt in das die neue Auflistung der Daten eingetragen werden anlegen
Worksheets.Add After:=Sheets(1)
ActiveSheet.Name = "Ergebnis"
'Blatt "Kopie" aufrufen
Sheets("Kopie").Activate
'For/Next-Schleife zum Finden, in welcher Zeile der zu kopierende Datenbereich anfängt, _
Zeilennummer in Variable "lBeginn" schreiben
For iRowBeginn = Sheets("Kopie").Range("A65536").End(xlUp).Offset(1, 0).Row To 1 Step -1
If Sheets("Kopie").Cells(iRowBeginn, 1) <> "" Then
lBeginn = iRowBeginn
'For/Next-Schleife zum Finden, in welcher Zeile der zu kopierende Datenbereich endet, _
Zeilennummer in Variable "lEnd" schreiben
For iRowEnd = lBeginn To 1 Step -1
If Sheets("Kopie").Cells(iRowEnd - 1, 1) = "" Then
lEnd = iRowEnd
Exit For
End If
Next iRowEnd
'Hilfsvariable für Spalte in Blatt "Ergebnis"
iColumn = iColumn + 1
'Bereich der gefundenen Daten ausschneiden und in Blatt "Ergebnis" einfügen
Sheets("Kopie").Range(Cells(lBeginn, 1), Cells(lEnd, 1)).Cut
Sheets("Ergebnis").Cells(2, iColumn).Insert Shift:=xlDown
End If
Next iRowBeginn
'Kopiertes Blatt löschen
Application.DisplayAlerts = False
Sheets("Kopie").Delete
Application.DisplayAlerts = True
'Datenreihen sortieren
Sheets("Ergebnis").Rows("2:" & Sheets("Ergebnis").Cells.Find("*", searchdirection:=xlPrevious).Row).Sort _
Key1:=Sheets("Ergebnis").Range("A2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlLeftToRight, DataOption1:=xlSortNormal
End Sub
[/b]
So, ich hoffe, Du kommst klar.
Solltest Du nicht wissen, wie Du den Code in Deine Datei bekommst, dann schau mal auf
meiner HP in der
Rubrik Anleitungen und dort dann in der
Anleitungsnummer 3 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.
Bei Fragen melde Dich.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 6 von woher vom 05.11.2019, 16:29 Options
Hallo,
ich habe mir jetzt auf die Schnelle nicht alles durchgelesen.
evtl. hätte folgende Prozedur aber ausgereicht:
Alle Datensätze kopieren,
auf eine leere Tabelle gehen,
Rechtsklick auf A1 oder woanders,
Klick auf Inhalte einfügen,
Option Leerzellen überspringen und
die Option Tansponieren markieren,
O.K.
mfg
Wolfgang H.
Antwort 7 von coros vom 05.11.2019, 16:54 Options
Hallo Wofgang,
das hätte funktioniert, wenn alle Daten einer Spalte nebeneinander aufgelistet werden sollten. Da hier aber bestimmte Daten immer zusammenhängen, scheidet die von Dir beschriebene Methode aus.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 8 von Wasabi vom 05.11.2019, 18:15 Options
Hallo Oliver,
also, vielen Dank nochmal für deine Hilfe. Es sieht auch schon ganz gut aus, aber so ganz bekomme ich es noch nicht ans laufen.
Man sieht schon erste Ergebnisse, aber dann tritt immer ein Laufzeitfehler '1004' auf... "Anwendungs- oder objektdefinierter Fehler".
Wenn ich da dann auf Debuggen klicke, geht er in die Zeile "If Sheets("Kopie").Cells(iRowEnd - 1, 1) = "" Then".
Der Status bis dahin ist dann folgender: Das Sheet "Kopie" ist leer bis auf den ersten Datenblock der Originaldatei, der ganz oben steht. Im Sheet "Ergebnis" stehen die restlichen Blöcke in umgekehrter Reihenfolge, d.h. der unterste Block der Originaldatei ganz links, der zweitunterste rechts daneben etc.
Wenn das an mir liegt, tuts mir Leid... ich habe Excel 2007, was leider etwas anders aussieht als die anderen Versionen (kenne mich damit auch noch nicht so gut aus), und kann daher deine Anleitung nicht genau befolgen. Ich würde aber schon sagen, dass ich es im Prinzip hinbekommen haben müsste, hab einfach ein neues Makro erstellt und dessen Code dann durch deinen ersetzt.
Ist jetzt vielleicht etwas schwer, das aus der Entfernung zu beurteilen... aber hättest du vielleicht ne Idee, was schief gelaufen sein könnte?
Viele Grüße,
Wasabi
Antwort 9 von coros vom 05.11.2019, 18:48 Options
Hallo Wasabi,
der erste Datensatz darf nicht in der 1. Zeile stehen. Wenn dem so ist, füge eine leere Zeile ein, so dass die Daten ab Zeile 2 beginnen. Dann sollte es funktionieren.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 10 von Wasabi vom 05.11.2019, 22:22 Options
Hallo oliver,
jetzt funktioniert es tatsächlich - Wahnsinn.
Vielen Dank, du hast mir wirklich ne _Menge_ Arbeit erspart! Danke!
Gruss, Wasabi