Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Copy paste VBA
#1
Guten Tag zusammen,

Ich würde gerne eine Vielzahl von Dateien (alle im gleichen Ordner) ansteuern und deren Inhalt  in eine neue Datei (Datei_konsolidierung nennen wir sie mal) kopieren. Die Dateien sind alle gleich aufgebaut und sollen (so wie es sich gehört) zu einer (Datei_konsolidierung) vereint werden.
Jetzt sollte es natürlich so sein, dass wenn alle Zeilen der ersten Datei in die Datei_konsolidierung kopiert worden sind und die Zeilen aus der nächsten Datei angefügt werden sollen, der bereits bestehende Inhalt nicht überschrieben werden soll, sondern unten angefügt werden (wie sich jeder sicher denken kann =) ).

Kann mir jemand hierzu evtl mal einen Stoß in die richtige Richtung geben, herzlichsten Dank vorab.

Grüße
Fel
Antworten Top
#2
Hallo,

falls es die Daten der Fragebögen sein sollten, wäre es besser die Struktur gleich anzupassen.

mfg
Antworten Top
#3
(25.01.2018, 14:45)Fennek schrieb: Hallo,

falls es die Daten der Fragebögen sein sollten, wäre es besser die Struktur gleich anzupassen.

mfg

Hi,
nein das Thema ist durch. Arbeite an meiner Thesis, dafür bräuchte ich das =)
Antworten Top
#4
Code:
Sub Sammeln()
sQuellpfad = "Pfad"
QZeile = 10 'Zeile in Quelldatei
QSpalten = 15 'Spaltenanzahl
QSpalteAb = "A" ' ab dieser Spalte insgesamt "QSpalten" Spaltenwerte übernehmen
ZZeile = 10 'erste Zeile in Zieldatei
ZSpalteAb = "A" 'erste Spalte in Zieldatei
Set wbGes = ActiveWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oFile In fso.GetFolder(sQuellpfad).Files
   If LCase(Right(oFile.Name, 5)) = ".xlsx" Then 'nur ".xls"-Dateien verarbeiten; bei ".xlsx" natürlich die letzten 5 Zeichen vergleichen
       Application.Workbooks.Open oFile.Path 'Quelldatei öffnen
       'Zellen lt Vorgabe aus Quelldatei lesen und in aktuelle Zeile der Zieldatei schreiben
       wbGes.Worksheets(1).Cells(ZZeile, ZSpalteAb).Resize(1, QSpalten).Value = ActiveWorkbook.Worksheets(1).Cells(QZeile, QSpalteAb).Resize(1, QSpalten).Value
       ActiveWorkbook.Close False 'Quelldatei schließen
       ZZeile = ZZeile + 1 'Zeilennummer Zieldatei erhöhen
End If
Next
wbGes.Save 'Zieldatei speichern
End Sub
Das habe ich bis jetzt und klappt auch echt gut, allerdings wird immer nur die erste Zeile der Quelldatein übertragen.
Wie bekomme ich es hin das alles kopiert wird?
Antworten Top
#5
Hi,

warum holst Du die Daten so aus den Zeilen und machst nicht wirklich Copy und Paste?
Antworten Top
#6
Hallo,

als erstes solltest du dir gleich mal angewöhnen deine Variablen zu deklarieren. Am besten benutzt du Option Explicit, dann meckert der Editor sofort, wenn eine Variable nicht deklariert wurde.

-die letzte belegte Zeile wird im Code in jeder Quelltabelle in Spalte A ermittelt.
-die letzte belegte Spalte wird im Code in jeder Quelltabelle in Zeile 10 ermittelt
-die erste freie Zelle in der Zieltabelle wird im Code in Spalte A ermittelt
-das jeweilige Schließen der geöffneten Quellmappe fehlte im Code, dann hast du z.B. beim Importieren aus 50 Mappen nach dem Makrolauf 50 offene Mappen

Teste mal:

Code:
Option Explicit

Sub Sammeln()
Dim loErsteQuelle As Long 'erste Zeile Quelle
Dim loLetzteQuelle As Long 'letzte Zeile Quelle
Dim loSpalteQuelle As Long 'letzte Spalte Quelle
Dim loErsteZiel As Long 'erste freie Zelle Zielblatt
Dim sQuellpfad As String
Dim wbGes As Workbook
Dim fso As Object
Dim oFile As Object

loErsteQuelle = 10
sQuellpfad = "Pfad"

Set wbGes = ThisWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oFile In fso.GetFolder(sQuellpfad).Files
  If LCase(Right(oFile.Name, 5)) = ".xlsx" Then 'nur ".xls"-Dateien verarbeiten; bei ".xlsx" natürlich die letzten 5 Zeichen vergleichen
      Application.ScreenUpdating = False
      Application.Workbooks.Open oFile.Path 'Quelldatei öffnen
      With ActiveWorkbook.Worksheets(1)
           'Application.ScreenUpdating = False
           'Ermitteln der letzten belegten Zeile Quellblatt, Spalte A
           loLetzteQuelle = .Cells(.Rows.Count, 1).End(xlUp).Row
           'Ermitteln der letzten belegten Spalte Quellblatt, Zeile 10
           loSpalteQuelle = .Cells(loErsteQuelle, .Columns.Count).End(xlToLeft).Column
           'Ermitteln der ersten freien Zeile Zielblatt, Spalte A
           loErsteZiel = wbGes.Worksheets(1).Cells(wbGes.Worksheets(1).Rows.Count, 1).End(xlUp).Row + 1
           If wbGes.Worksheets(1).Cells(10, 1) = "" Then loErsteZiel = 10
           .Range(.Cells(loErsteQuelle, 1), .Cells(loLetzteQuelle, loSpalteQuelle)).Copy _
           wbGes.Worksheets(1).Cells(loErsteZiel, 1)
           'geöffnete Quelldatei ohne Speichern schließen
           ActiveWorkbook.Close False
      End With
      Application.ScreenUpdating = True
End If
Next

'Zieldatei speichern
wbGes.Save
End Sub



Gruß Werner
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste