Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Dateinamen aus Ordner und SubOrdner in Excel

Dateinamen aus Ordner und SubOrdner in Excel
06.04.2017 16:21:12
Schnappauf
Hallo zusammen,
ich würde gerne die File-Namen eines Ordners, sowie dessen Sub-Ordner, in eine Excel schreiben.
Am besten wäre es wenn nur PDF und Excel-File-Namen (also .pdf und .xls) in die Excel-Tabelle geschrieben würden.
Folgenden Code habe ich schon angepasst, jedoch passiert bei der Ausführung nichts...
Function OrdnerDateienAuslesen(ByVal strOrdner As String)
Dim fso As Object
Dim objFld As Object
Dim SubFld As Object
Dim fld, file
Dim rs As DAO.Recordset
Dim db As DAO.Database
'Recordset referenzieren
Set db = CurrentDb
Set rs = db.OpenRecordset("Dateipfad", dbOpenDynaset)
'File-System-Object, Startordner, Unterordner referenzieren
Set fso = CreateObject("Scripting.FileSystemObject")
Set objFld = fso.GetFolder(strOrdner)
Set objSubFld = objFld.SubFolders
For Each fld In objSubFld
Set objFiles = fld.Files
For Each file In objFiles
rs.AddNew
'Neuen Pfad speichern
rs!dateiPfad = fld.Path
'Dateiname speichern
rs!Dateiname = file.Name
rs.Update
Next file
'Rekursiver Aufruf
OrdnerDateienAuslesen fld
Next fld
'Objektreferenzen zerstören
Set db = Nothing
rs.Close
Set fso = Nothing
Set objFld = Nothing
End Function

Ich habe die Funktion auch aus einem Forum, kenn mich leider noch nicht so gut aus.
Über Hilfe würde ich mich freuen, danke!
Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dateinamen aus Ordner und SubOrdner in Excel
06.04.2017 20:57:16
Dieter
Hallo Schnappauf,
du kannst das folgende Programm verwenden:

Dim fso As FileSystemObject
Dim zeile As Long
Dim ws As Worksheet
Sub Auflistung_FD_Unterverz()
Dim fd As FileDialog
Dim fol As Folder
Dim pfad As String
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
fd.Title = "FileSystemObject_Demo - Verzeichnis auswählen"
fd.ButtonName = "&Übernehmen"
fd.InitialView = msoFileDialogViewDetails
fd.InitialFileName = ThisWorkbook.Path & "\"
If fd.Show = 0 Then
MsgBox Prompt:="Abbruch durch den Benutzer"
Exit Sub
End If
pfad = fd.SelectedItems(1)
Set ws = ThisWorkbook.Worksheets(1)
ws.UsedRange.ClearContents
Set fso = New FileSystemObject
Set fol = fso.GetFolder(pfad)
zeile = 1
Folder_abarbeiten Verzeichnis:=fol
Set fso = Nothing
End Sub
Sub Folder_abarbeiten(Verzeichnis As Folder)
Dim fil As File
Dim fol As Folder
' Alle pdf- und Excel-Dateien des Verzeichnisses auflisten
For Each fil In Verzeichnis.Files
If UCase$(fil.Name) Like "*.PDF" Or _
UCase$(fil.Name) Like "*.XL*" Then
If Left$(fil.Name, 1) = "=" Then
ws.Cells(zeile, "A") = "'" & fil.Path
Else
ws.Cells(zeile, "A") = fil.Path
End If
zeile = zeile + 1
End If
Next fil
' Alle Unterverzeichnisse des Verzeichnisses abarbeiten
For Each fol In Verzeichnis.SubFolders
Folder_abarbeiten Verzeichnis:=fol
Next fol
End Sub

Den Code zusammen in einen Modul kopieren.
Dann musst du noch einen Verweis auf die Bibliothek "Microsoft Scripting Runtime" setzen. Das machst du von der VBA-Oberfläche aus: Extras > Verweise... > Häkchen bei "Microsoft Scripting Runtime" setzen.
Viele Grüße
Dieter
Anzeige
AW: Dateinamen aus Ordner und SubOrdner in Excel
07.04.2017 09:47:37
Schnappauf
Danke für die Antwort!
Das klappt auch soweit. Nur würde ich gerne statt dem kompletten Dateipfad nur den Namen der Datei kopieren. Also bspw. in der Form "Dateinamen.pdf"
Außerdem würde ich es gerne verstehen und (wenn möglich) etwas einfacher halten. Mit folgendem Code kann klappt es, nur muss ich für jeden Unterordner den Code wieder kopieren und die zu durchsuchende Adresse anpassen:
Sub Test()
Dim fs As Object
Dim fVerz As Object
Dim fDatei As Object
Dim fdateien As Object
Dim strDat As String
Dim Zeile As Integer
Zeile = 3
Set fs = CreateObject("scripting.FileSystemObject")
Set fVerz = fs.getFolder("Adresse/Pfad")
Set fdateien = fVerz.Files
For Each fDatei In fdateien
If InStr(fDatei, "") > 0 Then
Zeile = Zeile + 1
Cells(Zeile, 3) = fDatei.Name
End If
Next fDatei
End Sub
Diesen Code verstehe ich soweit. Nur würde ich gerne automatisch noch die Unterordner in gleicher Weise durchsuchen und in Excel kopieren, sowie (wenn möglich) bei jedem Unterordner in Excel eine Zeile frei lassen...
Anzeige
AW: Dateinamen aus Ordner und SubOrdner in Excel
07.04.2017 21:31:19
Dieter
Hallo Schnappauf,
wenn du wirklich Unterordner bis zu beliebiger Tiefe einbeziehen willst, dann geht das nur rekursiv.
D.h. hier, dass sich das Programm "Folder_abarbeiten" für jedes Element der SubFolders-Auflistung selbst aufruft.
Ich habe dir jetzt das Programm so geändert, dass jeweils der Verzeichnisname und anschließend die Dateien ohne Verzeichnis aufgelistet werden. Vor dem Verzeichnisnamen erscheint jeweils eine Leerzeile.

Option Explicit
Dim fso As FileSystemObject
Dim zeile As Long
Dim ws As Worksheet
Sub Auflistung_FD_Unterverz_V2()
Dim fd As FileDialog
Dim fol As Folder
Dim pfad As String
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
fd.Title = "FileSystemObject_Demo - Verzeichnis auswählen"
fd.ButtonName = "&Übernehmen"
fd.InitialView = msoFileDialogViewDetails
fd.InitialFileName = ThisWorkbook.Path & "\"
If fd.Show = 0 Then
MsgBox Prompt:="Abbruch durch den Benutzer"
Exit Sub
End If
pfad = fd.SelectedItems(1)
Set ws = ThisWorkbook.Worksheets(1)
ws.UsedRange.ClearContents
Set fso = New FileSystemObject
Set fol = fso.GetFolder(pfad)
zeile = 1
Folder_abarbeiten Verzeichnis:=fol
Set fso = Nothing
End Sub
Sub Folder_abarbeiten(Verzeichnis As Folder)
Dim fil As File
Dim fol As Folder
' Alle pdf- und Excel-Dateien des Verzeichnisses auflisten
If zeile > 1 Then
zeile = zeile + 1
End If
ws.Cells(zeile, "A") = Verzeichnis.Path
zeile = zeile + 1
For Each fil In Verzeichnis.Files
If UCase$(fil.Name) Like "*.PDF" Or _
UCase$(fil.Name) Like "*.XL*" Then
If Left$(fil.Name, 1) = "=" Then
ws.Cells(zeile, "A") = "'" & fil.Name
Else
ws.Cells(zeile, "A") = fil.Name
End If
zeile = zeile + 1
End If
Next fil
' Alle Unterverzeichnisse des Verzeichnisses abarbeiten
For Each fol In Verzeichnis.SubFolders
Folder_abarbeiten Verzeichnis:=fol
Next fol
End Sub
Einen echten Vereinfachungsansatz (jedenfalls nicht ohne Leistungseinschränkung) sehe ich leider nicht.
Ich füge auch meine Arbeitsmappe bei:
https://www.herber.de/bbs/user/112736.xlsm
Viele Grüße
Dieter
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Dateinamen aus Ordner und SubOrdner in Excel auslesen


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Modul einfügen:

    • Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.
  3. Code einfügen:

    • Kopiere den folgenden VBA-Code in das Modul:
    Option Explicit
    Dim fso As FileSystemObject
    Dim zeile As Long
    Dim ws As Worksheet
    
    Sub Auflistung_FD_Unterverz()
       Dim fd As FileDialog
       Dim fol As Folder
       Dim pfad As String
       Set fd = Application.FileDialog(msoFileDialogFolderPicker)
       fd.Title = "Verzeichnis auswählen"
       If fd.Show = 0 Then Exit Sub
       pfad = fd.SelectedItems(1)
       Set ws = ThisWorkbook.Worksheets(1)
       ws.UsedRange.ClearContents
       Set fso = New FileSystemObject
       Set fol = fso.GetFolder(pfad)
       zeile = 1
       Folder_abarbeiten Verzeichnis:=fol
       Set fso = Nothing
    End Sub
    
    Sub Folder_abarbeiten(Verzeichnis As Folder)
       Dim fil As File
       Dim fol As Folder
       If zeile > 1 Then zeile = zeile + 1
       ws.Cells(zeile, "A") = Verzeichnis.Path
       zeile = zeile + 1
       For Each fil In Verzeichnis.Files
           If UCase$(fil.Name) Like "*.PDF" Or UCase$(fil.Name) Like "*.XL*" Then
               ws.Cells(zeile, "A") = fil.Name
               zeile = zeile + 1
           End If
       Next fil
       For Each fol In Verzeichnis.SubFolders
           Folder_abarbeiten Verzeichnis:=fol
       Next fol
    End Sub
  4. Verweis hinzufügen:

    • Gehe zu Extras > Verweise und setze ein Häkchen bei „Microsoft Scripting Runtime“.
  5. Makro ausführen:

    • Schließe den VBA-Editor und führe das Makro Auflistung_FD_Unterverz über Entwicklertools > Makros aus.

Häufige Fehler und Lösungen

  • Fehler beim Ausführen des Makros:

    • Stelle sicher, dass du einen Ordner ausgewählt hast. Wenn das Dialogfeld geschlossen wird, ohne einen Ordner auszuwählen, wird das Makro abgebrochen.
  • Dateien werden nicht aufgelistet:

    • Überprüfe, ob die Dateien im gewählten Verzeichnis die Endungen .pdf oder .xls haben.
  • VBA-Referenz fehlt:

    • Wenn du den Fehler "Benutzerdefinierter Typ nicht definiert" erhältst, stelle sicher, dass du die Microsoft Scripting Runtime hinzugefügt hast.

Alternative Methoden

  • Excel Power Query:

    • Über Power Query kannst du Daten aus einem Ordner importieren und die Dateinamen sowie -pfade in Excel auflisten. Gehe zu Daten > Abrufen und transformieren > Daten abrufen > Aus Datei > Aus Ordner.
  • Batch-Skripte:

    • Du kannst auch Batch-Skripte verwenden, um Dateinamen zu extrahieren und diese dann in Excel zu importieren.

Praktische Beispiele

  • Um nur die Dateinamen ohne Pfad zu speichern, ändere die Zeile im Code:

    ws.Cells(zeile, "A") = fil.Name
  • Wenn du zusätzlich Sub-Ordner auflisten möchtest, kannst du den Code so anpassen, dass eine Leerzeile zwischen den Ordnernamen und den Dateien eingefügt wird.


Tipps für Profis

  • Rekursive Funktionen: Achte darauf, dass Rekursion in VBA dazu genutzt wird, alle Unterordner zu durchsuchen. Dies ist besonders nützlich, wenn du .sub-dateien öffnen möchtest.

  • Optimierung des Codes: Um den Code effizienter zu gestalten, kannst du die Anzahl der durchsuchten Dateien begrenzen oder Filter implementieren, um nur bestimmte Dateitypen auszulesen.


FAQ: Häufige Fragen

1. Wie kann ich nur bestimmte Dateitypen auslesen? Du kannst die Bedingungen im Code anpassen. Aktuell werden nur .pdf und .xls Dateien aufgelistet. Ändere Like "*.PDF" oder Like "*.XL*" nach Belieben.

2. Funktioniert das auch mit Excel 365? Ja, der bereitgestellte Code funktioniert in Excel 365 sowie in älteren Versionen, die VBA unterstützen.

3. Wie kann ich die Ergebnisse in eine andere Tabelle kopieren? Ändere die Zeile Set ws = ThisWorkbook.Worksheets(1) auf den gewünschten Tabellennamen, z.B. Set ws = ThisWorkbook.Worksheets("MeinTabellenname").

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige