Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1896to1900
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

Daten aus mehreren XLS auslesen

Daten aus mehreren XLS auslesen
14.09.2022 17:57:04
stef26
Hallo liebe Excelprofis,
ich könnte mal gut Hilfe von echten Profis brauchen.
Ich habe eine Excelliste, in der ich mir in Spalte A von knappen 15.000 Exceldatein den Pfad und Dateinamen aufgelistet habe.
Ein Beispiel: A2
\\ad003.onehk.net\dfs003\Custom\1_LV\15_business\20-MI\20-ERL\20-14-process_engineering\20-14-20-npi\08_Kalkulation\Zeit_FBG_Fertigung\10\10892307_E1M_20120910.xlt
(Die Endungen der Dateien sind xls,xlm,xlt)
Ich würde nun gerne aus 2 Tabellenblättern je 13 Felder aus den jeweiligen Dateien auflisten.
- Tabelle("Lötseite") - Zelle F12; F14; F16; E18; F23; K22;K23;K24;H27; F22; F20;K29 und H32
- Tabelle("Bauteilseite") - Zelle F12; F14; F16; E18; F23; K22;K23;K24;H27; F22; F20;K29 und H32
Habe einiges dazu gefunden, kann dass jedoch nicht auf meine Bedürfnisse anpassen.
Sollte er eines der Tabellenblätter nicht gefunden haben, dann überspringen und nächste Datei suchen.
Da es über den Server eine ganze weile dauert, bis eine Exceldatei geöffnet wurde, wäre es bei der Menge der Daten irgendiwe wichtig das möglichst
immer wieder Daten in die Tabelle geschrieben werden, da ich befürchte, dass das Macro irgendwann nach zig Stunden abstürzt und ich von neuen beginnen muss.
Oder dass er die Datei ggf. gar nicht öffnen muss. (Dauert ca. 2min bis eine dieser 15.000 Dateien geöffnet ist, wenn man das manuell macht)
Hat jemand von euch das schon mal gemacht und hat Erfahrung darin?
Leider bin ich in VBA ne volle Niete und kann da die Lösungen die es im Netz so gibt leider nicht umsetzen...
Liebe Grüße
Stefan

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten aus mehreren XLS auslesen
14.09.2022 18:24:27
Nepumuk
Hallo Stefan,
und wo sollen die gelesenen Daten hin?
Gruß
Nepumuk
AW: Daten aus mehreren XLS auslesen
14.09.2022 18:51:12
stef26
Hallo Nepumuk,
wenn es möglich ist, dann einfach in die Zeile, in der auch der Dateiname in Spalte A steht. Spalte B;C usw.
:-)
Stefan
AW: Daten aus mehreren XLS auslesen
14.09.2022 19:13:08
Nepumuk
Hallo Stefan,
teste mal:

Option Explicit
Public Sub ReadData()
Dim objCell As Range
Dim objWorkbook As Workbook
Dim objWorksheet As Worksheet
For Each objCell In Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))
Application.StatusBar = "   " & CStr(objCell.Row)
If Application.CountA(objCell.EntireColumn) = 1 Then
If Dir$(PathName:=objCell.Text)  vbNullString Then
Set objWorkbook = GetObject(PathName:=objCell.Text)
For Each objWorksheet In objWorkbook.Worksheets
With objWorksheet
Select Case .Name
Case "Lötseite"
objCell.Offset(0, 1).Value = .Range("F12").Value
objCell.Offset(0, 2).Value = .Range("F14").Value
objCell.Offset(0, 3).Value = .Range("F16").Value
objCell.Offset(0, 4).Value = .Range("E18").Value
objCell.Offset(0, 5).Value = .Range("F23").Value
objCell.Offset(0, 6).Value = .Range("K22").Value
objCell.Offset(0, 7).Value = .Range("K23").Value
objCell.Offset(0, 8).Value = .Range("K24").Value
objCell.Offset(0, 9).Value = .Range("H27").Value
objCell.Offset(0, 10).Value = .Range("F22").Value
objCell.Offset(0, 11).Value = .Range("F20").Value
objCell.Offset(0, 12).Value = .Range("K29").Value
objCell.Offset(0, 13).Value = .Range("H32").Value
Case "Bauteilseite"
objCell.Offset(0, 14).Value = .Range("F12").Value
objCell.Offset(0, 15).Value = .Range("F14").Value
objCell.Offset(0, 16).Value = .Range("F16").Value
objCell.Offset(0, 17).Value = .Range("E18").Value
objCell.Offset(0, 18).Value = .Range("F23").Value
objCell.Offset(0, 19).Value = .Range("K22").Value
objCell.Offset(0, 20).Value = .Range("K23").Value
objCell.Offset(0, 21).Value = .Range("K24").Value
objCell.Offset(0, 22).Value = .Range("H27").Value
objCell.Offset(0, 23).Value = .Range("F22").Value
objCell.Offset(0, 24).Value = .Range("F20").Value
objCell.Offset(0, 25).Value = .Range("K29").Value
objCell.Offset(0, 26).Value = .Range("H32").Value
End Select
End With
Next
Call objWorkbook.Close(SaveChanges:=False)
Set objWorkbook = Nothing
End If
End If
Next
Application.StatusBar = False
Call MsgBox("Fertig", vbInformation, "Information")
End Sub
Die Zeile, welche bearbeitet wird, wird in der Statusleiste angezeigt.
Gruß
Nepumuk
Anzeige
AW: Daten aus mehreren XLS auslesen
14.09.2022 19:37:02
stef26
Hallo Nepumuk,
danke für die schnelle Hilfe.
Also ich hab das mal getestet. (erstmal mit 30 Dateien mal zur Sicherheit)
Er schreibt nach 2 sekunden fertig. Hat aber nichts bearbeitet.
Wenn ich in den Schrittmodus gehe dann macht er bei dieser Abfrage
If Application.CountA(objCell.EntireColumn) = 1 Then
auf end if.
Weiß jedoch nicht was das für eine Abfrage ist...?
Gruß
Stefan
AW: Daten aus mehreren XLS auslesen
14.09.2022 19:51:43
Nepumuk
Hallo Stefan,
damit prüfe ich ob in der Zeile nur der Dateiname steht. Damit du beim Neustart nicht alle schon erledigten Dateien neu einlesen musst.
Ich habe es jetzt geändert, es wird nur der Bereich geprüft (Spalte A - AA) in welche die Daten eingetragen werden, ob das schon was drinsteht.

Option Explicit
Public Sub ReadData()
Dim objCell As Range
Dim objWorkbook As Workbook
Dim objWorksheet As Worksheet
Application.EnableEvents = False
For Each objCell In Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))
Application.StatusBar = "   " & CStr(objCell.Row)
DoEvents
If Application.CountA(objCell.Resize(1, 27)) = 1 Then
If Dir$(PathName:=objCell.Text)  vbNullString Then
Set objWorkbook = GetObject(PathName:=objCell.Text)
For Each objWorksheet In objWorkbook.Worksheets
With objWorksheet
Select Case .Name
Case "Lötseite"
objCell.Offset(0, 1).Value = .Range("F12").Value
objCell.Offset(0, 2).Value = .Range("F14").Value
objCell.Offset(0, 3).Value = .Range("F16").Value
objCell.Offset(0, 4).Value = .Range("E18").Value
objCell.Offset(0, 5).Value = .Range("F23").Value
objCell.Offset(0, 6).Value = .Range("K22").Value
objCell.Offset(0, 7).Value = .Range("K23").Value
objCell.Offset(0, 8).Value = .Range("K24").Value
objCell.Offset(0, 9).Value = .Range("H27").Value
objCell.Offset(0, 10).Value = .Range("F22").Value
objCell.Offset(0, 11).Value = .Range("F20").Value
objCell.Offset(0, 12).Value = .Range("K29").Value
objCell.Offset(0, 13).Value = .Range("H32").Value
Case "Bauteilseite"
objCell.Offset(0, 14).Value = .Range("F12").Value
objCell.Offset(0, 15).Value = .Range("F14").Value
objCell.Offset(0, 16).Value = .Range("F16").Value
objCell.Offset(0, 17).Value = .Range("E18").Value
objCell.Offset(0, 18).Value = .Range("F23").Value
objCell.Offset(0, 19).Value = .Range("K22").Value
objCell.Offset(0, 20).Value = .Range("K23").Value
objCell.Offset(0, 21).Value = .Range("K24").Value
objCell.Offset(0, 22).Value = .Range("H27").Value
objCell.Offset(0, 23).Value = .Range("F22").Value
objCell.Offset(0, 24).Value = .Range("F20").Value
objCell.Offset(0, 25).Value = .Range("K29").Value
objCell.Offset(0, 26).Value = .Range("H32").Value
End Select
End With
Next
Call objWorkbook.Close(SaveChanges:=False)
Set objWorkbook = Nothing
End If
End If
Next
With Application
.StatusBar = False
.EnableEvents = True
End With
Call MsgBox("Fertig", vbInformation, "Information")
End Sub
Gruß
Nepumuk
Anzeige
AW: Daten aus mehreren XLS auslesen
14.09.2022 20:13:55
stef26
Hallo Nepumuk,
jetzt läuft es. Danke schonmal !!
Es dauert allerdings extrem lange, bis die Datei immer geöffnet wird. Hat für 5 Dateien 7min benötigt.
Habs mal grob berechnet. Das Makro würde knappe 15 Tage a 24h laufen, bis es die 15000 Dateien durch hat.
Kann man das irgendwie abändern, so dass er ggf. die Datei gar nicht öffnen muss?
Vielleicht geht es dann schneller?
Gruß
Stefan
Alternativ über Formel
14.09.2022 21:17:23
Yal
Moin,
Excel kann mit Formel auf Information in einer Exceldatei zugreifen ohne diese Datei zu öffnen.
Ich schlage vor, den VBA zu verwenden, um diese Formel reinzuschreiben, aktualisieren und Formel durch Wert ersetzen.
(Basierend auf der Vorarbeit von Nepumuk, ohne die ich mich nicht an das Thema rangemacht hätte. Die kompaktere Form ist natürlich weniger Anfänger-tauglich.)

Public Sub ReadData()
Dim Z As Range
Dim Pfad As String
Dim DName As String
Dim i As Long
Dim Quell
Application.EnableEvents = False
Quell = Split(";F12;F14;F16;E18;F23;K22;K23;K24;H27;F22;F20;K29;H32", ";")
For Each Z In Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))
Application.StatusBar = "   " & CStr(Z.Row)
DoEvents
If Application.CountA(Z.Resize(1, 27)) = 1 Then
If Dir$(PathName:=Z.Text)  vbNullString Then
Pfad = Mid(Z.Text, 1, InStrRev(Z.Text, "\"))
DName = Mid(Z.Text, InStrRev(Z.Text, "\") + 1)
Set wB = GetObject(PathName:=Z.Text)
For i = 1 To 13
Z.Offset(0, i).Formula = "='" & Pfad & "[" & DName & "]Lötseite'!" & Quell(i)
Z.Offset(0, i + 13).Formula = "='" & Pfad & "[" & DName & "]Bauteilseite'!" & Quell(i)
Next
Z.EntireRow.Calculate
Z.Range("B1:AA1") = Z.Range("B1:AA1").Value 'Formel durch Wert ersetzen
Z.Range("B1:AA1").SpecialCells(xlCellTypeConstants, 16).ClearContents 'Zelle mit Fehler leeren
End If
End If
Next
Application.StatusBar = False
Application.EnableEvents = True
Call MsgBox("Fertig", vbInformation, "Information")
End Sub
Ungetestet, da ich solche Dateien und Verzeichnisse nicht zur Hand habe.
VG
Yal
Anzeige
AW: Alternativ über Formel
14.09.2022 21:31:02
stef26
Hallo Yal,
hört sich gut an. Habs auch gleich mal getestet. Erste Zeile lief sehr schnell und fehlerfrei.
Bei der zweiten Zeile ist er dort stehen geblieben:
Z.Range("B1:AA1").SpecialCells(xlCellTypeConstants, 16).ClearContents 'Zelle mit Fehler leeren ?
Gruß
Stefan
IMHO über VBA keine Chance...
14.09.2022 21:26:00
Case
Hallo Stefan, :-)
das wirst du über VBA nicht befriedigend hinbekommen. ;-)
Über Formeln auf geschlossene Dateien wird bei 15000 schnarchlangsam.
Hier bietet sich Power Query (Daten - Daten abrufen und transformieren - Daten abrufen - Aus Datei - Aus Ordner) an.
Erster Anfang - Einstieg PQ...
Oder du kannst programmieren. Dann musst du aber Geld in die Hand nehmen. Stichwort - Native Excel. Das brummt RICHTIG schnell. Excel muss nichtmal installiert sein. Kann Excel Dateien lesen UND schreiben, ohne dass Excel auf der Kiste ist (und noch VIELES mehr).
Startseite - Native Excel...
Voraussetzungen - Läuft in Excel 2019. Requirements...
Einstieg - Get Started...
Ist aber meine ganz subjektive Meinung - vielleicht zaubert Nepumuk noch was aus dem Ärmel. ;-)
Ich lass mal offen. :-)
Servus
Case
Anzeige
AW: IMHO über VBA keine Chance...
14.09.2022 21:38:49
Yal
Hallo Case,
Power Query wäre möglich. Diese Zugriff auf festen Zellen wäre nicht ganz üblich, aber machbar.
"Über Formeln auf geschlossene Dateien wird bei 15000 schnarchlangsam.": zurzeit ist die Messlate 14 Tage und 14 Stunden. Das lässt viel Platz für etwas besseres. Ich glaube, da der Code vorhanden ist, dann kann man es auf 100 Dateien testen und hochrechnen.
xlsgen? Why not. Nur: der Fragende stuft sich als "VBA nur mit Recorder". Es müsste also ein Auftragsprogrammierung sein. Oder ein Rechner 15 Tage laufen lassen.
VG
Yal
AW: IMHO über VBA keine Chance...
14.09.2022 21:42:40
stef26
Hallo Yal,
deine Variante denke ich ist von der Performance her ausreichend. Werde die Daten auf 3 Tage splitten.
Kannst du mir noch sagen, was das sein könnte, da der Code bei 2ten Durchlauf an der Stelle gestoppt hat:
Z.Range("B1:AA1").SpecialCells(xlCellTypeConstants, 16).ClearContents 'Zelle mit Fehler leeren
Liebe Grüße
Stefan
Anzeige
AW: IMHO über VBA keine Chance...
14.09.2022 21:44:38
stef26
Ach sorry, Excel schreibt Laufzeitfehler 1004, keine Zellen gefunden
AW: IMHO über VBA keine Chance...
14.09.2022 21:52:51
Daniel
Die ganzen SpecialCells verursachen einen Fehler, wenn nicht mindestens ein passende Zelle vorhanden ist.
Du müsstest also entweder:
- vorher abfragen, ob ein Fehler vorhanden ist
- eine Zelle im Zellbereich mit einem Fehler füllen, so das auf jeden Fall ein Fehler vorhanden ist.
- die Zeile in ein "On Error resume next / ... / On Error Goto 0" einbetten.
Letzteres ist hier das praktikabelste.
Gruß Daniel
Danke an ALLE
14.09.2022 22:25:53
stef26
Dankeschön an Alle Beteiligten.
Ich werde vermutlich die Daten über eine Woche mit dem Makro bearbeiten lassen müssen um diese große Menge an Excel Files auslesen zu können.
Danke für euren Support
Liebe Grüße
Stefan
Anzeige
AW: Danke an ALLE
14.09.2022 22:30:19
Daniel
Vielleicht gehts ja schneller, wenn du dir die Dateien erstmal auf deine Festplatte kopiert und dort bearbeitet.
Gruß Daniel
AW: Danke an ALLE
14.09.2022 22:34:41
Stef26
Hallo Daniel,
war auch meine Überlegung.
Hab das jetzt Mal angestoßen
Die Dateien sind zwar nicht groß aber auch das Kopieren dauert eine gefühlte Ewigkeit...
Ich denke auch dass es dann schneller gehen sollte...
Gute Nacht
Stefan
Habe es in VBA sehr viel...
15.09.2022 00:32:29
Case
Hallo Yal, :-)
... probiert. Auch viel mit "geschlossenen Dateien", sprich - Formeln und dann in Werte umwandeln - "gespielt". Bei meinen Tests konnte ich nicht von 200 Dateien auf die Gesamtzahl (bei mir nur 10000 Dateien) hochrechnen. Das wurde mit der Zeit immer langsamer. Wie gesagt - bei meinen Tests.
Native Excel wollte ich nur der Vollständigkeit halber nennen. Denn der Geschwindigkeitsvorteil ist wirklich signifikant. Damit habe ich Jahre gearbeitet. Nun stelle ich auf PQ um - langsamer, aber bequemer - und für meinen Nachfolger einfacher. ;-)
Bei VBA musst du sehr auf Fehler achten. Abfangen, weiter machen... - sonst fliegt dir das Programm schnell um die Ohren. Ich arbeite damit heute auch noch, aber nicht bei mehr als 1000 Dateien. Und wenn ich es häufiger benötige, dann garnicht mehr.
Und es hat sich ja auch geklärt - Stefan braucht es nur einmal. Da ist es nicht entscheidend und Native Excel überflüssig. ;-)
Servus
Case
Anzeige
AW: Habe es in VBA sehr viel...
15.09.2022 08:19:03
Yal
Hallo Case,
ja, so ungefähr die gleiche Erfahrungen. Na ja, auf mehr als 1000 Excel-Dateien eher nicht, weil ich inzwischen solche Situation nicht mehr entstehen lasse. Daher bin ich bei der Verlangsamung der Formelweg blank.
Ich tendiere auch, seit ich PQ entdeckt habe (auch durch den Forum), alles was mit PQ gehen kann, mit PQ zu machen.
Da es einmalig ist (so denkt man mal zuerst...), in den Fall trotzdem VBA, weil der Zugriff auf einzelne Zelle über PQ nicht ganz sexy ist.
VG
Yal
AW: IMHO über VBA keine Chance...
14.09.2022 21:39:01
stef26
Hallo Case,
danke für deine Rückmeldung.
Der Nepumuk hat ja super das ganze schon vorbereitet. Der Yal hat mit der Idee eine Link auf die Zelle in der Datei und diese dann als Wert kopieren ggf. auch noch ne Lösung die etwas schneller ist gefunden.
Da ich das nur ein einziges mal benötige, ist mir eine längere Laufzeit ok, solange der Rechner nicht gleich über 2 Wochen laufen muss.
Würde die Yal Lösung (wenn der Fehler noch geklärt ist) nehmen und die Daten in 3 Pakete über 3 Nächte laufen lassen.
So schnell wie das erste rüber gekommen ist denke ich dass es von der Performance her ausreichend ist.
Von native Excel hab ich noch gar nichts gehört. Programmieren kann ich leider auch nicht. Hört sich aber wirklich interessant an.
Liebe Grüße
Stefan
Anzeige
Wenn du es nur...
15.09.2022 00:13:18
Case
Hallo Stefan, :-)
... einmal brauchst, spielt die Geschwindigkeit natürlich nicht die Rolle. Native Excel kommt nur zum tragen, wenn du soetwas oft machnen musst, dann ist es allerdings von der Geschwindigkeit unschlagbar. ;-)
15000 Dateien ist aber auch ein Packen - viel Glück.
Servus
Case
AW: Wenn du es nur...
15.09.2022 07:49:18
stef26
Guten Morgen Case,
danke für deinen Beitrag.
Servus
Stefan
AW: Daten aus mehreren XLS auslesen
14.09.2022 22:58:30
Daniel
Hi
Du könntest da auch mal folgendes probieren:
- in Spalte A steht der Pfad
- in Spalte B steht der Dateiname
- in Zeile 1 stehen ab Spalte C die zelladresse, die du auslesen willst.
- Zelle C2 kommt diese Formel, welche die eigentliche ausleseformel zunächst als Text erzeugt:

="='"&$A2&"["&$B2&"]Lötseite'!"&C$1
Die Zelle C2 kopierst du dann nach unten und nach rechts, soweit wie benötigt.
Den ganzen Block kopierst du dann und fügst ihn als Text ein.
Jetzt hast du alle Formeln mit externen Bezug, die aber noch Text sind und nicht berechnet werden.
Um sie in Formeln umzuwandeln und die Werte zu bekommen, kannst du in diesem Zellbereich einmal das ERSETZTEN ausführen und "=" durch "=" zu ersetzten (es klingt widersinnig, etwas durch das gleiche zu ersetzten, aber es veranlasst Excel, den Text in Formeln zu wandeln)
Zum Schluss solltest du den Bereich dann nochmal kopieren und als Wert einfügen, um die Externen Zellbezüge zu eliminieren.
Funktioniert im Prinzip auch ohne Makro, nur würde ich das nicht mit allen 15.000 Zeilen gleichzeitig machen.
Hier könntest du dir ein Makro schreiben, dass die Aktionen
- "=" durch "=" ersetzen und in. Werte wandeln
Immer für einen bestimmten Zellbereich durchführt (die optimale Größe musst du ausprobieren) und dann zur Sicherheit zwischenspeichert, also vielleicht so:

For z =  2 to 15000 step 10
With Cells(z, 3).resize(10, 26)
.Replache "=", "=", xlpart
.Formula = .Value
Ende with
Thisworkbook.Save
Next
Problematisch könnte höchsten sein, wenn Blätter nicht vorhanden sind, denn Externe Zellbezüge, die nicht funktionieren, kann Excel nicht sauber verarbeiten, aber auch nicht ignorieren, FAS könnte ein Problem hierbei werden.
Gruß Daniel
Anzeige
AW: Daten aus mehreren XLS auslesen
15.09.2022 07:53:45
stef26
Hallo Daniel,
danke für die Info. Ich hatte das schon mal bei etwas weniger Datein so gemacht. Hatte aber wie du es auch beschrieben hast dann immer die Probleme, wenn die Datei oder das Tabellenblatt nicht mehr vorhanden war gehabt.
Liebe Grüße und danke für deinen Beitrag
:-)
Stefan
"Replache"?
15.09.2022 08:27:44
Yal
Ist es eine VBA-Version in hessige Dialekt? :-))
Da hat jemand den Code direkt im Forum Fenster getippt ;-)
Kenne ich nur zu gut (Autokorrektur lässt grüßen). Ende Witz.
VG
Yal
AW: "Replache"?
15.09.2022 09:20:06
Daniel
Natürlich direkt hier.
Wo sonst?
Codes testen ist für Anfänger ;-)

322 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige