Ordner auslesen und Liste erzeugen

Hallo,

ich habe in einem Ordner verschiedene Dateien sowie weitere Unterordner, darin wieder verschiedene Dateien sowie weitere Unterordner usw. Jetzt möchte ich eine Liste erzeugen, in der in der Spalte A alle Dateien mit ihrem Namen aufgelistet werden. In Spalte B wäre schön, wenn dazu der komplette Pfad angezeigt würde. Ist das mit Excel zu lösen? Wie geht das? Gibt es eine Funktion oder müsste das mit einem Makro gemacht werden (kann leider nicht selbst programmieren, nur aufnehmen…)?

Oliver

ich habe in einem Ordner verschiedene Dateien sowie weitere
Unterordner, darin wieder verschiedene Dateien sowie weitere
Unterordner usw. Jetzt möchte ich eine Liste erzeugen, in der
in der Spalte A alle Dateien mit ihrem Namen aufgelistet
werden. In Spalte B wäre schön, wenn dazu der komplette Pfad
angezeigt würde. Ist das mit Excel zu lösen? Wie geht das?
Gibt es eine Funktion oder müsste das mit einem Makro gemacht
werden (kann leider nicht selbst programmieren, nur
aufnehmen…)?

Hallo Oliver,

Alt+F11, Einfügen—Modul, Kopier da den nachstehende Code rein.
Wie es im Code steht mußt du einen verweis setzen, das geht über Extras—Verweis, hak da
Microsoft Scripting Runtime
an.

Im Code kannst du über True oder False an der richtigen Stelle in
For Each Datei In GetFiles(„C:\test“, True, „*.xls“)
steuern ob Unterordner durchsucht werden oder nicht.

Mit z.B.
„*.doc“
anstatt
„*.xls“
kannst du steuern ob z.B. Word-Dokumente gelistet werden.

Wenn du das gfs. im Code angepasst hast schließt du den Vb-Editor. In Excel dann Alt+F8 und das makro „Dateilisten“ ausführen lassen.
Im grad aktuellen Blatt entsteht dann die Liste.

Gruß
Reinhard

Option Explicit

' Achtung!
' --\> Microsoft Scripting Runtime - Verweis notwendig!
Sub Dateilisten()
Dim Datei As File, Zei As Long
Application.ScreenUpdating = False
For Each Datei In GetFiles("C:\test", True, "\*.xls")
 Zei = Zei + 1
 Cells(Zei, 1) = Datei.Name
 Cells(Zei, 2) = Datei.Path
Next
Application.ScreenUpdating = True
End Sub
'
Public Function GetFiles(FolderPath As String, scanSubDirectorys As Boolean, Optional \_
SearchPattern As String, Optional SortBy As String) As Collection
 ' Die MSR - Objekte
 Dim objFs As New FileSystemObject
 Dim objRootFolder As Folder
 Dim objSubFolder As Folder
 Dim objFile As File
 ' Zwischenspeicher für den Rückgabewert der Funktion
 Dim HColl As New Collection
 Set HColl = Nothing
 ' Wenn kein Suchmuster angegeben alle Dateien zurückliefern
 If SearchPattern = "" Then SearchPattern = "\*"
 ' Das Ordner-Objekt für den angegebenen Pfad laden
 On Error GoTo err01
 Set objRootFolder = objFs.GetFolder(FolderPath)
err01:
 If Err.Number 0 Then
 Set GetFiles = HColl
 Exit Function
 End If
 ' Alle Dateien in diesem Ordner durchlaufen
 For Each objFile In objRootFolder.Files
 ' Wenn das Suchmuster übereinstimmt Datei der Collection hinzufügen
 If objFile.Name Like SearchPattern Then
 HColl.Add objFile
 End If
 Next
 ' Wenn angegeben, die Unterordner des Startpfades durchlaufen
 If scanSubDirectorys Then
 For Each objSubFolder In objRootFolder.SubFolders
 ' Alle per Rekursion zurückgelieferten Dateien der Hilfscollection hinzufügen
 For Each objFile In GetFiles(objSubFolder.Path, scanSubDirectorys, SearchPattern)
 HColl.Add objFile
 Next
 Next
 End If
 ' Wenn angegeben, die Hilfs-Collection sortieren
 If SortBy "" Then
 Set HColl = SortItemCollection(HColl, SortBy)
 End If
 ' Rückgabewert
 Set GetFiles = HColl
End Function
'
Public Function SortItemCollection(col As Collection, strPropertyName) As Collection
 Dim colNew As Collection
 Dim objCurrent As Object
 Dim objCompare As Object
 Dim lngCompareIndex As Long
 Dim variantCurrent As Variant
 Dim variantCompare As Variant
 Dim blnGreaterValueFound As Boolean
 'make a copy of the collection, ripping through it one item
 'at a time, adding to new collection in right order...
 Set colNew = New Collection
 For Each objCurrent In col
 'get value of current item...
 variantCurrent = CallByName(objCurrent, strPropertyName, VbGet)
 'setup for compare loop
 blnGreaterValueFound = False
 lngCompareIndex = 0
 For Each objCompare In colNew
 lngCompareIndex = lngCompareIndex + 1
 variantCompare = CallByName(objCompare, strPropertyName, VbGet)
 'die Vergleichstypen auf Variant geändert, somit können beliebige Datentypen \_
miteinander verglichen werden
 If variantCurrent 

Hallo Reinhard,

wow, Danke für das Makro.

Ich habe es auf meinen Pfad angepasst und gestartet und dabei folgende Fehlermeldung bekommen:

Fehler beim Kompilieren: Benutzerdefinierter Typ nicht definiert.

Dabei wird im Makro ziemlich am Anfang der Passus „Datei As File“ markiert.

Oliver

Ich habe es auf meinen Pfad angepasst und gestartet und dabei
folgende Fehlermeldung bekommen:

Fehler beim Kompilieren: Benutzerdefinierter Typ nicht
definiert.

Dabei wird im Makro ziemlich am Anfang der Passus „Datei As
File“ markiert.

Hallo Oliver,

hast du den Verweis gesetzt?

Gruß
Reinhard

Hallo Reinhard,

natürlich nicht ;-( Man sollte auch die Anweisungen Zeile für Zeile befolgen, dann klappt es. :wink:

Vielen Dank für Deine Unterstützung!

Obwohl eine Frage hätte ich noch: Kann ich den Pfad in der Datei eingeben und das Makro zieht ihn sich dann? Wäre praktischer, als dies jeweils im Makro machen zu müssen.

Oliver

Hallo Oliver,

hast du den Verweis gesetzt?

Gruß
Reinhard

Hallo Reinhard,

noch eine Frage: Kann man den Dateinamen auch ohne Endung (also ohne .xls) anzeigen lassen? Alternativ könnte ich ja auch im Nachgang eine Spalte einfügen, die nur den Namen ausliest. Das müsste doch über die Funktion Links gehen, oder? Nur weiß ich nicht, wie ich ihm sagen kann, dass er alles bis zum Punkt zeigen soll…

Oliver

noch eine Frage: Kann man den Dateinamen auch ohne Endung
(also ohne .xls) anzeigen lassen? Alternativ könnte ich ja
auch im Nachgang eine Spalte einfügen, die nur den Namen
ausliest. Das müsste doch über die Funktion Links gehen, oder?

Hallo Oliver,

ersetze
Cells(Zei, 1) = Datei.Name
durch
Cells(Zei, 1) = replace(Datei.Name,".xls","")

Wenn du in B den reinen Pfad haben möchtest ohne dateinamen sag Bescheid.

Gruß
Reinhard

Obwohl eine Frage hätte ich noch: Kann ich den Pfad in der
Datei eingeben und das Makro zieht ihn sich dann? Wäre
praktischer, als dies jeweils im Makro machen zu müssen.

Hallo Oliver,

ersetze die entsprechende Zeile im Code durch

For Each Datei In GetFiles(Range(„X25“).Value, True, „*.xls“)

und schreib da anstatt X25 die zelladresse rein die du willst.

Gruß
Reinhard

Hallo Reinhard,

Danke, das klappt!

Oliver

Hallo Oliver,

ersetze die entsprechende Zeile im Code durch

For Each Datei In GetFiles(Range(„X25“).Value, True, „*.xls“)

und schreib da anstatt X25 die zelladresse rein die du willst.

Gruß
Reinhard

Hallo Reinhard,

das klappt, soweit es sich um xls-Dateien handelt, Wenn ich alle Dateientypen auslesen möchte, muss ich ja bei For Each Datei… *.* eingeben, was auch klappt. Aber um alle Endungen wegzubekommen, kann ich nicht bei Cells(Zei, 1) = Replace(Datei.Name, „.xls“, „“) .* eingeben, das klappt nicht. Was muss ich anpassen?

Das wäre praktisch, wenn in Saplte B nur der reine Pfad angezeigt würde.

Oliver

Hallo Oliver,

ersetze
Cells(Zei, 1) = Datei.Name
durch
Cells(Zei, 1) = replace(Datei.Name,".xls","")

Wenn du in B den reinen Pfad haben möchtest ohne dateinamen
sag Bescheid.

Gruß
Reinhard

Hallo Oliver,

das klappt, soweit es sich um xls-Dateien handelt, Wenn ich
alle Dateientypen auslesen möchte, muss ich ja bei For Each
Datei… *.* eingeben, was auch klappt. Aber um alle Endungen
wegzubekommen, kann ich nicht bei Cells(Zei, 1) =
Replace(Datei.Name, „.xls“, „“) .* eingeben, das klappt nicht.
Was muss ich anpassen?

ich weiß nicht was du vorhast aber aus einem Ordner alle Dateien untereinander aufzulisten ohne Endung erscheint mir seltsam.

Das wäre praktisch, wenn in Saplte B nur der reine Pfad
angezeigt würde.

Geht alles,
tausche die beiden entsprechenden Codezeilen gegen:
Cells(Zei, 1) = Left(Datei.Name, InStrRev(Datei.Name, „.“) - 1)
Cells(Zei, 2) = Left(Datei.Path, InStrRev(Datei.Path, „“) - 1)

Gruß
Reinhard

1 „Gefällt mir“

Hallo Reinhard,

Perfekt!

Danke vielmals!

Schöne Grüße

Oliver