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

im Verzeichnis aus allen Dateien Daten auslesen

im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 00:50:00
walter
Hallo und guten Morgen,
ich habe u.a. Makro in der Anwendung, welches Daten aus allen Blättern EINER Datei im Blatt "Datenzusammenfassung" niederschreibt.
Jetzt würde ich ides gerne soweit verändern, daß alle Dateien ikn einem Verzeichnis (alle mit gleichem Aufbau) so ausgelesen werden und das Ergebnis in einer Datei zusammengefaßt wird (Datensammlung).
Wer weiß Rat ?
Hier das Makro:

Sub Daten_sammeln()
Dim wks As Worksheet
Dim wksZ As Worksheet
Dim lastRow As Long
Set wksZ = Sheets("Datensammlung") 'Blatt in dem die Daten gesammelt werden.(Name anpassen)
lastRow = wksZ.Range("A65536").End(xlUp).Row + 1
For Each wks In ThisWorkbook.Worksheets
If wks.Name  wksZ.Name Then
wksZ.Cells(lastRow, 1) = wks.Range("b5")
wksZ.Cells(lastRow, 2) = wks.Range("b6")
wksZ.Cells(lastRow, 3) = wks.Range("b7")
wksZ.Cells(lastRow, 4) = wks.Range("b9")
wksZ.Cells(lastRow, 5) = wks.Name
lastRow = lastRow + 1
End If
Next
End Sub


mit Dank
Gruß
Walter

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 01:46:22
Josef
Hallo Walter,
das könnte so gehn.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub DataFromFiles()
    Dim objWB As Workbook, objWS As Worksheet, objWSRead As Worksheet
    Dim strPath As String
    Dim lngRow As Long, lngIndex As Long
    Dim a, lngResult As Long
    
    On Error GoTo ErrExit
    GMS
    
    'Verzeichnis wählen
    strPath = fncBrowseForFolder("E:\")
    
    If strPath <> "" Then
        Set objWS = ThisWorkbook.Sheets("Datensammlung") 'Blatt in dem die Daten gesammelt werden.(Name anpassen)
        lngRow = objWS.Cells(Rows.Count, 1).End(xlUp).Row + 1
        lngResult = FileSearchFSO(a, strPath, "*.xls*", True)
        If lngResult <> 0 Then
            For lngIndex = 0 To UBound(a)
                Set objWB = Workbooks.Open(a(lngIndex))
                For Each objWSRead In objWB.Worksheets
                    objWS.Cells(lngRow, 1) = objWSRead.Range("b5")
                    objWS.Cells(lngRow, 2) = objWSRead.Range("b6")
                    objWS.Cells(lngRow, 3) = objWSRead.Range("b7")
                    objWS.Cells(lngRow, 4) = objWSRead.Range("b9")
                    objWS.Cells(lngRow, 5) = objWSRead.Name
                    objWS.Cells(lngRow, 6) = objWB.Name
                    lngRow = lngRow + 1
                Next
                objWB.Close False
            Next
        End If
    End If
    
    ErrExit:
    If Err.Number <> 0 Then MsgBox "Fehler: " & Err.Number & vbLf & _
        Err.Description, Title:="Fehler"
    
    Set objWB = Nothing
    Set objWS = Nothing
    Set objWSRead = Nothing
    GMS True
End Sub

Sub GMS(Optional ByVal Modus As Boolean = False)
    Static lngCalc As Long
    
    With Application
        .ScreenUpdating = Modus
        .EnableEvents = Modus
        .DisplayAlerts = Modus
        .EnableCancelKey = IIf(Modus, 1, 0)
        If Not Modus Then lngCalc = .Calculation
        .Calculation = IIf(Modus, lngCalc, -4135)
        .Cursor = IIf(Modus, -4143, 2)
    End With
    
End Sub

'by J.Ehrensberger
Private Function FileSearchFSO(ByRef Files As Variant, ByVal InitialPath As String, Optional ByVal FileName As String = "*", _
        Optional ByVal SubFolders As Boolean = False) As Long

    
    Dim mobjFSO As Object, mfsoFolder As Object, mfsoSubFolder As Object, mfsoFile As Object
    
    Set mobjFSO = CreateObject("Scripting.FileSystemObject")
    
    Set mfsoFolder = mobjFSO.GetFolder(InitialPath)
    
    On Error Resume Next
    
    For Each mfsoFile In mfsoFolder.Files
        If Not mfsoFile Is Nothing Then
            If LCase(mobjFSO.GetFileName(mfsoFile)) Like LCase(FileName) Then
                If IsArray(Files) Then
                    Redim Preserve Files(UBound(Files) + 1)
                Else
                    Redim Files(0)
                End If
                Files(UBound(Files)) = mfsoFile
            End If
        End If
    Next
    
    If SubFolders Then
        For Each mfsoSubFolder In mfsoFolder.SubFolders
            FileSearchFSO Files, mfsoSubFolder, FileName, SubFolders
        Next
    End If
    
    If IsArray(Files) Then FileSearchFSO = UBound(Files) + 1
    On Error GoTo 0
    Set mobjFSO = Nothing
    Set mfsoFolder = Nothing
End Function

Private Function fncBrowseForFolder(Optional ByVal defaultPath = "") As String
    Dim objFlderItem As Object, objShell As Object, objFlder As Object
    
    Set objShell = CreateObject("Shell.Application")
    Set objFlder = objShell.BrowseForFolder(0&, "Ordner auswählen...", 0&, defaultPath)
    
    If objFlder Is Nothing Then GoTo ErrExit
    
    Set objFlderItem = objFlder.Self
    fncBrowseForFolder = objFlderItem.Path
    
    ErrExit:
    
    Set objShell = Nothing
    Set objFlder = Nothing
    Set objFlderItem = Nothing
End Function

Gruß Sepp

Anzeige
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 02:12:50
walter
Hallo Josef,
vielen Dank, ich hatte zu dieser frühen Stunde nicht mehr auf Antwort zu hoffen gewagt. Setze mich gleich dran.
Gruß
Walter
PS: warum Du verschiedene Makros aufgelistet hast, krieg ich auch noch raus :-)))))
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 02:42:14
walter
Hallo Josef,
ich habe mich zu entschuldigen, ich habe mich in der xls Version geirrt. Auf diesen Rechnern habe ich Version Excel2002 SP3. Sorry nochmals, ich hab jetzt nen fies schlechtes Gewissen.
Das Makro läuft somit gleich in der ersten Zeile auf'n Poller.
Kleinlaut: Kannst Du noch mal helfen.
mit Dank + Gruß
Walter
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 07:29:05
Josef
Hallo Walter,
hast du auch den kompletten Code in ein allgemeines modul kopiert?
Wie leutet die Fehlermeldung?
Gruß Sepp

Anzeige
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 12:28:00
walter
Hallo Josef,
ja, der komplette Code steht im allgemeinen Modul.
Die Fehlermeldung: Fehler beim kompilieren: Syntaxfehler
wobei dann die erste Zeile markiert ist:
    Dim objWB As Workbook, objWS As Worksheet, objWSRead As Worksheet
Danke nochmals
Gruß
Walter
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 12:30:00
Josef
Hallo Walter,
dann kopier mal den gesamten Code den du im Modu stehen hast hier rein, oder lade die Datei hoch.
Gruß Sepp

AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 12:56:12
walter
Hallo Josef,
hier der Code(Modul1 unter Allgemein).
Gruß
Walter
Option Explicit
Sub DataFromFiles()
    Dim objWB As Workbook, objWS As Worksheet, objWSRead As Worksheet
    Dim strPath As String
    Dim lngRow As Long, lngIndex As Long
    Dim a, lngResult As Long
    
    On Error GoTo ErrExit
    GMS
    
     'Verzeichnis wählen
    strPath = fncBrowseForFolder("c:\")
    
    If strPath "" Then
        Set objWS = ThisWorkbook.Sheets("Datensammlung") 'Blatt in dem die Daten gesammelt werden.(Name anpassen)
        lngRow = objWS.Cells(Rows.Count, 1).End(xlUp).Row + 1
        lngResult = FileSearchFSO(a, strPath, "*.xls*", True)
        If lngResult 0 Then
            For lngIndex = 0 To UBound(a)
                Set objWB = Workbooks.Open(a(lngIndex))
                For Each objWSRead In objWB.Worksheets
                    objWS.Cells(lngRow, 1) = objWSRead.Range("b5")
                    objWS.Cells(lngRow, 2) = objWSRead.Range("b6")
                    objWS.Cells(lngRow, 3) = objWSRead.Range("b7")
                    objWS.Cells(lngRow, 4) = objWSRead.Range("b9")
                    objWS.Cells(lngRow, 5) = objWSRead.Name
                    objWS.Cells(lngRow, 6) = objWB.Name
                    lngRow = lngRow + 1
                Next
                objWB.Close False
            Next
        End If
    End If
    
    ErrExit:
    If Err.Number 0 Then MsgBox "Fehler: " & Err.Number & vbLf & _
        Err.Description, Title:="Fehler"
    
    Set objWB = Nothing
    Set objWS = Nothing
    Set objWSRead = Nothing
    GMS True
End Sub


Sub GMS(Optional ByVal Modus As Boolean = False)
    Static lngCalc As Long
    
    With Application
        .ScreenUpdating = Modus
        .EnableEvents = Modus
        .DisplayAlerts = Modus
        .EnableCancelKey = IIf(Modus, 1, 0)
        If Not Modus Then lngCalc = .Calculation
        .Calculation = IIf(Modus, lngCalc, -4135)
        .Cursor = IIf(Modus, -4143, 2)
    End With
    
End Sub


'by J.Ehrensberger


Private Function FileSearchFSO(ByRef Files As Variant, ByVal InitialPath As String, Optional  _
ByVal FileName As String = "*", _
        Optional ByVal SubFolders As Boolean = False) As Long
    Dim mobjFSO As Object, mfsoFolder As Object, mfsoSubFolder As Object, mfsoFile As Object
    Set mobjFSO = CreateObject("Scripting.FileSystemObject")
    Set mfsoFolder = mobjFSO.GetFolder(InitialPath)
    On Error Resume Next
    For Each mfsoFile In mfsoFolder.Files
        If Not mfsoFile Is Nothing Then
            If LCase(mobjFSO.GetFileName(mfsoFile)) Like LCase(FileName) Then
                If IsArray(Files) Then
                    Redim Preserve Files(UBound(Files) + 1)
                Else
                    Redim Files(0)
                End If
                Files(UBound(Files)) = mfsoFile
            End If
        End If
    Next
    If SubFolders Then
        For Each mfsoSubFolder In mfsoFolder.SubFolders
            FileSearchFSO Files, mfsoSubFolder, FileName, SubFolders
        Next
    End If
    If IsArray(Files) Then FileSearchFSO = UBound(Files) + 1
    On Error GoTo 0
    Set mobjFSO = Nothing
    Set mfsoFolder = Nothing
End Function



Private Function fncBrowseForFolder(Optional ByVal defaultPath = "") As String
    Dim objFlderItem As Object, objShell As Object, objFlder As Object
    Set objShell = CreateObject("Shell.Application")
    Set objFlder = objShell.BrowseForFolder(0&, "Ordner auswählen...", 0&, defaultPath)
    If objFlder Is Nothing Then GoTo ErrExit
    Set objFlderItem = objFlder.Self
    fncBrowseForFolder = objFlderItem.Path
    ErrExit:
    Set objShell = Nothing
    Set objFlder = Nothing
    Set objFlderItem = Nothing
End Function


Anzeige
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 15:07:22
Josef
Hallo Walter,
also ich habe den von dir gepostten Code in ein Modul kopiert, eine Tabelle in "Datensammlung" umbenannt und das Makro "DataFromFiles" ausgeführt. Läuft ohne Probleme durch.
Wie lautet die Fehlermeldung und welche Zeile wird markiert?
Gruß Sepp

AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 15:19:00
walter
Hallo Josef,
jetzt hab ich den upload gebacken bekommen. Der Code steht im Modul1 - wahrscheinlich mach ich nen dusseligen Fehler.
Danke erstmal für die Hilfe
Walter
Es wird die erste Zeile markiert:
Sub DataFromFiles()
    Dim objWB As Workbook, objWS As Worksheet, objWSRead As Worksheet
Fehlermeldung: Fehler beim Kompilieren: Syntaxfehler
https://www.herber.de/bbs/user/58195.xls
Anzeige
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 15:25:30
robert
hi,
du musst die leerstellen vor den roten befehlen entfernen-oder?
gruß
robert
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 15:38:00
Josef
Hallo Walter,
du hast den Code zuerst in die Tabelle eingefügt und erst von dort in das Modul.
Datudurch ist der Code zerstückelt.
Kopiere den Code von hier direkt in das Modul.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub DataFromFiles()
    Dim objWB As Workbook, objWS As Worksheet, objWSRead As Worksheet
    Dim strPath As String
    Dim lngRow As Long, lngIndex As Long
    Dim a, lngResult As Long
    
    On Error GoTo ErrExit
    GMS
    
    'Verzeichnis wählen
    strPath = fncBrowseForFolder("E:\")
    
    If strPath <> "" Then
        Set objWS = ThisWorkbook.Sheets("Datensammlung") 'Blatt in dem die Daten gesammelt werden.(Name anpassen)
        lngRow = objWS.Cells(Rows.Count, 1).End(xlUp).Row + 1
        lngResult = FileSearchFSO(a, strPath, "*.xls*", True)
        If lngResult <> 0 Then
            For lngIndex = 0 To UBound(a)
                Set objWB = Workbooks.Open(a(lngIndex))
                For Each objWSRead In objWB.Worksheets
                    objWS.Cells(lngRow, 1) = objWSRead.Range("b5")
                    objWS.Cells(lngRow, 2) = objWSRead.Range("b6")
                    objWS.Cells(lngRow, 3) = objWSRead.Range("b7")
                    objWS.Cells(lngRow, 4) = objWSRead.Range("b9")
                    objWS.Cells(lngRow, 5) = objWSRead.Name
                    objWS.Cells(lngRow, 6) = objWB.Name
                    lngRow = lngRow + 1
                Next
                objWB.Close False
            Next
        End If
    End If
    
    ErrExit:
    If Err.Number <> 0 Then MsgBox "Fehler: " & Err.Number & vbLf & _
        Err.Description, Title:="Fehler"
    
    Set objWB = Nothing
    Set objWS = Nothing
    Set objWSRead = Nothing
    GMS True
End Sub

Sub GMS(Optional ByVal Modus As Boolean = False)
    Static lngCalc As Long
    
    With Application
        .ScreenUpdating = Modus
        .EnableEvents = Modus
        .DisplayAlerts = Modus
        .EnableCancelKey = IIf(Modus, 1, 0)
        If Not Modus Then lngCalc = .Calculation
        .Calculation = IIf(Modus, lngCalc, -4135)
        .Cursor = IIf(Modus, -4143, 2)
    End With
    
End Sub

'by J.Ehrensberger
Private Function FileSearchFSO(ByRef Files As Variant, ByVal InitialPath As String, Optional ByVal FileName As String = "*", _
        Optional ByVal SubFolders As Boolean = False) As Long

    
    Dim mobjFSO As Object, mfsoFolder As Object, mfsoSubFolder As Object, mfsoFile As Object
    
    Set mobjFSO = CreateObject("Scripting.FileSystemObject")
    
    Set mfsoFolder = mobjFSO.GetFolder(InitialPath)
    
    On Error Resume Next
    
    For Each mfsoFile In mfsoFolder.Files
        If Not mfsoFile Is Nothing Then
            If LCase(mobjFSO.GetFileName(mfsoFile)) Like LCase(FileName) Then
                If IsArray(Files) Then
                    Redim Preserve Files(UBound(Files) + 1)
                Else
                    Redim Files(0)
                End If
                Files(UBound(Files)) = mfsoFile
            End If
        End If
    Next
    
    If SubFolders Then
        For Each mfsoSubFolder In mfsoFolder.SubFolders
            FileSearchFSO Files, mfsoSubFolder, FileName, SubFolders
        Next
    End If
    
    If IsArray(Files) Then FileSearchFSO = UBound(Files) + 1
    On Error GoTo 0
    Set mobjFSO = Nothing
    Set mfsoFolder = Nothing
End Function

Private Function fncBrowseForFolder(Optional ByVal defaultPath = "") As String
    Dim objFlderItem As Object, objShell As Object, objFlder As Object
    
    Set objShell = CreateObject("Shell.Application")
    Set objFlder = objShell.BrowseForFolder(0&, "Ordner auswählen...", 0&, defaultPath)
    
    If objFlder Is Nothing Then GoTo ErrExit
    
    Set objFlderItem = objFlder.Self
    fncBrowseForFolder = objFlderItem.Path
    
    ErrExit:
    
    Set objShell = Nothing
    Set objFlder = Nothing
    Set objFlderItem = Nothing
End Function

Gruß Sepp

Anzeige
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 19:54:22
walter
Hallo Josef,
wie von Dir beschrieben, bin ich jetzt nochmals losmarschiert. Makro läuft auch durch, scheint aber kein Ende zu finden. Ich vermute es fehlt der Abschluß wenn die letzte Datei abgearbeitet wurde (Endlosschleife).
Kannst Du bitte nochmals schauen.
mit Dank erneut
Walter
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 20:26:49
Josef
Hallo Walter,
also der Code ist getestet und funktioniert sicher.
Eventuell solltest du bei

lngResult = FileSearchFSO(a, strPath, "*.xls*", True)


den letzten Parameter auf False stellen, damit Unterordner nicht durchsucht werden.

Gruß Sepp

Anzeige
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 21:50:00
walter
Hallo Josef,
mein schlechtes Gewissen wird größer und größer.....
leider auch nach dem true und false Austausch das gleiche Problem. Makro läuft sauber und zügig durch, bleibt dann aber mit Sanduhr ganz oben im Makro stehen.
Ich habe Dir jetzt drei Muster eingepackt
a) die Makrodatei (1_Gesamtübersicht_hz)
b) 2 abzufragende Musterdateien
alle drei habe ich in einem Verzeichnis stehen.
Könntes Du bitte nochmals schauen
Danke + Gruß
Walter
https://www.herber.de/bbs/user/58203.zip
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 22:13:00
Josef
Hallo Walter,
läuft tadelos.
Sehen deine Datein so aus wie die Beispiele?
Kann mir nicht erklären, warum es bei dir nicht läuft.
Gruß Sepp

Anzeige
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 22:23:00
walter
Hallo Josef,
ja dies sind keine Testdaten, habe nur die existenten tatsächlichen Namen gegen Synonyme ausgetauscht.
Werde jetzt die Musterdaten nehmen und an meinen alten (virenverseuchten) Rechner gehen und die Sache mal dort durchtesten. Ich werde weich, wenn's da läuft. Das würde dann heißen, daß unsere EDV Muftis mal wiedr was eingebaut oder auch etwas nicht eingebaut haben, wäre nicht das erste Mal.
Trotzdem erstmal riesen Dank für Deine Geduld und Hilfe.
Gruß
Walter
PS: sollte es dann laufen, meld ich mich nochmal kurz
AW: im Verzeichnis aus allen Dateien Daten auslesen
08.01.2009 22:52:00
walter
Hallo Josef,
no, der Rechner will auch nicht, gleiche xls Version(2002).
Ich gebe auf und kopier den gesamten Mist in eine Datei, das wird funzen.
Trotzdem nochmals vielen Dank für Deine Geduld.
Gruß
Walter
Anzeige

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige