Supportnet Computer
Planet of Tech

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:


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

Antwort 3 von Guenter

Hallo Florian,

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)

Antwort 5 von Guenter

Nimm vielleicht mal das l = l-1 heraus.

Gruß
Günter

Antwort 6 von Florian S.

Nein das hat nichts gebracht.
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


l = Cells(1, Columns.Count).End(xlToLeft).Column


wird 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


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
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?

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:

...
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.


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:

 
' 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