Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1700to1704
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Daten zentralisieren für weitere Verwendung

VBA Daten zentralisieren für weitere Verwendung
15.07.2019 14:22:36
Tim
Hallo zusammen,
ich bin anscheinend zu dämlich nen Thread aus dem Archiv zurück zu holen, bitte steinigt mich nicht. Ich verzweifel momentan an etwas denkbar einfachem und komme mir derweil auch etwas blöd vor. Und zwar verzweifel ich an copy/paste/range.
Im anderen Thread wurde es mit folgendem Makro auf 'gelöst' gesetzt. Leider ist es das nicht. Ich möchte ein Makro welches den kompletten Inhalt eines Tabellenblatts kopiert, auf ein neues einfügt. Dann die nächste Datei öffnen und neben dem eben eingefügten, wieder einfügen. Die Tabellen sollen also nebeneinander angeordnet werden. Der Code zum öffnen aller Excel Dateien aus einem Quellordner ist kein Problem. Weiterhin ist die Codevorlage aber so aufgebaut, dass sie jede Zelle einzeln befüllt. Ist für mich extrem schlecht, da ich so durch bloßes Argumente austauschen nicht gedreht bekomme. Es scheitert bei mir daran, für den nächsten Durchlauf (wenn er eine neue Datei aufruft, die DO Schleife) die Anfangsspalte auf die zuletzt Benutzte + 1 festzulegen.
In der Vorlage wird in jedem Durchlauf jede Zelle einzeln befüllt und die Ergebniszeile dann um einen Wert nach unten gesetzt. Daher funktioniert das auch ganz hervorragend für mehrere Dateien.
Wenn ich nun aber Spalten will - kann man das nicht einfach drehen. Er befüllt ja weiter Zeilenweise, nicht Spaltenweise. Daher muss er solange Zeilen anfügen und füllen, bis eine eine Datei fertig ist. Dann den Anfangswert für die Spalte entsprechend erhöhen und wieder zeilenweise auffüllen... nur wie? Ich komme nicht weiter und bitte um Hilfe ...
Original Code:
Sub MWTabellenAusMehrerenDateienEinlesen()
Dim oTargetSheet As Object
Dim oSourceBook As Object
Dim sPfad As String
Dim sDatei As String
Dim lErgebnisZeile As Long
Dim s As Long
Dim z As Long
Application.ScreenUpdating = False 'Das "Flackern" ausstellen
'Schritt 1: Neues Arbeitsblatt für die Ergebnisse erstellen
Set oTargetSheet = ActiveWorkbook.Sheets.Add
lErgebnisZeile = 1 'Ergebnisse eintragen ab Zeile 1
'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
sPfad = "C:\TEST\Sammlung\"
sDatei = Dir(CStr(sPfad & "*.xl*")) 'Alle Excel Dateien
Do While sDatei  ""
'Schritt 3: öffnen der Datei und Datenübertragung
Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True) 'nur lesend öffnen
'Datenübertragung alle genutzten Zeilen und Spalten
For z = 1 To oSourceBook.Sheets("Tabelle1").UsedRange.Rows.Count
'Keine Leerzeilen verarbeiten
If Trim(CStr(oSourceBook.Sheets("Tabelle1").Cells(z, 1).Value))  "" Then
For s = 1 To oSourceBook.Sheets("Tabelle1").UsedRange.Columns.Count
'Spalte 1 - Dateinamen
oTargetSheet.Cells(lErgebnisZeile, 1).Value = sDatei
'Spalte 2 bis n - Tabelleninhalte des Arbeitsblattes "Tabelle1"
oTargetSheet.Cells(lErgebnisZeile, s + 1).Value = _
oSourceBook.Sheets("Tabelle1").Cells(z, s).Value
Next s
lErgebnisZeile = lErgebnisZeile + 1
End If
Next z
'Schritt 4: Datei wieder zu machen und nächste Schleifenrunde
oSourceBook.Close False 'nicht speichern
'Nächste Datei
sDatei = Dir()
Loop
Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
'Variablen aufräumen
Set oTargetSheet = Nothing
Set oSourceBook = Nothing
End Sub
Meine Idee, hat leider nichts verändert...
Sub MWTabellenAusMehrerenDateienEinlesen()
Dim oTargetSheet As Object
Dim oSourceBook As Object
Dim sPfad As String
Dim sDatei As String
Dim lErgebnisZeile As Long
Dim lErgebnisSpalte As Long
Dim s As Long
Dim z As Long
Dim s1 As Long
Application.ScreenUpdating = False 'Das "Flackern" ausstellen
'Schritt 1: Neues Arbeitsblatt für die Ergebnisse erstellen
Set oTargetSheet = ActiveWorkbook.ActiveSheet
lErgebnisZeile = 1 'Ergebnisse eintragen ab Zeile 1
lErgebnisSpalte = 1
'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
sPfad = "C:\Users\halletim\Desktop\Heinz Projekt\"
sDatei = Dir(CStr(sPfad & "*.xl*")) 'Alle Excel Dateien
Do While sDatei  ""
'Schritt 3: öffnen der Datei und Datenübertragung
Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True) 'nur lesend öffnen
'Datenübertragung alle genutzten Zeilen und Spalten
For z = 1 To oSourceBook.Sheets(1).UsedRange.Rows.Count
s1 = oSourceBook.Sheets(1).UsedRange.Columns.Count
'Keine Leerzeilen verarbeiten
If Trim(CStr(oSourceBook.Sheets(1).Cells(z, 1).Value))  "" Then
For s = 1 To oSourceBook.Sheets(1).UsedRange.Columns.Count
'Spalte 2 bis n - Tabelleninhalte des Arbeitsblattes 1
oTargetSheet.Cells(lErgebnisZeile, lErgebnisSpalte).Value = _
oSourceBook.Sheets(1).Cells(z, s).Value
Next s
lErgebnisZeile = lErgebnisZeile + 1
End If
Next z
lErgebnisSpalte = s1 + 1
'Schritt 4: Datei wieder zu machen und nächste Schleifenrunde
oSourceBook.Close False 'nicht speichern
'Nächste Datei
sDatei = Dir()
Loop
End Sub
Der Code aus dem anderen Thread der alles in eine Zeile schreibt..
Sub MWTabellenAusMehrerenDateienEinlesen()
Dim oTargetSheet As Object
Dim oSourceBook As Object
Dim sPfad As String
Dim sDatei As String
Dim lErgebnisSpalte As Long
Dim s As Long
Dim z As Long
Application.ScreenUpdating = False 'Das "Flackern" ausstellen
'Schritt 1: Neues Arbeitsblatt für die Ergebnisse erstellen
Set oTargetSheet = ActiveWorkbook.Sheets.Add
lErgebnisSpalte = 1 'Ergebnisse eintragen ab Zeile 1
'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
sPfad = "C:\Test\Sammlung\"
sDatei = Dir(CStr(sPfad & "*.xl*")) 'Alle Excel Dateien
Do While sDatei  ""
'Schritt 3: öffnen der Datei und Datenübertragung
Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True) 'nur lesend öffnen
'Datenübertragung alle genutzten Zeilen und Spalten
For z = 1 To oSourceBook.Sheets("Tabelle1").UsedRange.Rows.Count
'Keine Leerzeilen verarbeiten
'Spalte 1 - Dateinamen
oTargetSheet.Cells(1, lErgebnisSpalte).Value = sDatei
If Trim(CStr(oSourceBook.Sheets("Tabelle1").Cells(z, 1).Value))  "" Then
For s = 1 To oSourceBook.Sheets("Tabelle1").UsedRange.Columns.Count
'Spalte 2 bis n - Tabelleninhalte des Arbeitsblattes "Tabelle1"
lErgebnisSpalte = lErgebnisSpalte + 1
oTargetSheet.Cells(1, lErgebnisSpalte).Value = _
oSourceBook.Sheets("Tabelle1").Cells(z, s).Value
Next s
lErgebnisSpalte = lErgebnisSpalte + 1
End If
Next z
'Schritt 4: Datei wieder zu machen und nächste Schleifenrunde
oSourceBook.Close False 'nicht speichern
'Nächste Datei
sDatei = Dir()
Loop
Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
'Variablen aufräumen
Set oTargetSheet = Nothing
Set oSourceBook = Nothing
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Daten zentralisieren für weitere Verwendung
15.07.2019 14:40:50
onur
Du schreibst doch: "Ich möchte ein Makro welches den kompletten Inhalt eines Tabellenblatts kopiert, auf ein neues einfügt" und etwas darunter sprichst du plötzlich von zeilenweise und spaltenweise?
Was denn jetzt? Alles oder Spalten und Zeilen?
Was ist mit: "Dann die nächste Datei öffnen und neben dem eben eingefügten, wieder einfügen" - Neben dem Blatt (also das Blatt daneben ) oder neben dem eingefügten?
" Die Tabellen sollen also nebeneinander angeordnet werden." ?
Ich glaube, du verwechselst irgendwie Tabellen (Arbeitsblätter, Sheets) mit Datenblöcken.
Ausserdem: ohne die Datei vor sich zu haben, ist alles nur Raterei.
Anzeige
AW: VBA Daten zentralisieren für weitere Verwendung
15.07.2019 15:00:40
Tim
Hallo Onur,
entschuldige... wenn man Stunden im Code ist, klingt die eigene Gedankenwelt immer absolut logisch ;)
Also ich öffne mehrere Dateien aus einem Quellordner. Hierbei sollen stets alle Daten von Sheet 1 in ein neues Tabellenblatt meiner Datei (aus welcher ich das Makro ausführe) übernommen werden.
Das automatisierte öffnen klappt auch.
Daneben soll heißen: Gleiches Blatt, nur eben neben den letztmalig importierten Daten. Tabellen und Datenbereich habe ich synonym verwendet. Mit Tabelle meine ich nicht = Tabellenblatt.
Also aus verschiedenen Excel Dateien sollen Daten aus dem jeweils ersten Sheet komplett übernommen werden. Diese sollen allerdings nicht untereinander (auf demselben Blatt) sondern nebeneinander kopiert werden.
Anzeige
AW: VBA Daten zentralisieren für weitere Verwendung
15.07.2019 15:02:39
onur
Ist der Datenblock immer gleich breit bzw lang?
AW: VBA Daten zentralisieren für weitere Verwendung
15.07.2019 15:56:41
Tim
@Onur,
nein, die Datenquellen haben jeweils unterschiedliche Größen. Einzige Gemeinsamkeit ist, dass diese immer auf Sheet1 stehen, in jeder Datei. Und ab A1 anfangen. Ab dort, keine Gemeinsamkeit mehr.
VBA Daten zentralisieren für weitere Verwendung
15.07.2019 15:08:24
Rudi
Hallo,
teste mal:
Sub MWTabellenAusMehrerenDateienEinlesen()
Dim oTargetSheet As Worksheet, oTargetRange As Range
Dim oSourceBook As Workbook
Dim sPfad As String
Dim sDatei As String
Dim lngColumns As Long
Application.ScreenUpdating = False 'Das "Flackern" ausstellen
'Schritt 1: Neues Arbeitsblatt für die Ergebnisse erstellen
Set oTargetSheet = ActiveWorkbook.Sheets.Add
'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
sPfad = "C:\TEST\Sammlung\"
sDatei = Dir(CStr(sPfad & "*.xl*")) 'Alle Excel Dateien
Do While sDatei  ""
'Schritt 3: öffnen der Datei und Datenübertragung
Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True) 'nur lesend öffnen
'Datenübertragung alle genutzten Zeilen und Spalten
Set oTargetRange = oTargetSheet.Cells(1, Columns.Count).End(xlToRight).Offset(, 2)
lngColumns = oSourceBook.Sheets("Tabelle1").Cells(1, 1).CurrentRegion.Columns.Count
oSourceBook.Sheets("Tabelle1").Cells(1, 1).CurrentRegion.Copy oTargetRange
oTargetRange.EntireColumn.SpecialCells(xlCellTypeBlanks).Resize(, lngColumns).Delete
'Schritt 4: Datei wieder zu machen und nächste Schleifenrunde
oSourceBook.Close False 'nicht speichern
'Nächste Datei
sDatei = Dir()
Loop
Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
'Variablen aufräumen
Set oTargetSheet = Nothing
Set oSourceBook = Nothing
End Sub
Gruß
Rudi
Anzeige
AW: VBA Daten zentralisieren für weitere Verwendung
15.07.2019 15:54:04
Tim
@Onur,
nein, die Datenquellen haben jeweils unterschiedliche Größen. Einzige Gemeinsamkeit ist, dass diese immer auf Sheet1 stehen, in jeder Datei. Und ab A1 anfangen. Ab dort, keine Gemeinsamkeit mehr.
@Rudi,
wow vielen Dank. Der Code schaut komplizierter aus. Leider gibt er ebenfalls einen 1004er aus.
Markiert wird diese Zeile,
Set oTargetRange = oTargetSheet.Cells(1, Columns.Count).End(xlToRight).Offset(, 2)
Wobei die Werte bis dato wie folgt sind
oTargetRange = Nothing
Set oTargetRange = oTargetSheet.Cells(1, Columns.Count) Coloumns.Count = 16384
xlToRight = -4161
Offset = xlCellTypeBlanks = 4
Danke an alle für die Hilfe bis hierhin!
Anzeige
mein Fehler
15.07.2019 16:18:26
Rudi
Hallo,
wenn man rechts und links verwechselt...
Set oTargetRange = oTargetSheet.Cells(1, Columns.Count).End(xlToLeft).Offset(, 2)
Gruß
Rudi
AW: mein Fehler
17.07.2019 09:04:18
Tim
Hallo Rudi,
dein Code funktioniert nun ganz hervorragend. Und ich habe schon erkannt, dass es die Offset Funktion ist, die mir selbst gefehlt hat. Glaube ich habe nun auch verstanden wie Du es gelöst hast und konnte den Code bereits ein wenig erweitern und anpassen.
Vielen vielen Dank!; Klasse Hilfe und Support von Dir und Euch!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige