Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA: mehrere Dateien nacheinander einlesen

VBA: mehrere Dateien nacheinander einlesen
06.12.2012 11:06:13
H.Benitz
Hallo,
da meine VBA-Kenntnisse zur Zeit noch recht bescheiden sind, habe ich mir das Script für mein Vorhaben aus verschiedenen Beiträgen zusammengebastelt.
Funktioniert soweit schon ganz gut, aber ein Problem gibt es noch!
Das Ziel ist:
Es sollen aus einem vom Anwender vorgegebenen Ordner alle (ASCII-)Files mit gleichem Teilnamen und gleichen Typs geöffnet und bestimmte Stellen darin gesucht und in ein Excel-Sheet übertragen werden.
Das funktioniert, wie gesagt, schon Alles.
Warum aber bricht Excel die Verarbeitung nach dem 6. File mit Fehlermeldung "Laufzeitfehler 53 - Datei nicht gefunden!" ab?
Es sind im gewählten Ordner mehr Files mit den eingestellten Kriterien vorhanden.
Ich bin für jede Hilfe dankbar.
Sub Fertigmelden(JOBNUM)
Dim strFile As String
Dim JOBNUMMER As String
Dim DATUM As String
Dim ZEIT As String
Dim PROGRAMMIERER As String
Dim TEILENAME As String
Dim AUFTRAGSNUMMER As String
Dim POS As String
Dim BEMERKUNG As String
Dim rcount As Long
Dim fso As Object, TextDat As Object
strPath = "W:\u\SFA\JOBDATA\" & JOBNUM & "\PLAT_?"
strExt = "*.DAT"
If strPath = "" Then
Exit Sub
Else
rcount = 4
strFile = Dir(strPath & strExt)
Do While Len(strFile) > 0
Set fso = CreateObject("Scripting.FileSystemObject")
Set TextDat = fso.OpenTextFile(strFile, 1, False)
Do While TextDat.AtEndOfStream  True
Text = TextDat.ReadLine
If Mid(Text, 2, 11) = "JOB_DATA_1 " Then
JOBNUMMER = Mid(Text, 25, 5)
Cells(2, 1) = JOBNUMMER
End If
If Mid(Text, 2, 4) = "DATE" Then
DATUM = Mid(Text, 25, 10)
Cells(2, 2) = DATUM
End If
If Mid(Text, 2, 4) = "TIME" Then
ZEIT = Mid(Text, 25, 5)
Cells(2, 3) = ZEIT
End If
If Mid(Text, 2, 4) = "USER" Then
PROGRAMMIERER = Mid(Text, 25, 30)
Cells(2, 4) = PROGRAMMIERER
End If
If Mid(Text, 2, 15) = "PLATE_PART_NAME" Then
TEILENAME = Mid(Text, 25, 45)
Cells(rcount, 1) = TEILENAME
End If
If Mid(Text, 2, 16) = "PLATE_PART_ORDER" Then
AUFTRAGSNUMMER = Mid(Text, 25, 5)
Cells(rcount, 2) = AUFTRAGSNUMMER
End If
If Mid(Text, 2, 19) = "PLATE_PART_POSITION" Then
POS = Mid(Text, 25, 5)
Cells(rcount, 3) = POS
End If
If Mid(Text, 2, 18) = "PLATE_PART_REMARK " Then
BEMERKUNG = Mid(Text, 25, 40)
Cells(rcount, 4) = BEMERKUNG
rcount = rcount + 1
End If
Loop
MsgBox (strFile)
'            Workbooks(strFile).Close
TextDat.Close
strFile = Dir() ' nächste Datei
Loop
End If
End Sub

Beste Grüße
Heiko

Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: mehrere Dateien nacheinander einlesen
06.12.2012 13:05:58
Rudi
Hallo,
lösch mal Workbooks(strFile).Close
Außerdem würde ich
Set fso = CreateObject("Scripting.FileSystemObject")
über Do While ... setzen.
Gruß
Rudi

AW: VBA: mehrere Dateien nacheinander einlesen
06.12.2012 14:42:14
H.Benitz
Hallo Rudi,
trotz Löschen (der eh schon auskommentierten Zeile) und Umstellung der "set fso..." kein Erfolg!
Nach Rechnerneustart wird jetzt nicht mal mehr die erste Datei eingelesen.
Gruß
Heiko
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA zum nacheinander Einlesen mehrerer Dateien optimieren


Schritt-für-Schritt-Anleitung

Um mehrere Dateien nacheinander in Excel mit VBA einzulesen, kannst du folgendes Vorgehen nutzen:

  1. Öffne das VBA-Editor-Fenster in Excel (ALT + F11).

  2. Erstelle ein neues Modul (Rechtsklick auf "VBAProject" > Einfügen > Modul).

  3. Kopiere den folgenden Code in das Modul:

    Sub Fertigmelden(JOBNUM)
       Dim strFile As String
       Dim JOBNUMMER As String
       Dim DATUM As String
       Dim ZEIT As String
       Dim PROGRAMMIERER As String
       Dim TEILENAME As String
       Dim AUFTRAGSNUMMER As String
       Dim POS As String
       Dim BEMERKUNG As String
       Dim rcount As Long
       Dim fso As Object, TextDat As Object
    
       strPath = "W:\u\SFA\JOBDATA\" & JOBNUM & "\PLAT_?"
       strExt = "*.DAT"
    
       If strPath = "" Then Exit Sub
    
       rcount = 4
       strFile = Dir(strPath & strExt)
    
       Set fso = CreateObject("Scripting.FileSystemObject")
    
       Do While Len(strFile) > 0
           Set TextDat = fso.OpenTextFile(strPath & strFile, 1, False)
           ' Lese die Datei Zeile für Zeile
           Do While Not TextDat.AtEndOfStream
               Text = TextDat.ReadLine
               If Mid(Text, 2, 11) = "JOB_DATA_1 " Then
                   JOBNUMMER = Mid(Text, 25, 5)
                   Cells(2, 1) = JOBNUMMER
               End If
               ' Füge weitere Bedingungen hier hinzu...
           Loop
           TextDat.Close
           strFile = Dir() ' nächste Datei
       Loop
    End Sub
  4. Führe das Makro aus, indem du Fertigmelden("DeinJobNummer") im Direktfenster ausführst.


Häufige Fehler und Lösungen

  • Laufzeitfehler 53 - Datei nicht gefunden: Dieser Fehler tritt häufig auf, wenn die Dateipfade oder Dateinamen nicht korrekt sind. Stelle sicher, dass der Pfad und die Dateierweiterung richtig angegeben sind.

  • Keine Dateien werden eingelesen: Wenn nach einem Neustart des Rechners keine Dateien mehr eingelesen werden, überprüfe bitte, ob der korrekte Pfad verwendet wird und ob die Dateien im Ordner vorhanden sind.

  • Falsche Variableninitialisierung: Achte darauf, dass alle Variablen vor der Verwendung korrekt initialisiert sind, sonst kann es zu unerwarteten Ergebnissen kommen.


Alternative Methoden

Eine alternative Methode, um mehrere Dateien zu verarbeiten, ist die Verwendung von Power Query. Du kannst über "Daten" > "Abrufen und transformieren" die entsprechende Option wählen, um Daten aus mehreren Dateien zu importieren. Dies kann oft einfacher sein, wenn du keine tiefen VBA-Kenntnisse hast.


Praktische Beispiele

Hier ist ein Beispiel, wie du die Zeilen in einer Datei überprüfen und bestimmte Werte in Excel übertragen kannst:

If Mid(Text, 2, 18) = "PLATE_PART_REMARK " Then
    BEMERKUNG = Mid(Text, 25, 40)
    Cells(rcount, 4) = BEMERKUNG
    rcount = rcount + 1
End If

Diese Bedingung liest die Bemerkungen aus der Datei und überträgt sie in die Excel-Tabelle.


Tipps für Profis

  • Fehlerbehandlung einbauen: Nutze On Error Resume Next, um dein Makro robuster zu machen und Laufzeitfehler abzufangen.

  • Debugging: Verwende Debug.Print um den Wert von Variablen während der Ausführung zu sehen. Dies kann helfen, Probleme schneller zu identifizieren.

  • Datenvalidierung: Stelle sicher, dass die eingelesenen Daten valide sind, bevor du sie in die Excel-Tabelle schreibst.


FAQ: Häufige Fragen

1. Wie kann ich die Anzahl der eingelesenen Dateien anzeigen?
Du kannst eine Zählvariable einführen, die jedes Mal erhöht wird, wenn eine Datei erfolgreich eingelesen wurde.

2. Was mache ich, wenn ich nur bestimmte Dateitypen einlesen möchte?
Du kannst die strExt-Variable anpassen, um die gewünschten Dateitypen wie ".TXT" oder ".CSV" zu spezifizieren.

3. Gibt es eine Möglichkeit, die Geschwindigkeit des Einlesens zu erhöhen?
Ja, du kannst die Bildschirmaktualisierung während des Einlesens deaktivieren, indem du Application.ScreenUpdating = False am Anfang deines Makros und Application.ScreenUpdating = True am Ende verwendest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige