Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA Ordner und Unterordner durchsuchen und Datei-Inhalt ausgeben
#1
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ß
Antworten Top
#2
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."
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





Antworten Top
#3
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ß
Antworten Top
#4
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


Angehängte Dateien
.xlsm   Schreibe.xlsm (Größe: 50,86 KB / Downloads: 13)
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





Antworten Top
#5
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ß
Antworten Top
#6
Ok, entschuldige! Mein Fehler. Das Makro ist perfekt!!!! Vielen vielen Dank!!!!
Antworten Top
#7
Kann ich auch einfach sagen, dass die Datei immer in B3 anfängt zu schreiben?

Gruß
Antworten Top
#8
Quasi


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

umbauen auf B3 bzw inzwischen A3.

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


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste