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

Dateien aus Verzeichnissen automatisiert einlesen

Dateien aus Verzeichnissen automatisiert einlesen
11.08.2003 19:11:08
Schmiwi
Hallo habe ein Problem beim automatisierten Einlesen von Dateien aus Unterverzeichnissen.
Ich habe einen Ordner mit 65 Unterordnern. In denen befinden sich jeweils 6 Dateien als Ergebnis eines Simulationsprogramms im .asc Format.
Diese möchte ich jetzt so in eine Excel-Arbeitsmappe einlesen, dass Excel 65 Arbeitsblätter erstellt diese entsprechend test0001 bis test0065 benennt und aus den gleichnamigen Unterverzeichnissen die Daten in das jeweilige Arbeitsblatt einliest.
Habe schon ein Makro aufgenommen (über externe Daten, Trennzeichen Komma...), mit dem es auf Knopfdruck klappt, aber halt nur für eine Datei.
Das Makro sieht wie folgt aus (für eine Datei):

Sub Auswertung()
' Auswertung Makro
' Tastenkombination: Strg+j
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;ergebnisdataI.asc" _
, Destination:=Range("A1"))
.Name = "ergebnisdataI"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlWindows
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.Refresh BackgroundQuery:=False
End With
End Sub

Wie kann ich jetzt eine Schleife o.ä. darum herum bauen, dass Excel für mich arbeitet und ich nicht für Excel.
Bin für jede Hilfe dankbar
Gruß,
Christian

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dateien aus Verzeichnissen automatisiert einlesen
11.08.2003 20:10:28
Ramses
Hallo
das ganze ist zwar ungetestet, weil ich keine ASC-Dateien habe,... sollte aber tun.

ub Import_ASC_Files()
Dim i As Long, TotFiles As Long
Dim gefFile As String, dname As String
Dim Suchpfad As String, suchbegriff As String, DateiForm As String
Dim oldStatus As Variant
Suchpfad = InputBox("Geben Sie den Ordner an, der durchsucht werden soll.", "Pfad definieren", Application.DefaultFilePath)
If Suchpfad = "" Then Exit Sub
DateiForm = InputBox("Geben Sie den Dateityp an der gesucht werden soll", "Dateierweiterung", "*.asc")
If DateiForm = "" Then Exit Sub
Application.ScreenUpdating = True
oldStatus = Application.StatusBar
'Alle Tabellen löschen bis auf eine
Application.DisplayAlerts = False
For i = Worksheets.Count To 2 Step -1
    Worksheets(i).Delete
Next
Application.DisplayAlerts = True
With Application.FileSearch
    .LookIn = Suchpfad
    .SearchSubFolders = True
    .Filename = DateiForm
    If .Execute() > 0 Then
        TotFiles = .FoundFiles.Count
        Application.StatusBar = "Total " & TotFiles & " gefunden"
        For i = 1 To .FoundFiles.Count
            gefFile = .FoundFiles(i)
            If i = 1 Then
                ActiveSheet.Name = "Test0" & i
            End If
            '-------------------
            'Dein Block
                With ActiveSheet.QueryTables.Add(Connection:= _
                    "TEXT;ergebnisdataI.asc" _
                    , Destination:=Range("A1"))
                    .Name = "ergebnisdataI"
                    .FieldNames = True
                    .RowNumbers = False
                    .FillAdjacentFormulas = False
                    .PreserveFormatting = True
                    .RefreshOnFileOpen = False
                    .RefreshStyle = xlInsertDeleteCells
                    .SavePassword = False
                    .SaveData = True
                    .AdjustColumnWidth = True
                    .RefreshPeriod = 0
                    .TextFilePromptOnRefresh = False
                    .TextFilePlatform = xlWindows
                    .TextFileStartRow = 1
                    .TextFileParseType = xlDelimited
                    .TextFileTextQualifier = xlTextQualifierDoubleQuote
                    .TextFileConsecutiveDelimiter = False
                    .TextFileTabDelimiter = False
                    .TextFileSemicolonDelimiter = False
                    .TextFileCommaDelimiter = True
                    .TextFileSpaceDelimiter = False
                    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
                    .Refresh BackgroundQuery:=False
                End With
            '---------
            'Ende deines Blockes
            Worksheets.Add
            If i < 10 Then
                ActiveSheet.Name = "Test0" & i
            Else
                ActiveSheet.Name = "Test" & i
            End If
        Next i
    End If
End With
Application.StatusBar = oldStatus
Application.ScreenUpdating = True
End Sub 
     Code eingefügt mit Syntaxhighlighter 1.16


Gruss Rainer

Anzeige
AW: Dateien aus Verzeichnissen automatisiert einlesen
11.08.2003 21:51:46
Schmiwi
Hallo Rainer,
danke für Deine schnelle Antwort. Es hat mein Problem leider noch nicht ganz gelöst.
Das Problem ist, dass ich in jedem der 65 Unterverzeichnisse 6 Dateien mit den Namen:
ergebnisdataI.asc
ergebnisdataQ.asc
ergebnisdataY.asc
ergebnisdataY1.asc
ergebnisdataY2.asc
ergebnisdataZ.asc
Diese Dateien enthalten durch komma getrennte Werte (Matrizen z.b. 3x15).
Diese 6 Dateien z.B. des Unterverzeichnisses test0001 will ich nun alle in ein Excel-Arbeitsblatt, idealerweise mit dem Namen test0001 einlesen. Alsoso, dass z´.B. die Werte aus ergebnisdataI.asc in Zelle A1 beginnen, die von ergebnisdataQ.asc in Zelle A5 etc. Und das für alle 65 Unterverzeichnisse in das entsprechene Tabellenblatt.
Bei dem Code, generiert Excel zuviele Tabellenblätter, füllt sie aber nicht aus
Gruß, Christian

Anzeige
AW: Dateien aus Verzeichnissen automatisiert einlesen
11.08.2003 22:19:22
Ramses
Hallo,
Kleiner Lapsus, es war immer ein Verweis auf die Datei "ergebnisdataI.asc" gesetzt.
Aber mit dem anderen habe ich ein Problem. Alle Dateien in eine Tabelle entsprechend dem Unterordner !??
Alle ASC Dateien enthalten die Daten mit Semikolon getrennt ?
Ist da jeweils eine Überschrift ?
Müssen die Daten fortlaufend sein oder macht es nichts wenn zwischendurch erneute Überschriften sind.
Kommt sonst noch was dazu,... das ist zeitaufwändig !!
Ich will anschliessend nicht nochmal neu anfangen.
Gruss Rainer

Hier der entsprechende Code überarbeitet...
12.08.2003 00:44:13
Ramses
Hallo,
nachdem ich schon angefangen habe, hier das ganze Stück nochmal.
Alle Daten werden eingelesen und in jeweils ein Sheet gespeichert.
Viel Spass beim einarbeiten :-).
Für mich ist jetzt Feierabend.

Option Explicit
Sub Import_ASC_Files()
'(C) Ramses
'liest all DAten von ASC Files in beliebig vielen Subfolders ein
'und schreibt alle Daten eines Subfolders in ein EXCEL-Sheet
'Für jeden Subfolder wird ein neues Sheet erstellt
'-------------
Dim i As Long, n As Integer, m As Integer, intTotFiles As Long, fSlash As Integer
Dim txtlines As Long, totFiles As Long, textArr() As Variant
Dim gefFile As String, dname As String
Dim Suchpfad As String, suchbegriff As String, DateiForm As String
Dim tmpFoName As String, tmpFoNameFirst As String, Text1 As String
Dim si As Integer, myDiv As Boolean
Dim oldStatus As Variant
Suchpfad = InputBox("Geben Sie den Ordner an, der durchsucht werden soll.", "Pfad definieren", "C:\")
If Suchpfad = "" Then Exit Sub
DateiForm = InputBox("Geben Sie den Dateityp an der gesucht werden soll", "Dateierweiterung", "*.asc")
If DateiForm = "" Then Exit Sub
Application.ScreenUpdating = True
oldStatus = Application.StatusBar
myDiv = False
'Alle Tabellen löschen bis auf eine
Application.DisplayAlerts = False
For i = Worksheets.Count To 2 Step -1
    Worksheets(i).Delete
Next
Application.DisplayAlerts = True
Close #1
With Application.FileSearch
    .LookIn = Suchpfad
    'Unterordner durchsuchen = ".SearchSubFolders = True" !!!
    .SearchSubFolders = False
    .Filename = DateiForm
    If .Execute() > 0 Then
        totFiles = .FoundFiles.Count
        Application.StatusBar = "Total " & totFiles & " gefunden"
        For i = 1 To .FoundFiles.Count
            gefFile = .FoundFiles(i)
                If i = 1 Then
                    'FolderName aufnehmen
                    tmpFoName = gefFile
                    For n = 1 To Len(tmpFoName) - 5
                        If Mid(tmpFoName, n, 1) = "\" Then
                            fSlash = n
                        End If
                    Next n
                    tmpFoNameFirst = Left(tmpFoName, fSlash)
                    ActiveSheet.Name = "Test0" & i
                Else
                    tmpFoName = gefFile
                    For n = 1 To Len(tmpFoName) - 5
                        If Mid(tmpFoName, n, 1) = "\" Then
                            fSlash = n
                        End If
                    Next n
                    tmpFoName = Left(tmpFoName, fSlash)
                End If
                If i = 1 Then
                    Debug.Print "Start 1. Sequenz"
                    Debug.Print gefFile
                    Open gefFile For Input As #1
                    'Die anzahl ist nötig um die Grösse des Arrays zu deklarieren
                    'Zähler auf 0 setzen
                    txtlines = 0
                    Do While Not EOF(1)    ' Schleife bis Dateiende.
                        Input #1, Text1    ' Hilfsvariable zum einlesen verwenden
                        'Zähler hochzählen
                        txtlines = txtlines + 1
                    Loop
                    'Schliessen der Datei weil Dateiende erreicht wurde
                    Close #1
                    'Erneutes Öffnen um zum Dateianfang zu kommen
                    Open gefFile For Input As #1    ' Datei zum Einlesen öffnen.
                    'Array neu auf die Anzahl der Linien initialisieren
                    ReDim textArr(txtlines)
                    'Einlesen der Dateien in das Array
                    For n = 1 To txtlines
                        Line Input #1, textArr(n)
                    Next n
                    'Schreiben in Tabelle
                    For m = 1 To UBound(textArr())
                        Debug.Print ActiveSheet.Cells(65536, 1).End(xlUp).Row
                        ActiveSheet.Cells(ActiveSheet.Cells(65536, 1).End(xlUp).Row + 1, 1) = textArr(m)
                    Next m
                    ReDim textArr(0)
                    Debug.Print "1 Ende"
                Else
                    If tmpFoName = tmpFoNameFirst Then
                        Debug.Print "Start nächste Datei Sequenz"
                        Debug.Print gefFile
                        Close #1
                        '-------------------
                        'Datei öffnen zum einlesen in ein Array
                        Open gefFile For Input As #1
                        'Die anzahl ist nötig um die nächste Grösse des Arrays zu deklarieren
                        'Zähler auf 0 setzen
                        txtlines = 0
                        Do While Not EOF(1)    ' Schleife bis Dateiende.
                            Input #1, Text1    ' Hilfsvariable zum einlesen verwenden
                            'Zähler hochzählen
                            txtlines = txtlines + 1
                        Loop
                        'Schliessen der Datei weil Dateiende erreicht wurde
                        Close #1
                        'Erneutes Öffnen um zum Dateianfang zu kommen
                        Open gefFile For Input As #1    ' Datei zum Einlesen öffnen.
                        'Array Anzahl definieren
                        'Array neu auf die Anzahl der Linien initialisieren
                        ReDim textArr(txtlines)
                        'Einlesen der Dateien in das Array
                        For n = 1 To txtlines
                            Line Input #1, textArr(n)
                        Next n
                        Close #1
                        'Schreiben in Tabelle
                        For m = 1 To UBound(textArr())
                            ActiveSheet.Cells(ActiveSheet.Cells(65536, 1).End(xlUp).Row + 1, 1) = textArr(m)
                        Next m
                        ReDim textArr(0)
                    Else
                        Debug.Print "Start Sequenz Neuer Ordner"
                        Debug.Print gefFile
                        '-------------------
                        'Es wurde ein File aus einem anderen Ordner geöffnet
                        'Neue Tabelle anlegen und Folder neu bestimmen
                        tmpFoNameFirst = tmpFoName
                        'Trennt die bisherigen Daten in Spalten auf
                        Columns("A:A").Select
                        Selection.TextToColumns Destination:=Range("A1"), Semicolon:=True
                        Worksheets.Add
                        If i < 10 Then
                            ActiveSheet.Name = "Test0" & i
                        Else
                            ActiveSheet.Name = "Test" & i
                        End If
                    End If
                End If
        Next i
    End If
End With
ReDim textArr(0)
'für den letzten Ordner
'Trennt die Daten in Spalten auf
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), Semicolon:=True
Application.StatusBar = oldStatus
Application.ScreenUpdating = True
End Sub 
     Code eingefügt mit Syntaxhighlighter 1.16


Gruss Rainer

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige