Supportnet / Forum / Tabellenkalkulation
Mehrere Tabellen dynamisch zu einer zusammenstellen
Frage
Hallo zusammen.
Ich habe mehrere Tabellen mit einer unterschiedlichen Anzahl von Spalten und Zeilen! Diese Datensätze möchte ich in einer Tabelle mit einem Makro hintereinander einlesen lassen und nacheinander einfügen.
Könnte mir jemand ein Beispiel-Makro schicken?
Antwort 1 von Guenter
Hallo Florian,
ein erster Vorschlag, wenn alle Tabellen geöffnet sind:
Vielleicht muss noch etwas verändert werden, jenachdem wie die Daten organisiert sind.
Gruß
Günter
ein erster Vorschlag, wenn alle Tabellen geöffnet sind:
Option Explicit
Sub Test()
Dim n%, i%
For n = 2 To Workbooks.Count
Workbooks(n).Activate
ActiveSheet.UsedRange.Select
Selection.Copy
Workbooks(1).Activate
i = Cells(Rows.Count, 1).End(xlUp).Row
Cells(i + 1, 1).Select
ActiveSheet.Paste
Next
End Sub
Vielleicht muss noch etwas verändert werden, jenachdem wie die Daten organisiert sind.
Gruß
Günter
Antwort 2 von Florian S.
Hier mal den bisherigen Code, für alle die sich beteiligen wollen. Wer will, dem schicke ich auch die Dateien zu!
Option Explicit
Sub einlesen()
Application.DisplayAlerts = False
Dim n%, i%, k%, l%, b%
For b = 1 To 2
Workbooks.Open FileName:= _
"C:\WINNT\Profiles\seilerf\Desktop\Demand Model\sellers_form" & b & ".xls"
Next
For n = 2 To Workbooks.Count
Workbooks(n).Activate
k = Cells(Rows.Count, 1).End(xlUp).Row
l = Cells(1, Columns.Count).End(xlUp).Column
l = l - 1
Range(Cells(4, 2), Cells(k, l)).Select
Selection.Copy
Workbooks(1).Activate
i = Cells(Rows.Count, 2).End(xlUp).Row
Cells(i + 1, 2).Select
ActiveSheet.Paste
Workbooks(n).Activate
Workbooks(n).Close
Next
Application.DisplayAlerts = True
End Sub
Option Explicit
Sub einlesen()
Application.DisplayAlerts = False
Dim n%, i%, k%, l%, b%
For b = 1 To 2
Workbooks.Open FileName:= _
"C:\WINNT\Profiles\seilerf\Desktop\Demand Model\sellers_form" & b & ".xls"
Next
For n = 2 To Workbooks.Count
Workbooks(n).Activate
k = Cells(Rows.Count, 1).End(xlUp).Row
l = Cells(1, Columns.Count).End(xlUp).Column
l = l - 1
Range(Cells(4, 2), Cells(k, l)).Select
Selection.Copy
Workbooks(1).Activate
i = Cells(Rows.Count, 2).End(xlUp).Row
Cells(i + 1, 2).Select
ActiveSheet.Paste
Workbooks(n).Activate
Workbooks(n).Close
Next
Application.DisplayAlerts = True
End Sub
Antwort 3 von Guenter
Hallo Florian,
versuchs mal mit diesem Makro:
Ich habe beim Workbooks.Count rückwärts gezählt. Die Zeile, die die Spalten ausliest habe ich auch verändert.
Gruß
Günter
versuchs mal mit diesem Makro:
Option Explicit
Sub einlesen()
Dim n%, i%, k%, l%, b%
Application.DisplayAlerts = False
For b = 1 To 2
Workbooks.Open Filename:= _
"C:\WINNT\Profiles\seilerf\Desktop\Demand Model\sellers_form" & b & _
".xls"
Next
For n = Workbooks.Count To 2 Step -1
Workbooks(n).Activate
k = Cells(Rows.Count, 1).End(xlUp).Row
l = Cells(1, Columns.Count).End(xlToLeft).Column
l = l - 1
Range(Cells(4, 2), Cells(k, l)).Select
Selection.Copy
Workbooks(1).Activate
i = Cells(Rows.Count, 2).End(xlUp).Row
Cells(i + 1, 2).Select
ActiveSheet.Paste
Workbooks(n).Activate
ActiveWorkbook.Close
Next
Application.DisplayAlerts = True
End Sub
Ich habe beim Workbooks.Count rückwärts gezählt. Die Zeile, die die Spalten ausliest habe ich auch verändert.
Gruß
Günter
Antwort 4 von Florian S.
Nicht schlecht Günter,
es öffnet und schließt alles perfekt ohne Fehlermeldung. kannst du mir erklären wieso auf einmal?
Allerdings liest er jetzt plötzlich nur 4 Spalten aus, aber das bekomme ich schon hin(hoffe ich jedenfalls)
es öffnet und schließt alles perfekt ohne Fehlermeldung. kannst du mir erklären wieso auf einmal?
Allerdings liest er jetzt plötzlich nur 4 Spalten aus, aber das bekomme ich schon hin(hoffe ich jedenfalls)
Antwort 5 von Guenter
Nimm vielleicht mal das l = l-1 heraus.
Gruß
Günter
Gruß
Günter
Antwort 6 von Florian S.
Nein das hat nichts gebracht.
Ich verstehe das jetzt wirklich grad nicht.
Ich verstehe das jetzt wirklich grad nicht.
Antwort 7 von Guenter
Hallo Florian,
heute wieder ein Excel Tag?
Zur Erklärung des Makros:
in der Zeile
wird die Anzahl der Spalten zurückgegeben, und zwar in der 1. Zeile!
Leerzellen in der ersten Zeile werden mitgezählt.
Wenn danach
steht, wird die Spaltenzahl um 1 verringert.
In der nächsten Zeile wird dieser Bereich selektiert. Cells (k, l) gibt die Zelle rechts unten an.
Ich hoffe, das hilft Dir weiter.
Gruß
günter
heute wieder ein Excel Tag?
Zur Erklärung des Makros:
in der Zeile
l = Cells(1, Columns.Count).End(xlToLeft).Columnwird die Anzahl der Spalten zurückgegeben, und zwar in der 1. Zeile!
Leerzellen in der ersten Zeile werden mitgezählt.
Wenn danach
l = l - 1 steht, wird die Spaltenzahl um 1 verringert.
In der nächsten Zeile wird dieser Bereich selektiert. Cells (k, l) gibt die Zelle rechts unten an.
Ich hoffe, das hilft Dir weiter.
Gruß
günter
Antwort 8 von Florian S.
Ja heute wird wieder ein Excel-Tag!
Übrigens habe ich das Problem schon selber gelöst:
und zwar in steht in der Definition der Variablen l = ....End(xlToLeft)....
Es muss aber xlUp heißen. Jetzt funktionierts.
Das l= l-1 war schon absicht, da ich die erste Spalte der Quelltabelle nicht auslesen will. In der ersten Spalte der Zieltabelle soll ein Index rein, also eine Nummerierung von 1-n!
Das muss ich jetzt noch einfügen, womit meine Tabelle auch schon fertig sein müsste.
Danke erstmal für deine Hilfe.
Falls noch was sein sollte, melde ich mich wieder!
Gruß
Florian
Übrigens habe ich das Problem schon selber gelöst:
und zwar in steht in der Definition der Variablen l = ....End(xlToLeft)....
Es muss aber xlUp heißen. Jetzt funktionierts.
Das l= l-1 war schon absicht, da ich die erste Spalte der Quelltabelle nicht auslesen will. In der ersten Spalte der Zieltabelle soll ein Index rein, also eine Nummerierung von 1-n!
Das muss ich jetzt noch einfügen, womit meine Tabelle auch schon fertig sein müsste.
Danke erstmal für deine Hilfe.
Falls noch was sein sollte, melde ich mich wieder!
Gruß
Florian
Antwort 9 von Guenter
Hallo Florian,
nochmals zur Erklärung:
xlToLeft nimmt nur die letzte gefüllte Spalte, während xlUp alle Spalten nimmt, d.h. l = 256.
Damit kann nichts passieren und Deine Zieltabelle ist ok.
Das die erste Spalte Deiner Quelltabelle nicht ausgelesen wird hast Du erreicht mit
Die 2 gibt eben die 2. Spalte an.
Ich wünsche noch einen schönen Tag
Grünter
nochmals zur Erklärung:
xlToLeft nimmt nur die letzte gefüllte Spalte, während xlUp alle Spalten nimmt, d.h. l = 256.
Damit kann nichts passieren und Deine Zieltabelle ist ok.
Das die erste Spalte Deiner Quelltabelle nicht ausgelesen wird hast Du erreicht mit
Range(Cells(4, 2),... Die 2 gibt eben die 2. Spalte an.
Ich wünsche noch einen schönen Tag
Grünter
Antwort 10 von Florian S.
Hallo,
neues Problem.
Wie man sieht starte ich die Abfrage erst in der 4. Zeile!
In der 1. und 2. stehen ein Name und ein Datum. Diese Werte möchte ich nun in der Zieltabelle hinter jeden Datensatz aus der Quelldatei schreiben.
Irgendeine Idee?
neues Problem.
Wie man sieht starte ich die Abfrage erst in der 4. Zeile!
In der 1. und 2. stehen ein Name und ein Datum. Diese Werte möchte ich nun in der Zieltabelle hinter jeden Datensatz aus der Quelldatei schreiben.
Irgendeine Idee?
Antwort 11 von Guenter
Hallo Florian,
sollte kein Problem sein.
Nach dem Paste gehst Du wieder in die Quelltabelle, selektierst die Zellen die Du kopieren möchtest, kopierst und
gehst wieder in die Zieltabelle, selektierst die Einfügezelle und Paste.
So etwa könnte es aussehen:
Deine Angabe
verstehe ich nicht so ganz.
Gruß
Günter
sollte kein Problem sein.
Nach dem Paste gehst Du wieder in die Quelltabelle, selektierst die Zellen die Du kopieren möchtest, kopierst und
gehst wieder in die Zieltabelle, selektierst die Einfügezelle und Paste.
So etwa könnte es aussehen:
...
ActiveSheet.Paste
Workbooks(n).Activate
Range(Cells(1,1),Cells(2,1)).Select
Selection.Copy
Workbooks(1).Activate
' Hier soll jetzt die Zelle stehen,
'in die eingefügt werden kann.
ActiveSheet.Paste
Workbooks (n).Activate
ActiveWorkbook.Close
...
Deine Angabe
Zitat:
...in der Zieltabelle hinter jeden Datensatz aus der Quelldatei schreiben.
...in der Zieltabelle hinter jeden Datensatz aus der Quelldatei schreiben.
verstehe ich nicht so ganz.
Gruß
Günter
Antwort 12 von Guenter
Hallo Florian,
bist Du gestern noch weiter gekommen?
Bei meiner Antwort 11 im Forum habe ich
angefangen, Deine Frage zu beantworten.
Wenn "hinter jeden Datensatz" bedeutet: unterhalb der eingefügten Zellen, so musst Du die letzte Reihe in Spalte 1 auslesen, die darunter stehende Zelle selektieren und dann pasten.
In meinem Beispiel im Forum (Antwort 11) sollten die Zeilen so aussehen:
Gruß
Günter
bist Du gestern noch weiter gekommen?
Bei meiner Antwort 11 im Forum habe ich
angefangen, Deine Frage zu beantworten.
Wenn "hinter jeden Datensatz" bedeutet: unterhalb der eingefügten Zellen, so musst Du die letzte Reihe in Spalte 1 auslesen, die darunter stehende Zelle selektieren und dann pasten.
In meinem Beispiel im Forum (Antwort 11) sollten die Zeilen so aussehen:
' Hier soll jetzt die Zelle stehen,
'in die eingefügt werden kann.
k = Cells(Rows.Count, 1).End(xlUp).Row
Cells(k + 1, 1).Select
Gruß
Günter

