Clever-Excel-Forum

Normale Version: VBA Ordner und Unterordner durchsuchen und Datei-Inhalt ausgeben
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo miteinander,


Habe Frage: wie kann ich mit einer Excel Datei einen Ordner und dessen Unterordner auslesen.

Das Macro soll in der Lage sein, Tabellenblatt 1 und zwei zu durchsuchen, und deren inhalte auszugeben.
Die Dateien haben immer an derselben Stelle ein Datum C4 stehen.

Es kann sein, dass einige Dateien mehr als zwei Tabellenblätter haben.
Das Makro muss nicht unbedingt die Datei öffnen, sondern nur auslesen. Bzw. kann es sein, dass ich im Hintergrund mit einer der Dateien arbeite, dementsprechend sollte das Makro in der Lage sein, diese dennoch auszulesen.

Das Datum und die Inhalte von B6:B55;C6:C55;D6: D55;E6:E55 sofern werte sind, soll die Datei nach Datum gelistet diese in eine Tabelle listen. Diese Tabelle sollte fortlaufend sein. Das Datum sollte vor jede Zeile wiederholt werden, in der es Werte aus dem Tabellenblatt gibt. werden, um eine Verwechslungsgefahr zu vermeiden.

Die Namen der Tabellenblätter sind unbekannt.

Könnt ihr mir helfen?

Danke und Gruß
Hallo tw...

ich hab zu deiner Anfrage noch Verständnisfragen.

1) Zu

Zitat:Bzw. kann es sein, dass ich im Hintergrund mit einer der Dateien arbeite

Wie hast du das gemeint? In der gleichen Excel-Instanz?

2) Kannst du einmal ein Beispiel für eine Ausgabe hochladen?

3) Interessiert nicht aus welcher Datei die Ausgabe erzeugt wurde?


ps Die Anfrage sieht für mich danach aus, als ob du eine wichtige Regel für Tabellenkalhlationen verletzt hättest:
"Gleichartige Daten gehören in eine und nur eine Tabelle."
Hallo Helmut,
Das ist wie folgt gemeint. Es kann sein, dass eine der auszulesenden Dateien an einem anderen PC ausgeführt wird.

Die Ausgabe erfolgt mit xlsx Dateien. Ich schau, dass ich morgen etwas hochlade.

Nein, ich verletzte damit nicht die wichtige Regel. Die auszulesenden Dateien erzeuge ich täglich. Das ganze muss so erfolgen.

Gruß
Hallo tw..

A)
In der Anlage eine Datei mit einem Makro, so wie ich es verstanden habe.

Für das Makro benötigt die Datei :
1) eine Zelle mit Namen "Verzeichnis" in dem das zu durchsuchende Verzeichnis eingetragen werden muss.
2) eine Zelle mit Namen "Ausgabe" ab der die Ergebnisse geschrieben werden. (Mit genügend Platz unter und neben der Zelle, da die Daten dort gnadenlos überschrieben werden.)
3) ein Ereignis, das das Makro aufruft.

B)
Es werden zur Zeit noch Spalten mit Verzeichnis, Datei und Blatt mit ausgegeben die aber in den Konstanten des Programms abgeschaltet werden können.

C)
Folgende Parameter können im Programm eingestellt werden in Klammern die aktuelle Einstellung.


a) intMaxVerz (30)
Begrenzung der zu durchsuchenden Verzeichnisse, falls du mal aus Versehen das oberste Verzeichnis eines Servers einträgst.


b) intMaxblatt (2)
Die ersten n Blätter einer Datei werden bearbeitet.

c) strRngDatum  ("C4")


d) strRngKopie ("B6:E55")
Falls du aus den Blättern mehrere Bereiche untereinander ausgegeben haben möchtest, kannst du sie mit Leerzeiche getrennt eintragen.


e) bolZeigVerz (True)
f) bolZeigDatei (True)
g) bolZeigBlatt (True)
h) bolZeigLeer (True)


Code:
Sub Lese()

Dim intBereich As Integer
Dim intZeile As Integer
Dim intSpalte As Integer
Dim strDatei As String
Dim intAnzVerz  As Integer
Dim intAktVerz  As Integer
Dim intAktBlatt As Integer
Dim intAktZeile As Integer
Dim intAktSpalte As Integer
Dim intSpDatum As Integer
Dim intSpBlatt As Integer
Dim intSpDatei As Integer
Dim intSpVerz As Integer
Dim strVerz As String
Dim strVerzA() As String
Dim varDatum As Variant
Dim varKopie As Variant
Dim varRngKopie As Variant
Dim bolLeer As Boolean
Dim rngAusgabe As Range
Dim wbLesen As Workbook
Dim wsLesen As Worksheet

Const intMaxVerz As Integer = 30
Const intMaxblatt As Integer = 2
Const strTeilDatei As String = ".xlsx"
Const strRngDatum As String = "C4"
Const strRngKopie As String = "B6:E55"
Const bolZeigVerz As Boolean = True
Const bolZeigDatei As Boolean = True
Const bolZeigBlatt As Boolean = True
Const bolZeigLeer As Boolean = True


Application.ScreenUpdating = False
'----------------------------------------------------
' Spalten für Verzeichnis, Datei und Blatt einrichten
'----------------------------------------------------
intSpDatum = 0
intSpBlatt = 0
intSpDatei = 0
intSpVerz = 0
If bolZeigBlatt Then
    intSpDatum = intSpDatum + 1
End If
If bolZeigDatei Then
    intSpDatum = intSpDatum + 1
    intSpBlatt = intSpBlatt + 1
End If
If bolZeigVerz Then
    intSpDatum = intSpDatum + 1
    intSpBlatt = intSpBlatt + 1
    intSpDatei = intSpDatei + 1
End If
varRngKopie = Split(strRngKopie)

'----------------------------------------------------
' Verzeichniseinlesen und Variablen initialisieren
'----------------------------------------------------

ReDim strVerzA(intMaxVerz)
intAktVerz = 1
intAnzVerz = 1
intAktZeile = 0
strVerzA(intAnzVerz) = ThisWorkbook.Names("Verzeichnis").RefersToRange
Set rngAusgabe = ThisWorkbook.Names("Ausgabe").RefersToRange
'----------------------------------------------------
' Schleife über Verzeichnisse
'----------------------------------------------------
While intAktVerz <= intAktVerz And intAktVerz <= intMaxVerz
    strVerz = strVerzA(intAktVerz)
    strDatei = Dir(strVerz, vbDirectory)
'----------------------------------------------------
' Schleife über Dateien im Verzeichnis
'----------------------------------------------------
    While strDatei <> ""
        If (GetAttr(strVerz & strDatei) And vbDirectory) = vbDirectory Then
            If strDatei <> "." And strDatei <> ".." And strDatei <> "" And intAnzVerz < intMaxVerz Then
                intAnzVerz = intAnzVerz + 1
                strVerzA(intAnzVerz) = strVerz & strDatei & "\"
            End If
        Else
            If InStr(strDatei, strTeilDatei) > 0 And strDatei <> ThisWorkbook.Name Then
                intAktBlatt = 0
                Set wbLesen = Workbooks.Open(Filename:=strVerz & strDatei, ReadOnly:=True)
                For Each wsLesen In wbLesen.Worksheets
                    intAktBlatt = intAktBlatt + 1
                    If intAktBlatt <= intMaxblatt Then
                        varDatum = wsLesen.Range(strRngDatum)
                        For intBereich = 0 To UBound(varRngKopie)
                            varKopie = wsLesen.Range(varRngKopie(intBereich)).Value
                            For intZeile = 1 To UBound(varKopie, 1)
'----------------------------------------------------
' Prüfen ob Werte leer
'----------------------------------------------------
                                If bolZeigLeer Then
                                    bolLeer = False
                                Else
                                    bolLeer = True
                                    For intSpalte = 1 To UBound(varKopie, 2)
                                        If varKopie(intZeile, intSpalte) <> "" Then
                                            bolLeer = False
                                        End If
                                    Next intSpalte
                                End If
'----------------------------------------------------
' Schreiben wenn nicht leer
'----------------------------------------------------
                                If Not bolLeer Then
                                    For intSpalte = 1 To UBound(varKopie, 2)
                                        rngAusgabe.Offset(intAktZeile, intSpalte + intSpDatum).Value = varKopie(intZeile, intSpalte)
                                    Next intSpalte
                                    rngAusgabe.Offset(intAktZeile, intSpVerz).Value = strVerz
                                    rngAusgabe.Offset(intAktZeile, intSpDatei).Value = strDatei
                                    rngAusgabe.Offset(intAktZeile, intSpBlatt).Value = wsLesen.Name
                                    rngAusgabe.Offset(intAktZeile, intSpDatum).Value = varDatum
                                    intAktZeile = intAktZeile + 1
                                End If
                            Next intZeile
                        Next intBereich
                    End If
                Next wsLesen
                wbLesen.Close savechanges:=False
            End If
        End If
    strDatei = Dir()
    Wend
    intAktVerz = intAktVerz + 1
Wend
Application.ScreenUpdating = True
End Sub
Wow, vielen, vielen Dank Helmut.
 
ich habe mir das gerade mal runtergeladen und angeschaut. Habe jetzt nur ein Problem
 
in Tabelle 1 hast du ja die beiden Felder. In Verzeichnis habe ich den Pfad eingefügt. Wenn ich den Button ausführe, kommt der Fehler:
 
Laufzeitfehler '53'
       If (GetAttr(strVerz & strDatei) And vbDirectory) = vbDirectory Then
 
woran kann das liegen?
 
Gruß
Ok, entschuldige! Mein Fehler. Das Makro ist perfekt!!!! Vielen vielen Dank!!!!
Kann ich auch einfach sagen, dass die Datei immer in B3 anfängt zu schreiben?

Gruß
Quasi


Code:
Set rngAusgabe = ThisWorkbook.Names("Ausgabe").RefersToRange

umbauen auf B3 bzw inzwischen A3.

Danke und Gruß
Habe es gelöst. Vielen, vielen Dank noch mal!