Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
420to424
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
420to424
420to424
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Verzeichnis auslesen -> Daten auflisten!

Verzeichnis auslesen -> Daten auflisten!
Oliver
Hi an alle,
ich dreh mich mal wieder im Kreis. Ich möchte folgendes bewerkstelligen: In einem Ordner befinden sich mehrere Exceldateien. Ich möchte nun aus jeder Datei den Inhalt aus Zelle A2, B2, C2 und den Tabellenblattname in eine andere Datei kopieren. Allerdings besteht jede Datei aus mehreren Tabellenblätter, deren Zelleninhalt von A2, B2, C2 und Tabellenblattname ebenfalls kopiert werden sollen. Die Anzahl der Tabellenblätter in den Dateien ist aber unterschiedlich. Also, es können mal 2 oder 4 usw. sein. Ich habe mir ein Makro hingebastelt, welches mir die Dateien aus dem Ordner auflistet und hinter dem Namen entsprechend den Tabellenblattnamen des 1.Tabellenblatts und dahinter die Werte aus den Zellen. Nur weiß ich jetzt nicht, wie ich die anderen Tabellenblätter einer Datei automatisch auslese und die Werte jeweils eine Zeile tiefer in der anderen Datei einfüge. Nachfolgend mal das Makro, wie ich es im Moment aussieht.

Sub Daten_kopieren()
Dim sFile As String, sPath As String
Application.ScreenUpdating = False
Range("A2:D50").ClearContents
sPath = "D:\Scheckelhoff\Daten Günther\HDF"
If Right(sPath, 1) <> "/" Then sPath = sPath & "\"
sFile = Dir(sPath & "*.xls")
Do While sFile <> ""
zeilennr = Range("A65536").End(xlUp).Row + 1
Cells(zeilennr, 1) = sFile
sFile = Dir()
Loop
Pfad = "D:\Scheckelhoff\Daten Günther\HDF\"
Anzahl = Range("A1") + 1
For i = 2 To Anzahl
Datei = Cells(i, 1).Value
Workbooks.Open Pfad & Datei
Workbooks("Inhalt.xls").Sheets("Tabelle1").Cells(i, 2) = ActiveSheet.Name
Cells(2, 1).Copy Workbooks("Inhalt.xls").Sheets("Tabelle1").Cells(i, 3)
Cells(2, 2).Copy Workbooks("Inhalt.xls").Sheets("Tabelle1").Cells(i, 4)
Cells(2, 3).Copy Workbooks("Inhalt.xls").Sheets("Tabelle1").Cells(i, 5)
ActiveWindow.Close
Next i
Application.ScreenUpdating = True
End Sub

Ich hoffe, jemand ersteht was ich vorhabe. Wenn es noch Unklarheiten geben sollte, bitte melden, damit ich diese beantworten kann.
Danke Euch schon mal im Voraus,
Oliver
AW: Verzeichnis auslesen -> Daten auflisten!
Holger
Hallo Oliver,
versuche es mal so in der Art:

Sub Daten_kopieren()
Dim sFile As String, sPath As String
Application.ScreenUpdating = False
Range("A2:D50").ClearContents
sPath = "D:\Scheckelhoff\Daten Günther\HDF"
If Right(sPath, 1) <> "/" Then sPath = sPath & "\"
sFile = Dir(sPath & "*.xls")
Do While sFile <> ""
zeilennr = Range("A65536").End(xlUp).Row + 1
Cells(zeilennr, 1) = sFile
sFile = Dir()
z=1
Loop
Pfad = "D:\Scheckelhoff\Daten Günther\HDF\"
Anzahl = Range("A1") + 1
For i = 2 To Anzahl
z=z+1
Datei = Cells(i, 1).Value
Workbooks.Open Pfad & Datei
Workbooks("Inhalt.xls").Sheets("Tabelle1").Cells(z, 2) = ActiveSheet.Name
Cells(2, 1).Copy Workbooks("Inhalt.xls").Sheets("Tabelle1").Cells(z, 3)
Cells(2, 2).Copy Workbooks("Inhalt.xls").Sheets("Tabelle1").Cells(z, 4)
Cells(2, 3).Copy Workbooks("Inhalt.xls").Sheets("Tabelle1").Cells(z, 5)
ActiveWindow.Close
Next i
Application.ScreenUpdating = True
End Sub

mfg Holger
Anzeige
Bringt mich leider nicht weiter!
Oliver
Hi Holger,
danke für den Versuch mir zu helfen, aber mit Deiner Änderung in dem Code passiert genau soviel wie mit meinem alten. Leider bringt mich das nicht weiter. Ich möchte dass nacheinander alle Dateien ausgelesen werden. In allen Dateien sollen alle in der Datei vorhandenen Tabellenblätter ausgelesen werden. Die ausgelesenen Zellinhalte sollen in die Extradatei kopiert werden. Das ganze untereinander.
Es müsste dann dort stehen
Daten 01.xls
Tabelle 1 -------5€
Tabelle 2 -------10€
Tabelle 3 -------7€
Daten 02.xls
Tabelle 1 -------2€
Tabelle 2 -------1€
.
.
.
usw.
Gruß,
Oliver
Anzeige
Vielleicht so ?
Ramses
Hallo
Ungetestet, sollte aber tun.
Probier einfach mal im Einzelschritt, dann siehst du gleich wo es eventuell hapert.

Sub Daten_kopieren()
Dim sFile As String, sPath As String
Dim qWb As Workbook, qWks As Worksheet, tarWks As Worksheet
Set tarWks = Workbooks("Inhalt.xls").Sheets("Tabelle1")
Application.ScreenUpdating = False
Range("A2:D50").ClearContents
sPath = "D:\Scheckelhoff\Daten Günther\HDF"
If Right(sPath, 1) <> "/" Then sPath = sPath & "\"
sFile = Dir(sPath & "*.xls")
Do While sFile <> ""
sFile = Dir()
tarWks.Cells(Rows.Count, 1).End(xlUp).Row 1 = sFile
For i = 2 To Anzahl
Workbooks.Open "" & sPfad & sFile & ""
Set qWb = ActiveWorkbook
For Each qWks In qWb
tarWks.Cells(i, 2) = qWks.Name
qWks.Cells(2, 1).Copy _
Destination:=tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 3)
qWks.Cells(2, 2).Copy _
Destination:=tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row, 4)
qWks.Cells(2, 3).Copy _
Destination:=tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row, 5)
Next
Next i
Loop
Application.ScreenUpdating = True
End Sub

Gruss Rainer
Anzeige
Leider ein Fehler!
Oliver
Hi Ramses,
danke Dir für Deine Antwort. Leider gibt es eine Fehlermeldung in Zeile
tarWks.Cells(Rows.Count, 1).End(xlUp).Row 1 = sFile
Dort kommt ein Lufzeitfehler 13, Typen unverträglich
Woran könnte das liegen? Ich hoffe, dass Du mir darauf eine Antwort geben kannst.
Danke,
Oliver
AW: Leider ein Fehler!
Ramses
Hallo
Sorry,... aus der Hand geschrieben :-)
tarWks.Cells(Rows.Count, 1).End(xlUp).Row +1 = sFile
muss es heissen.
Gruss Rainer
Bekomme Deine Anweisung nicht in meine Datei!
Oliver
Hi Ramses,
danke Dir für die Antwort. Irgendwie bekomme ich es aber nicht hin, bzw. wenn ich Deine berichtigte Zeile kopiere und bei mir einfüge, ist das Pluszeichen vor der 1 verschwunden. Lässt sich auch nicht davor schreiben. Sobald ich aus der zeile raus bin, verschwindet das zeichen wieder. Was mache ich falsch?
Danke,
Oliver
Anzeige
AW: Bekomme Deine Anweisung nicht in meine Datei!
Ramses
Hallo
Sorry, kompleter Quatsch :-(
Der Code ist neu geschrieben mit allen Variablen und Fehlerkorrigiert.
Er ist getestet und funktioniert.
Option Explicit

Sub Daten_kopieren()
Dim sFile As String, sPath As String
Dim qWb As Workbook, qWks As Worksheet, tarWks As Worksheet
Dim i As Integer, Anzahl As Integer
Set tarWks = Workbooks("Inhalt.xls").Sheets("Tabelle1")
Application.ScreenUpdating = False
Range("A2:D50").ClearContents
sPath = "C:\" '"D:\Scheckelhoff\Daten Günther\HDF"
If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
Debug.Print Dir(sPath & "*.xls")
Do While Dir(sPath & "*.xls") <> ""
sFile = Dir(sPath & "*.xls")
tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1) = sFile
For i = 2 To 5
Workbooks.Open "" & sPath & sFile & ""
Set qWb = ActiveWorkbook
For Each qWks In qWb.Worksheets
tarWks.Cells(i, 2) = qWks.Name
qWks.Cells(2, 1).Copy _
Destination:=tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 3)
qWks.Cells(2, 2).Copy _
Destination:=tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row, 4)
qWks.Cells(2, 3).Copy _
Destination:=tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row, 5)
Next
qWb.Close False
Next i
Loop
Application.ScreenUpdating = True
End Sub

Gruss Rainer
Anzeige
Makro läuft als Endlosschleife!
Oliver
Hi Ramses,
also irgendwie komme ich nicht klar. Bei mir läuft der Code als Endlosschleife. Ich habe mal das Verzeichnis nur mit 4 Exceldateien gefüllt. Wenn der Code startet, wird aber scheinbar immer nur eine von den 4 Dateien geöffnet und dort scheinbar nur Tabelle3 und das immer wieder, bis ich mit ESC den Code unterbreche. Dann wird mir in der Spalte A in der seperaten Datei auch nur ein Dateiname geschrieben und dass in 38 Zeilen. Mache ich wwas falsch oder leigt es an meinem Excel oder oder oder? Für eine Antwort wäre ich Dir sehr dankbar.
Gruß,
Oliver
AW: Makro läuft als Endlosschleife!
Ramses
Hallo
Uff, schwere Geburt :-)
Man sollte dann halt auch mit mehreren Testen :-)
So, ... das sollte nun tun ;-)
Option Explicit

Sub Daten_kopieren()
Dim sFile As String, sPath As String
Dim qWb As Workbook, qWks As Worksheet, tarWks As Worksheet
Dim i As Integer, tarRow As Integer
Set tarWks = Workbooks("Inhalt.xls").Worksheets("Tabelle1")
Application.ScreenUpdating = False
Range("A2:D50").ClearContents
sPath = "D:\Scheckelhoff\Daten Günther\HDF"
If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
sFile = Dir(sPath & "*.xls")
Do While sFile <> ""
tarRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
tarWks.Cells(tarRow, 1) = sFile
Workbooks.Open sPath & sFile
Set qWb = ActiveWorkbook
For Each qWks In qWb.Worksheets
tarWks.Cells(tarRow, 2) = qWks.Name
qWks.Cells(tarRow, 1).Copy _
Destination:=tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 3)
qWks.Cells(tarRow, 2).Copy _
Destination:=tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row, 4)
qWks.Cells(tarRow, 3).Copy _
Destination:=tarWks.Cells(Cells(Rows.Count, 1).End(xlUp).Row, 5)
Next
qWb.Close False
sFile = Dir()
Loop
Application.ScreenUpdating = True
End Sub

Gruss Rainer
Anzeige
Leider geht die schwere Geburt noch weiter!
Oliver
Moin Ramses,
sorry, dass ich mich erst heute morgen melde. Danke Dir für Deine Bemühungen mir zu helfen. Es ist mir schon fast peinlich, aber dass ist noch nicht so, wie ich es mir vorgestellt habe. Dein Makro ließt das Verzeichnis aus und listet mir die Dateinamen untereinander auf. Das ist OK. Dann wird scheinbar jede Datei geöffnet und dort soll von jeder Datei die Tabellenblätter ermittelt werden und deren Namen sollen untereinander aufgeführt werden. In Deinem Makro wird aber immer nur ein Tabellenblattname ausgelesen und in eine Zelle geschrieben. Dann sollen festgelegte Zelleninhalte aus jedem Tabellenblatt hinter den jeweiligen Tabellenblattnamen kopiert werden. Das funktionierte in meinem alten Makro schon. In dem neuen werden gar keine Zelleninhalte mehr ausgelesen und kopiert. Ich habe mal ein Screenshot hochgeladen (Hätte auch gerne die Datei hochgeladen, funktionierte aber komischerweise nicht und es wurde nur das Bild akzeptiert), aus der vielleicht etwas ersichtlicher wird, was ich mir vorstelle.
Userbild
Wenn Du so nett wärst und Dir das mal anschauen würdest und mir dann noch mal helfen würdest, das in die Tat umzusetzen? Wäre super.
Danke Dir,
Oliver
Anzeige
AW: Leider geht die schwere Geburt noch weiter!
Ramses
Hallo
wenn ich das Bild gleich gehabt hätte, hätten wir uns einen Geburtsvorgang sparen können:-)
Ich mache das heute nachmittag noch :-)
Gruss Rainer
AW: Leider geht die schwere Geburt noch weiter!
Oliver
Super Ramses, Du bist eine Wucht. Danke Dir auch für die Hilfe und sorry, das ich Dich auf eine falsche Pfährte geführt habe.
Gruß,
Oliver
AW: Leider geht die schwere Geburt noch weiter!
Ramses
Hallo
dass sollte es nun sein :-)
Option Explicit

Sub Daten_kopieren()
Dim sFile As String, sPath As String
Dim qWb As Workbook, qWks As Worksheet, tarWks As Worksheet
Dim i As Integer, tarRow As Integer
Set tarWks = Workbooks("Inhalt.xls").Worksheets("Tabelle1")
tarRow = tarWks.Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
Range("A2:D50").ClearContents
sPath = "C:\" '"D:\Scheckelhoff\Daten Günther\HDF"
If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
sFile = Dir(sPath & "*.xls")
Do While sFile <> ""
tarWks.Cells(tarRow, 1) = sFile
tarRow = tarRow + 1
If sFile <> ThisWorkbook.Name Then
Workbooks.Open sPath & sFile
Else
GoTo exit_loop
End If
Set qWb = ActiveWorkbook
For Each qWks In qWb.Worksheets
tarWks.Cells(tarRow, 2) = qWks.Name
'liest aus sFile A2
qWks.Cells(2, 1).Copy _
Destination:=tarWks.Cells(tarRow, 3)
'liest aus sFile B2
qWks.Cells(2, 2).Copy _
Destination:=tarWks.Cells(tarRow, 4)
'liest aus sFile C2
qWks.Cells(2, 3).Copy _
Destination:=tarWks.Cells(Cells(tarRow, 5).Row, 5)
tarRow = tarRow + 1
Next
qWb.Close False
exit_loop:
sFile = Dir()
Loop
Application.ScreenUpdating = True
End Sub

Gruss Rainer
Anzeige
Eine Kleinigkeit noch!
Oliver
Hi Ramses,
das ging ja schneller, als ich gedacht hatte. Ist super geworden. Nur einen kleinen Schönheitsfehler hat das Makro noch. Wenn ich es zwei oder mehr mals hintereinander ausführe, werden mir die kopierten Daten immer weiter nach unten in dem Arbeitsblatt verschoben, so dass die ersten 10, 20, 30 Zeile leer sind und dann erst die kopierten Daten auftauchen. Es sollte allerdings so sein, dass sie immer ab Zeile 2 eingefügt werden sollen. Geht dass noch irgendwie zu ändern? Ich baue auf Dich.
Danke Dir,
Oliver
Habs hinbekommen!
Oliver
Hi Ramses,
hat sich erledigt, habe ich selber hinbekommen. Habe die Zeile
tarRow = tarWks.Cells(Rows.Count, 1).End(xlUp).Row
an einer anderen Stelle der Anweisung eingefügt. Damit funktioniert es. Danke Dir nochmals für Deine ausdauernde Hilfe,
Oliver
Anzeige
Doch noch eine kleine Nachfrage!
Oliver
Hi Ramses,
einen Änderungswunsch hätte ich da noch. Ist es möglich, dass nachdem eine Datei ausgelesen wurde und die Daten in die Etradatei kopiert wurde, erst eine Leerzeile eingefügt wird, bevor die nächste Datei kommt? Habe dazu noch mal ein Bild hochgeladen. Hier sind die Zeilen, die eingefügt erden sollen gelb markiert.
Userbild
Ich hoffe das funktioniert irgendwie, ich habs jedenfalls nicht hinbekommen. Danke Dir schon mal im Voraus, dass Du mein nerviges Gefrage so hin nimmst,
Oliver
Merci :-) Geschlossen o.T.
Ramses
...
Halt, noch nicht geschlossen!
Oliver
Hi Ramses,
hast Du meine letzte Frage an Dich übersehen oder gibt es für das was ich gefragt habe keine Lösungsmöglichkeit? Ich hoffe, dass Du die Frage nur übersehen hast. Wäre nett, wenn Du Dich dazu noch mal melden könntest.
Danke Oliver
AW: Halt, noch nicht geschlossen!
Ramses
Hallo
Sorry, ich dachte du hättest es hinbekommen
Option Explicit

Sub Daten_kopieren()
Dim sFile As String, sPath As String
Dim qWb As Workbook, qWks As Worksheet, tarWks As Worksheet
Dim i As Integer, tarRow As Integer
Set tarWks = Workbooks("Inhalt.xls").Worksheets("Tabelle1")
tarRow = tarWks.Cells(Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
Range("A2:D50").ClearContents
sPath = "C:\" '"D:\Scheckelhoff\Daten Günther\HDF"
If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
sFile = Dir(sPath & "*.xls")
Do While sFile <> ""
tarWks.Cells(tarRow, 1) = sFile
tarRow = tarRow + 1
If sFile <> ThisWorkbook.Name Then
Workbooks.Open sPath & sFile
Else
GoTo exit_loop
End If
Set qWb = ActiveWorkbook
For Each qWks In qWb.Worksheets
tarWks.Cells(tarRow, 2) = qWks.Name
'liest aus sFile A2
qWks.Cells(2, 1).Copy _
Destination:=tarWks.Cells(tarRow, 3)
'liest aus sFile B2
qWks.Cells(2, 2).Copy _
Destination:=tarWks.Cells(tarRow, 4)
'liest aus sFile C2
qWks.Cells(2, 3).Copy _
Destination:=tarWks.Cells(Cells(tarRow, 5).Row, 5)
tarRow = tarRow + 1
Next
qWb.Close False
exit_loop:
'Das erzeugt die zusätzliche Leerzeile
tarRow = tarRow + 1
sFile = Dir()
Loop
Application.ScreenUpdating = True
End Sub

Gruss Rainer
Nun ist es so, wie es sein sollte!
Oliver
Hi Ramses,
danke Dir von ganzem Herzen. Jetzt ist es so, wie ich es mir vorgestellt habe. Danke auch, dass Du so bereeitwillig meine Ergänzungen mit eingebaut hast.
Schönes Wochenende,
Oliver
Merci :-)) Definitiv Geschlossen ;-) o.T.
Ramses
...

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige