Dateinamen eines Verzeichnisses mit VBA auslesen und in Excel schreiben

Mit einem kleinen Makro können Sie ganz bequem sämtliche Dateinamen inklusive der Dateiendungen in Excel schreiben. Das nachfolgende Makro brauchen Sie hierfür lediglich in ein Modul Ihrer Exceldatei hinzufügen. Alternativ können Sie auch die im Anschluss an diesen Beitrag anghängte Musterdatei nutzen um Dateinamen mit VBA auslesen zu können.

Bevor Sie starten gibt es zwei Wichtige Punkte zu beachten. Vor dem Ausführen des Makros müssen Sie den Ordnername im VBA Code noch abhändern. Im Beispiel würde das Makro ansonsten im Laufwerk „C:\“ den Ordner mit dem Namen „Ordnername“ suchen und falls vorhanden die Dateien dieses Ordners in Spalte A ab Zeile 1 auflisten. Sofern der Ordnerpfad nicht vorhanden ist, erhalten Sie die Fehlermeldung „Laufzeitfehler ’76‘: Pfad nicht gefunden“.

Laufzeitfehler 76

Dateinamen mit VBA auslesen

Achten Sie zudem darauf, dass in der Tabelle keine Inhalte in Spalte A vorhanden sind, da diese sonst ggf. überschrieben werden! Möchten Sie die Dateinamen nicht schon ab Zeile 1, sondern z.B. erst ab Zeile 5 schreiben. Ändern Sie im VBA Code zudem den Code von

lngZeile = 1

auf

lngZeile = 5

ab.

Der gesamte Quellcode für dieses Makro lautet wie folgt:

Sub DateienAuflisten()

Dim lngZeile As Long
Dim objFileSystem As Object
Dim objVerzeichnis As Object
Dim objDateienliste As Object
Dim objDatei As Object

Set objFileSystem = CreateObject("scripting.FileSystemObject")
Set objVerzeichnis = objFileSystem.GetFolder("C:\Ordnername")
Set objDateienliste = objVerzeichnis.Files

lngZeile = 1

For Each objDatei In objDateienliste
     If Not objDatei Is Nothing Then
          ActiveSheet.Cells(lngZeile, 1) = objDatei.Name
          lngZeile = lngZeile + 1
     End If
Next objDatei

End Sub

Möchten Sie zudem nicht alle Dateinamen in Excel schreiben, können Sie auch anhand einer weiteren kleinen Modifikation bestimmte Dateiendungen oder Dateinamen ausschließen. Ändern Sie hierfür die Zeile mit dem VBA Code:

If Not objDatei Is Nothing Then

in

If Not objDatei Is Nothing And Right(LCase(objDatei.Name), 4) = ".jpg" Then

ab.

Die Ergänzung And Right(LCase(objDatei.Name), 4) = „.jpg“ führt zu der Einschränkung, dass nur Dateien mit der Endung „.jpg“ in Excel geschrieben werden. Möchten Sie alle Dateinamen außer einer bestimmten Endung in Excel schreiben, fügen Sie noch den Befehl „Not“ hinzu. Beispiel: And Not Right(LCase(objDatei.Name), 4) = „.jpg“

Das hier vorgestellte Makro liest nur die Dateinamen des aktuellen Ordners aus. Die Namen von Unterordnern und darin liegender Dateien werden nicht berücksichtigt. Die Dateien von Unterordnern können selbstverständlich grds. auch berücksichtigt werden. In diesem Fall ist dann jedoch eine etwas umfangreichere Änderung am VBA Quellcode erforderlich.

Dateien aus Unterverzeichnissen auslesen

Um auch die Dateinamen aus Unterordnern auslesen zu können ist eine zusätzliche Prozedur erforderlich, die für jeden einzelnen Unterordner aufgerufen wird. Weil in diesem Beispiel die Dateien des Hauptordners nicht berücksichtigt werden, sind die beiden Makros ggf. zu kombinieren. Rufen Sie hierzu die zweite Prozedur am Ende des ersten Makros über den Befehl

Call UnterOrdnerAuslesen(objVerzeichnis)

auf. Über diese Programmzeile wird dann benötigte zusätzliche VBA Prozedur aufgerufen.

Sub UnterOrdnerAuslesen(ByVal strDateipfad As String)

Dim objFileSystem As Object
Dim objVerzeichnis As Object
Dim objUnterordner As Object
Dim objDatei As Object
Dim i As Long
  
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objVerzeichnis = objFileSystem.getfolder(strDateipfad)
  
If Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
    i = Cells(Rows.Count, 1).End(xlUp).Row + 1
Else
    i = 2
End If
 
For Each objUnterordner In objVerzeichnis.subfolders
    For Each objDatei In objUnterordner.Files
        If Not objDatei Is Nothing And Not Right(LCase(objDatei.Name), 4) = ".jpg" Then
            ActiveSheet.Cells(i, 1) = objDatei.Name
            ActiveSheet.Cells(i, 2) = objUnterordner.Path
            i = i + 1
        End If
    Next objDatei
    Call UnterOrdnerAuslesen(objUnterordner.Path)
    If Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
        i = Cells(Rows.Count, 1).End(xlUp).Row + 1
    Else
        i = 2
    End If
Next objUnterordner
     
End Sub

Excel Mustermappe:

Dateinamen in Excel auslesendateien_auflisten.xlsm

 
Gefällt Ihnen der Beitrag?

94 Gedanken zu „Dateinamen eines Verzeichnisses mit VBA auslesen und in Excel schreiben“

  1. Hallo,
    ich möchte statt Endung „.jpg“ ein TextBox haben (zum Beispiel „textbox1“) In TextBox werde ich der Name eintippen, danach folgt die Suche. Ich suche immer nach verschiedene Dateien, meistens sind PDF.
    VG

    Antworten
    • @Ilario: Dazu benötigen Sie eine zusätzliche Variable in der Sie den Wert aus einer Inputbox speichern und dann in der If-Bedingungen übergeben.

      zusätzlich also diese beiden Zeilen:

      Dim strDateiendung As String
      strDateiendung = InputBox(„Dateiendung eingeben:“)

      und zudem diese Zeile anpassen:

      If Not objDatei Is Nothing And Right(objDatei.Name, 4) = strDateiendung Then

      Antworten
    • @Dietmar: Ja, das geht. Mit den folgenden zusätzlichen Zeilen können weitere Informationen abgerufen werden.

      ActiveSheet.Cells(lngZeile, 2) = objDatei.DateCreated ‚Erstellungsdatum
      ActiveSheet.Cells(lngZeile, 3) = objDatei.DateLastModified ‚letztes Änderungsdatum
      ActiveSheet.Cells(lngZeile, 4) = objDatei.DateLastAccessed ‚letzter Zugriff
      ActiveSheet.Cells(lngZeile, 5) = objDatei.Size ‚Größe
      ActiveSheet.Cells(lngZeile, 6) = objDatei.Type ‚Dateityp

      Antworten
      • Hallo Marco
        ich hatte vor Jahren 2013 die gleich Fragestellung „Verzeichnisse und Unterverzeichnisse“ nach Excel einlesen, damit ich sie dort lesen, drucken etc. kann. Es gab keine komplette Lösung in den Foren.
        Daraufhin habe ich mit VBA beigebracht
        Sende mir Deine eMail Adresse und ich sende Dir das Excel VBA Tool zurück

        Antworten
  2. Hallo zusammen,
    ich finde es echt super das hier Profis so Anfänger wie mir alles super erklären und noch beispiele anhängen!
    Gibt es auch ein Beispiel wo die Unterordenr berücksichtigt weren?
    Danke

    Antworten
  3. Hallo. Sehr interessantes Thema. Wie würde der Code aussehen, wenn ich das „Laufwerk“ über eine Inputbox eingeben möchte.
    Danke im Voraus. Viele Grüße.

    Antworten
    • @Andreas: Dazu wäre eine zusätzliche Variable nötig, die mit dem Wert aus der Inputbox gefüllt wird. Anschließend übergibt man den Wert dann dem Objekt objVerzeichnis. Mehr muss hier nicht getan werden.

      strPfad = InputBox(„Bitte Ordnerpfad eingeben:“)
      Set objVerzeichnis = objFileSystem.GetFolder(strPfad)

      Antworten
        • Hallo Herr Schade. Vielen Dank erst mal allgemein für Ihre große Hilfe. Ich bin völliger VBA-Anfänger. Über Ihren Code (ganz oben) kann ich die Dateinamen aus einem festgelegten Pfad auslesen, allerdings würde ich gern diesen Pfad über ein Fenster auswählen können.
          Haben Sie dafür eine Lösung?

          Vielen Dank und viele Grüße.

          Antworten
        • @Mike: Wie oben schon im Beispiel gezeigt, übergibt man den Wert z.B. in der Zeile vorher. Je nach Nutzung kann das aber auch anders gelöst werden.

          strPfad = InputBox(„Bitte Ordnerpfad eingeben:“)
          Set objVerzeichnis = objFileSystem.GetFolder(strPfad)

          Antworten
  4. Hallo. Sicherlich habe ich einen Denkfehler. Ich möchte den Pfad zum Auslesen eines Ordners über eine Inputbox eingeben. Hierzu habe ich den folgenden Code erstellt, welcher aber nicht funktioniert 🙁
    ‚########################
    Sub Einlesen()
    Dim zeile As Variant
    Dim sFile As String, sPattern As String, sPath As String
    Dim iRow As Integer
    Columns(1).ClearContents

    strPfad = InputBox(„Bitte Ordnerpfad eingeben:“)
    Set objVerzeichnis = objFileSystem.GetFolder(strPfad)

    ‚If Right(strPfad, 1) „\“ Then strPfad = sPath & „\“
    If Right(strPfad, 1) „\“ Then strPfad = strPfad & „\“
    sPattern = „*.*“
    sFile = Dir(strPfad & sPattern) ‚(strPfad & sPattern)
    Do Until strPfad = „“ ’sFile = „“
    iRow = iRow + 1
    Cells(iRow, 1).Value = sFile
    strPfad = Dir()
    Loop
    For zeile = 1 To Cells.SpecialCells(xlLastCell).Row

    Next
    End Sub ‚Bei erneutem Aufruf werden die alten Funde überschrieben

    Antworten
  5. So, ich hab‘s dann doch noch hinbekommen. Dennoch vielen Dank für die vielen Hilfreichen Kommentare in diesem Forum…
    Diesen VBA Code in ein Modul:
    Sub Einlesen()
    Dim zeile As Variant
    Dim sFile As String, sPattern As String, sPath As String
    Dim iRow As Integer
    Columns(1).ClearContents

    Dim sTxt As String
    sTxt = InputBox(„Bitte Eingabe tätigen:“)
    If sTxt = „“ Then Exit Sub
    ‚MsgBox sTxt
    Range(„A3“).Value = sTxt

    If Right(sTxt, 1) „\“ Then sTxt = sTxt & „\“
    sPattern = „*.*“
    sFile = Dir(sTxt & sPattern)
    Do Until sTxt = „“
    iRow = iRow + 1
    Cells(iRow, 1).Value = sFile
    sFile = Dir()
    Loop
    For zeile = 1 To Cells.SpecialCells(xlLastCell).Row

    Next
    End Sub ‚Bei erneutem Aufruf werden die alten Funde überschrieben

    Antworten
    • @Josh: Allgemein kann man das nicht beantworten. Kommt immer darauf an, was im Makro gemacht wird. Wenn z.B. eine Schleife die Objekt-Variable nutzt, könnte es erst danach die Variable geleert werden. Ganz am Ende eines Makros macht es überhaupt keinen Sinn die Variable zu leeren, denn am Ende des Makros wird die Variable sowieso gelöscht. Es gibt aber natürlich bestimmte Konstellationen, wo eine Leerung sinnvoll ist. Wenn die Objekt-Variable z.B. erst innerhalb einer Schleife mit einem Wert gefüllt wird, und vermieden werden soll, dass ein alter Wert noch in der Variable gespeichert ist.

      Ich leere in meinen Makros die Objekt-Variablen nur, wenn dies wirklich erforderlich ist. Das spart (minimal) Rechenleistung und macht den VBA-Code insgesamt lesbarer. Von unnötig vielen Zeilen sollte grds. abgesehen werden.

      Antworten
  6. Hallo Herr Schade,
    leider übersieht das Programm aus ihrer Vorlage einige Unterordner. Selbst wenn ich einen neuen Ordner anlege findet er ihn und den Inhalt nicht. Es wäre schön wenn sie sich den Code nochmal ansehen könnten.
    (Es sind keine .jpg Dateien in den Ordnern enthalten)

    Antworten
    • @Wolfgang Schmid: Haben Sie den Beitrag eigentlich nicht gelesen? Da sind beide Fragen direkt beantwortet und verschiedene Anpassungsmöglichkeiten beschrieben.

      Im Beispiel wurden Bilddateien mit der Dateiendung „.jpg“ ausgeschlossen:

      Die Ergänzung And Right(objDatei.Name, 4) = “.jpg” führt zu der Einschränkung, dass nur Dateien mit der Endung “.jpg” in Excel geschrieben werden. Möchten Sie alle Dateinamen außer einer bestimmten Endung in Excel schreiben, fügen Sie noch den Befehl “Not” hinzu. Beispiel: And Not Right(objDatei.Name, 4) = “.jpg”

      Und auch die Lösung bei Verwendung von Unterordnern ist im Beitrag beschrieben!

      Um auch die Dateinamen aus Unterordnern auslesen zu können ist eine zusätzliche Prozedur erforderlich, die für jeden einzelnen Unterordner aufgerufen wird. Weil in diesem Beispiel die Dateien des Hauptordners nicht berücksichtigt werden, sind die beiden Makros ggf. zu kombinieren.

      Da Sie leider keine Emailadresse angegeben haben, habe ich auch keine Möglichkeit mit Ihnen direkt in Kontakt zu treten.

      Antworten
  7. Hallo,

    danke für die tolle Anleitung. Klappt wunderbar und löst ein riesen Problem. Aber irgendwie nur bis zur ersten Unterordner-Ebene (vermute ich).

    Hat das Makro die maximale Anzahl an Unterordnern des 1. Unterordners (nennen wir ihn Fritz) durchlaufen, hüpft die Schleife zum 2. Unterordner (Max). Die Schleife hat sich hier aber (anscheinend) die Zeilennummer gemerkt bei der Fritz geendet hat und fängt nun an, 1 Zeile weiter die Dateien und Ordner von Max aufzulisten. D.h. die Werte von Fritz werden überschrieben.

    Kann man das Makro noch so anpassen, dass es diesen Umstand berücksichtigt? Ich weiß nämlich, dass ich in einem Ordner > 500 Dateien des Typs X habe, durch dieses Überschreiben jedoch, bekomme ich ein Ergebnis von nur 240 (oder so). Also ein verfälschtes Ergebnis.

    Nochmals danke, a) für die Lösung an sich und b) für dich sicherlich hilfreiche Antwort im Voraus 🙂

    LG Marco

    Antworten
      • Hallo,

        ich kann das Problem von Marco bestätigen.

        Es werden zwar alle Dateien korrekt gelesen, aber beim schreiben in das Excelblatt werden ab und zu Zeilen überschrieben was daran liegt, das die Variable i unter bestimmten Umständen einen falschen bzw. nicht aktuellen Wert hat. Habe es gelöst, indem ich Variable i einfach nochmal neu bestimme zwischen der Anweisung „Call UnterordnerAuslesen“ und „next objUnterordner“, da dort der Fehler passiert. Jetzt werden alle Dateien auch angezeigt.

        .
        .
        .
        Call UnterOrdnerAuslesen(objUnterordner.Path)

        If Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
        i = Cells(Rows.Count, 1).End(xlUp).Row + 1
        Else
        i = 1
        End If

        Next objUnterordner

        .
        .
        .

        Gruß und Danke für den Code. Hat mir sehr geholfen 🙂

        Antworten
        • @Jens Hanschke: Unter welchen Umständen soll das der Fall sein? Die Variable i wird immer dann hochgezählt, wenn ein Eintrag in das Tabellenblatt geschrieben wird.

          ActiveSheet.Cells(i, 1) = objDatei.Name
          ActiveSheet.Cells(i, 2) = objUnterordner.Path
          i = i + 1

          Damit ist ein Überschreiben der Zeile ausgeschlossen.

          Antworten
          • Hallo, warum der Fehler passiert, kann ich nicht rausfinden. Ich kann es nur versuchen zu Beschreiben.

            In meinem Fall ist es so: Wenn zb. keine Datei mehr in einem Unterordner ist die es in Excel zu schreiben gilt, springt der Code auf „End Sub“ (i = 12 in meinem Beispiel). Dann springt er auf „Next objUnterordner“ und dann wieder auf „End Sub“ (i ist immernoch 12). Dann springt er wieder auf „Next objUnterordner“ und auf einmal ist i = 10 ! und die For Each Schleife geht wieder los. Und somit werden zwei Zeilen überschrieben wo vorher was stand.

            Das ergibt überhaupt kein Sinn da es keinerlei Code gibt der i verändert zwischen „Next objUnterordner“ und „End Sub“ Trotzdem passiert es.

            Scheint wohl nur zu sein, wenn im OrdnerTree 2 oder mehr Unterordner hintereinander „zurück“ gesprungen wird.

            Ich hoffe das war nicht zu verwirrend.

            Gruß

  8. Hm … dann verhält sich mein Excel (Version 2007) anders als das Ihre. Je verschachtelter bzw. je mehr Ebenen eine Ordner-Struktur ist/enthält desto mehr steigt die Gefahr, dass Zeilen überschrieben werden.
    Ich hab das nun aber so gelöst, dass die Abfrage der Zeilennummer innerhalb der zweiten For-Each-Schleife statt findet. Damit ist das Problem für mich behoben und alle Dateien werden angezeigt 🙂

    Trotzdem Danke für die Hilfe und Mühen.

    Antworten
  9. Hallo Marco

    Tolles Makro welches (fast) alles (oder mehr?) Gewünschte ausliest…

    Ich habe einen Ordner mit Musik aus den 60-ern und 11 Unterordner. Erstaunlicherweise habe ich in der ausgelesenen Liste mit deinem angepassten Makro auch 4 „jpg“ und 1 „ini“ (sonst gut 140 „mp3“). Die 4 „jpg“ zeigt es aber auch mit suchen nicht an…

    Jtzt aber das grössere Problem. Wenn ich auch den Zusatzcode mit den wirklich nützlichen Inputboxen genau so hineinschreibe, kommt immer die Meldung
    > Erwartet: Listentrennzeichen oder )!!!

    Hast du einen Tipp oder kann ich dir sogar diese kleine Datei senden?
    Besten Dank für die Hilfe

    Gruss
    Adrian

    PS: Wäre auch die Auflistung sogar mit den Ordnernamen möglich (damit gut sichtbar evtl. mit fetter Schrift)

    Antworten
    • @Adrian: Es handelt sich bei dem bereitgestellten VBA-Code um ein Beispiel. Natürlich kann man dies beliebig ändern und anpassen. Im Beispiel werden Dateien mit der Dateiendung .jpg nicht berücksichtigt. Ist im Beitrag auch erklärt. Kann selbstverständlich geändert werden. Manuelle Auftragsprogrammierungen biete ich gerne an, allerdings handelt es sich hierbei um eine professionelle Dienstleistung, die nicht kostenlos angeboten wird.

      Antworten
  10. Hallo Marco,
    vielen dank für deine Mühen, dass Programm läuft super.
    Was ich nun machen möchte ist, dass die Dateiendungen auch direkt weg sind, was muss ich dafür nun eingeben?

    Vielen Dank
    Gruß
    Mirko

    Antworten
  11. Hallo Marco Schade,

    erst einmal ein unglaublich großes Dankeschön für deine Mühe. Schön, dass es noch Menschen gibt, die anderen helfen (und das sogar noch freiwillig und ohne Bezahlung)!

    Ich habe deinen Code zum auslesen von bestimmten Dateien in einer Ordnerstruktur (mit Unterordnern) soweit umschreiben können, dass auch nur entsprechende aufgelistet werden. Jedoch habe ich nun das Problem, dass zwar in einem bestimmten Ordner auch der Unterordner durchsucht wird, jedoch „eben nur“ in diesem einen Unterordner.

    Kann man den Code relativ leicht so umgestalten, dass nach dem Auslesen eines Unterordners wieder zurück in den Ursprungspfad gesprungen wird und von dort aus weitere Unterordner ausgelesen werden?

    Bsp: UrsprungsPfad = C:\Testordner
    – C:\Testordner\OrdnerA\OrdnerA.1
    – C:\Testordner\OrdnerB\OrdnerB.1
    … and so on
    (Dateien in jeweils allen Ordnernebenen vorhanden)

    Ich danke dir und wünsche einen angenehnem Tag.
    Mit freundlichsten Grüßen,
    Sascha

    Antworten
  12. Hallo,

    erste einmal vielen Dank für das Skript. Eine Frage habe ich:
    Set objVerzeichnis = objFileSystem.GetFolder(„C:\Ordnername“)
    Ich möchte gerne den Pfad variabel gestalten. Der Pfad soll um den Namen des aktiven Arbeitsblattes erweitert werden. Also die Excel Datei liegt in C:\Ordnername. Dort gibt es noch die Ordner AAA und BBB. Im Excel File gibt es jetzt das Arbeitsblatt AAA und BBB. Entsprechend soll der Pfad also je nach Arbeitsblatt C:\Ordnername\AAA oder \BBB heißen. Gibt es hier eine Möglichkeit.

    Danke und Gruß

    Antworten
  13. Hallo mal eine Frage. Unter Set objVerzeichnis = objFileSystem.GetFolder(“C:\Ordnername”) gebe ich ja den genauen Pfad an. Ich würde aber gerne den Pfad aus einer Excel Zelle auslesen lassen. So könnte man später einfach die Zelle ändern und müsste nicht dafür noch in die VBA. Hab da nämlich mehrere Arbeitsblätter.
    Danke!!

    Antworten
    • @Florian: Das geht natürlich auch. Innerhalb der Klammer können alternativ zu einem fixen Ordnerpfad auch Variablen oder Zellen angesprochen werden. Variablen bieten sich an, wenn aus unterschiedlichen Arbeitsblättern unterschiedliche Ordnerpfade angesprochen werden sollen.

      Antworten
    • Hallo, danke schonmal für die Hilfe :-). Ich möchte nun aber noch eins. Ich habe in einer Tabelle mehrere Arbeitsblätter. Für jedes Arbeitsblatt hab ich das oben stehende Makro mit jeweils unterschiedlichn Verzeichnissen (Blatt1 soll aus Ordner1 die Daten ziehen, Blatt2 aus Ordner2 usw.).
      Ich möchte jetzt das jedes der Makros beim Start der Datei ausgeführt wird.
      Alternativ könnte ich aber auch ein Arbeitsblatt haben wo in Festgelegten Zeilenbereichen die Daten eingetragen werden (Zeile 1 bis 100 die Daten aus Ordner1, Zeile 101 – 201 die Daten aus Ordner2…). Ich hätte damit ja dann nur ein Makro. Dieses müsste sich dann aber auch beim Start aktualisieren.

      Vielen Dank für die Hilfe :-).
      Florian

      Antworten
  14. Hallo Marco Schade,
    ich beschäftige mich gerade mit dem Thema Dateinamen und Verzeichnisnamen
    eines definierten Ordnerpfades in Excel auszugeben.

    Ihr Beitrag ist hier sehr hilfreich und super beschrieben.

    Mein Problem besteht darin, das ich gerne die Verzeichnisnamen von Unterverzeichnissen ebenfalls ausgeben möchte.

    Mein Ansatz ist aus dem „objVerzeichnis“ in den „SubFolders“ unter den
    „Item 1“ die Variable „Name“ zu nutzen.

    Hier ist der „Name“ der Variable x_1 zugewiesen:

    x_1 = objVerzeichnis.subfolders.Item 1.Name

    Irgendwie bekomme ich das „Item 1“ nicht angesprochen.

    > Laufzeitfehler ‚5‘
    > Ungültiger Prozeduraufruf oder ungültiges Argument

    Ist die Syntax falsch geschrieben, oder lässt sich der Verzeichnisname so nicht greifen?

    Gruß Oliver

    Antworten
  15. Hallo und vielen Dank für deine Mühe. Ich wollte fragen ob es auch eine Möglichkeit gibt unter der Ausgabe des Pfades etwas auszuschließen. Z.B. alles das in Ordner „Fertig“ ist nicht zu berücksichtigen. So wie es mit der Endung der Datei geschieht.

    Antworten
  16. @Sebastian: Der letzte Satz ist schon der richtige Lösungsansatz. Auch hier kann mit einer Wenn, Dann Bedingung der entsprechende Unterordner übersprungen werden.

    If Not objUnterordner Is Nothing And Not Right(objUnterordner.Name, 6) = „Fertig“ Then

    Antworten
    • Vielen Dank für die wirklich schnelle Antwort. Leider sehe ich hier irgendwie den Wald vor lauter Bäumen nicht. Das Script funktioniert, nur schließt er bei mir die Ordner „fertig“ nicht mit aus. Da ich ein absoluter Anfänger bin sehe ich den Fehler leider nicht. Die Änderung bei mir sieht wie folgt aus:

      For Each objUnterordner In objVerzeichnis.subfolders
      For Each objDatei In objUnterordner.Files
      If Not objUnterordner Is Nothing And Not Right(objUnterordner.Name, 6) = „Fertig“ Then
      ActiveSheet.Cells(i, 1) = objDatei.Name
      ActiveSheet.Cells(i, 2) = objUnterordner.Path
      ActiveSheet.Cells(i, 3) = objDatei.DateCreated
      i = i + 1
      End If
      Next objDatei
      Call UnterOrdnerAuslesen(objUnterordner.Path)
      Next objUnterordner

      Was mache ich Falsch?

      Antworten
      • Es fehlt ein weiteres End if vor Next objDatei um die Bedingung wieder zu schließen und die Anführungszeichen sind ggf. von Hand einzutippen und nicht zu kopieren. Die müssen nämlich oben stehen. Hier in den Blogkommentaren wird ein anderer Zeichensatz genutzt. Die Zeile kann deshalb nicht einfach kopiert werden.

        Antworten
  17. Hallo Marco,

    in der VBA Welt bin ich erst seit ca 4 Wochen dabei und seitdem ein passendes Makro für mein Problem zu finden.
    Mein Problem ist ähnlich wie oben:
    Ich habe ein Verzeichnis mit 223 Ordnern, in denen sich wiederum bis zu 5 Unterordner befinden, in denen sich wiederum einige Dateien befinden (.pdf, .xls, .tif., .doc,.jpeg..)
    Mein Ziel ist diese Dateien zugeordnet nach den Ordnernamen sowie Unterordnernamen aufzulisten.

    Die Ordner und Unterodner sollten jeweils Fett abgebildet sein.

    Leider habe ich im Netz keine passende VBA gefunden.

    Könntest du mir behilflich sein?

    Danke im Vorab für alle die was beitragen
    Grüße aus Heilbronn

    Antworten
  18. Hallo,

    der Code funktioniert sehr gut, jedoch möchte ich die Systemdateien z.B. ~$Test.xlsm nicht aufgelistet bekommen. Wie muss der Code dazu umgeschrieben werden? Vielen Dank schon einmal…

    Sub DateienAuflisten()

    Dim lngZeile As Long
    Dim objFileSystem As Object
    Dim objVerzeichnis As Object
    Dim objDateienliste As Object
    Dim objDatei As Object

    Set objFileSystem = CreateObject(„scripting.FileSystemObject“)
    Set objVerzeichnis = objFileSystem.GetFolder(„C:\Ordnername“)
    Set objDateienliste = objVerzeichnis.Files

    lngZeile = 1

    For Each objDatei In objDateienliste
    If Not objDatei Is Nothing Then
    ActiveSheet.Cells(lngZeile, 1) = objDatei.Name
    lngZeile = lngZeile + 1
    End If
    Next objDatei

    End Sub

    Viele Grüß Tom

    Antworten
    • Hallo zusammen,

      erstmal vielen Dank für dieses Makro es hat mir schon einige male geholfen.

      Ich würde mich aber gerne der Frage von Tom anschließen. Bei mir sind es z.B. versteckte Dateien welche auch aufgelistet werden. Ist es mit diesem Makro möglich diese auszuschließen?

      Mit freundlichen Grüßen
      Mike

      Antworten
      • @Mike: Ich würde es mal mit den Dateiattributen versuchen. Zunächst mal das gesamte Verzeichnis und in einer weiteren Spalte das jeweilige Dateiattribut ausgeben.

        ActiveSheet.Cells(lngZeile, 2) = objDatei.Attributes

        Anschließend kann dann der Ausschluss erweitert werden. Dazu den Nummerncode des auszuschließenden Dataiattributes an Stelle der drei Fragezeichen einfügen:

        If Not objDatei Is Nothing And Not objDatei.Attributes = ??? Then

        Im Endeffekt würde das Makro dann beispielsweise so aussehen:

        For Each objDatei In objDateienliste
             If Not objDatei Is Nothing And Not objDatei.Attributes = 2080 Then
                  ActiveSheet.Cells(lngZeile, 1) = objDatei.Name
                  ActiveSheet.Cells(lngZeile, 2) = objDatei.Attributes
                  lngZeile = lngZeile + 1
             End If
        Next objDatei
        Antworten
        • Hallo Herr Schade,

          das hat super funktioniert! Vielen vielen Dank. Bei mir stand überall 32 außer bei der versteckten Datei bei dieser stand 34 diese hab ich nun ausgeschlossen und sie ist weg. Danke sehr, funktioniert tadellos.

          Mit freundlichen Grüßen
          Mike

          Antworten
  19. Hey Marco,

    wie kann man das Makro so programmieren, dass man den Ordner, dessen Name eingepflegt werden soll, über Windows Explorer auswählen kann?

    Viele Grüße
    Saleh

    Antworten
    • @Saleh: Dazu kann man im Vorfeld über den folgenden VBA-Code den Dateipfad in eine Variable speichern.

      Dim strOrdnerpfad As String
      
      With Application.FileDialog(msoFileDialogFolderPicker)
          .AllowMultiSelect = False
          .ButtonName = "auswählen"
          .Show
          strOrdnerpfad = .SelectedItems(1)
      End With
      Antworten
  20. Hallo, Herr Schade,

    grundsätzlich ein gutes Beispiel.

    Ich wollte mit diesem Werkzeug eine Auflistung meiner externen Festplatte machen. Leider scheitert das mit einem Laufzeitfehler 70; Zugriff verweigert.

    Über die bereits erstellte Liste und die Auflistung aus dem Explorer habe ich auch den „Sünder“ gefunden:
    „System Volume Information“

    Wie kann man dieses Problem lösen?

    Darf ich auch noch einen Verbesserungsvorschlag machen, der sehr viel zur Beschleunigung beiträgt: den Bildschirmupdate ausschalten!

    Danke und viele Grüße

    Werner T.

    Antworten
    • @psjunkey: Mit etwas Anpassung geht das natürlich auch. Ungefähr so:

      Set objShell = CreateObject(„Shell.Application“)
      Set fso = CreateObject(„Scripting.Filesystemobject“)
      strFilePath = „C:\Ordnername\Dateiname.xlsx“
      strAutoren = GetFileProperty(strFilePath,20)

      Die Codes (Autor = 20) finden Sie in dieser Aufstellung.

      Antworten
  21. Gibt es die Möglichkeit die Dateinamen ohne Dateiendung z.b. .docx
    auszulesen und das Dateiformat – also z.B. .docx
    in einer separaten Spalte aufzulisten ?

    Antworten
  22. Wie kann ich die Dateinamen ohne Endung, also .docx anzeigen lassen?

    Bzw. kann ich in einer weiteren Tabellenspalte nur die Dateiendungen, also .docx anzeigen lassen?

    Antworten
  23. Hallo!
    Ich bin neu in der VBA-Welt und habe lange nach einer Lösung gesucht, bin jedoch nicht fündig geworden.

    Wir haben folgende Ordnerstruktur:
    Projekt1 > Unterordner1 > Unterunterordner1
    Projekt1 > Unterordner2 > Unterunterordner1
    Sowohl im Unterordner 1/2 und Unterunterordner1 sind PDF Dateien.

    Ich möchte gerne nur die PDF-Dateien der Unterordner 1 und 2 als Liste (inkl. Dateipfad) ausgegeben haben. Bisher kann ich allerdings nur einen der beiden Ordner auswählen (siehe unten) und kopiere manuell den zweiten Teil in Excel dazu.
    Oder, wenn ich die Subfolder-Variante wähle, dann werden alle Unterunterordner auch berücksichtigt.

    Würde mich nach stundenlangem googeln sehr über Hilfe freuen!
    Danke!

    Sub DateienAuflisten1()
    Dim lngZeile As Long
    Dim objFileSystem As Object
    Dim objVerzeichnis As Object
    Dim objDateienliste As Object
    Dim objDatei As Object

    ‚Start Zelleninhalte löschen
    Dim c As Range
    Application.ScreenUpdating = False ‚Geschwindigkeit erhöht
    For Each c In Range(„A2:A1000“)
    c.Select
    If c „“ Then ActiveCell.ClearContents
    Next
    Application.ScreenUpdating = True
    ‚Ende Zelleninhalte löschen

    Set objFileSystem = CreateObject(„scripting.FileSystemObject“)
    Set objVerzeichnis = objFileSystem.getfolder(Range(„A1“).Value) ‚Pfad für Unterordner1
    Set objDateienliste = objVerzeichnis.Files

    lngZeile = 2
    For Each objDatei In objDateienliste

    If Not objDatei Is Nothing Then
    ActiveSheet.Cells(lngZeile, 1) = objDatei.Path
    lngZeile = lngZeile + 1
    End If

    Next objDatei
    End Sub

    Antworten
  24. Danke für die hilfreichen Hinweise.
    Ich möchte aus den eingelesenen Dateien den Inhaltsstatus abfragen
    ActiveSheet.Cells(lngZeile, 7) = objDatei.ContentStatus ‚Inhaltsstatus

    Wenn ich diese Zeile einfüge, funktioniert es nicht.

    Antworten
  25. Guten Tag zusammen
    @Marco Schade
    Ein super Thema, seit ich das einsetze ist meine Arbeit um einiges effizienter geworden. Danke für die super Seite, Erklärungen und Beispiele.

    Ich habe versucht die Inputbox für die Pfad Eingabe zu erstellen.
    Bin mir auch mit den Erklärungen hier nicht sicher wo ich den Code

    strPfad = InputBox(„Bitte Ordnerpfad eingeben:“)
    Set objVerzeichnis = objFileSystem.GetFolder(strPfad)

    einfügen muss. Mein Code sieht so aus:
    Sub DateienAuflisten()

    Dim lngZeile As Long
    Dim objFileSystem As Object
    Dim objVerzeichnis As Object
    Dim objDateienliste As Object
    Dim objDatei As Object

    Set objFileSystem = CreateObject(„scripting.FileSystemObject“)

    ‚Ich habe versucht den Code hier einzufügen bekam aber eine Fehlermeldung

    Set objVerzeichnis = objFileSystem.getfolder(„C:\temp“)
    Set objDateienliste = objVerzeichnis.Files

    lngZeile = 3

    For Each objDatei In objDateienliste
    If Not objDatei Is Nothing Then
    ActiveSheet.Cells(lngZeile, 1) = objDatei.Name
    lngZeile = lngZeile + 1
    End If
    Next objDatei

    Call UnterOrdnerAuslesen(objVerzeichnis)

    End Sub

    Sub UnterOrdnerAuslesen(ByVal strDateipfad As String)

    Dim objFileSystem As Object
    Dim objVerzeichnis As Object
    Dim objUnterordner As Object
    Dim objDatei As Object
    Dim i As Long

    Set objFileSystem = CreateObject(„Scripting.FileSystemObject“)
    Set objVerzeichnis = objFileSystem.getfolder(strDateipfad)

    If Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
    i = Cells(Rows.Count, 1).End(xlUp).Row + 1
    Else
    i = 1
    End If

    For Each objUnterordner In objVerzeichnis.subfolders
    For Each objDatei In objUnterordner.Files
    If Not objDatei Is Nothing And Not Right(LCase(objDatei.Name), 4) = „.jpg“ Then
    ActiveSheet.Cells(i, 1) = objDatei.Name
    ActiveSheet.Cells(i, 2) = objUnterordner.Path
    i = i + 1
    End If
    Next objDatei
    Call UnterOrdnerAuslesen(objUnterordner.Path)
    If Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
    i = Cells(Rows.Count, 1).End(xlUp).Row + 1
    Else
    i = 1
    End If
    Next objUnterordner

    End Sub

    über Rückmeldungen zu meinem Problem würde ich mich freuen.
    Grüsse
    Andy

    Antworten
  26. @Marco
    Danke für deinen Hinweis, habe ich versucht umzusetzen. Die InputBox kommt jetzt. Aber bei Set objVerzeichnis = objFileSystem.GetFolder(strPfad) kommt Laufzeitfehler 91. Ich das ganze auch nochmal selbst eingegeben, bringt mich leider nicht weiter.
    Ich habe auch die Variante mit dem Auswählen versucht, komme da auch nicht weiter erhalte auch hier Laufzeitfehler 91
    Code sieht so aus:
    Sub DateienAuflisten()

    Dim lngZeile As Long
    Dim objFileSystem As Object
    Dim objVerzeichnis As Object
    Dim objDateienliste As Object
    Dim objDatei As Object
    Dim strPfad As String
    Dim strOrdnerpfad As String

    ‚Pfad in InputBox eingeben
    strPfad = InputBox(„Bitte Ordnerpfad eingeben:“)
    Set objVerzeichnis = objFileSystem.GetFolder(strPfad)

    ‚Pfad im Explorer Fenster auswählen
    With Application.FileDialog(msoFileDialogFolderPicker)
    .AllowMultiSelect = False
    .ButtonName = „auswählen“
    .Show
    strOrdnerpfad = .SelectedItems(1)
    End With

    Set objVerzeichnis = objFileSystem.GetFolder(strOrdnerpfad)

    Set objDateienliste = objVerzeichnis.Files

    lngZeile = 3

    For Each objDatei In objDateienliste
    If Not objDatei Is Nothing Then
    ActiveSheet.Cells(lngZeile, 1) = objDatei.Name
    lngZeile = lngZeile + 1
    End If
    Next objDatei

    Wo liegt der Fehler was mache ich bei meinen Überlegungen falsch?
    Grüsse
    Andy

    Antworten
  27. Hallo Marco
    Nun funktioniert es, einfach genial deine Seite und Hilfe.
    Ich noch eine Frage,eventuell hast du einen Lösungsansatz.
    Es gibt Daten die sehen so aus:
    03400.600_0001_EHA_Ort
    03400.600_0011_0014_EHA_Ort

    Das Ergebnis sollte so sein.

    03400.600_0001
    03400.600_0011_0014

    Ich habe folgende Code erstellt.
    Sub ZeichenketteBearbeiten()
    ‚Variablen definieren
    Dim Text As String
    Dim Auszug As String
    Dim i As Integer

    For i = 1 To 20
    Cells(i, 1).Value = Left(Cells(i, 1).Value, 19)

    Next i
    End Sub
    Dieser funktioniert auch, leider aber nur mit dem Wert 14 oder 19. Das Ziel wäre dieses Makro unten nach dem einlesen auszuführen.
    Gruss
    Andy

    Antworten
  28. Hallo Herr Schade,

    ich habe gerade mal die komplette Beitragsseite gelesen und muss sagen das ich es klasse finde das Sie sich über so lange Zeit damit auseinander setzen und Leuten helfen.
    Ich hoffe dass Sie mir auch weiterhelfen können.
    Im Grunde genommen ist das Skript genau was ich brauche, leider muss es auf einen Ordner bei uns im Betrieb zugreifen welcher #übergreifend benannt ist. Und den scheint VBA im Pfad so natürlich nicht zu akzeptieren. Wie kann ich VBA diesen Ordner entsprechen angeben?

    Pfad Wäre in Windows Q:\#übergreifend\Standort\Tag_Monat

    Ich habe jetzt ein wenig im Internet gesucht aber eine eindeutige Lösung dazu habe ich leider nicht finden können (da ich Google wahrscheinlich einfach nicht die richtige Frage gestellt habe)

    Mit freundlichen Grüßen

    Tobias

    Antworten
    • @Tobias: Ich kann das Problem nicht nachvollziehen. Bei mir lief ein Test mit einem # im Ordnername problemlos.

      Bitte vielleicht mal prüfen, ob der Ordnerpfad auch im Makro für das Auslesen der Unterordner geändert wurde.

      Sub DateienMitUnterordnernAuflisten()

      Set objVerzeichnis = objFileSystem.getfolder(„C:\Ordnername„)

      Antworten
  29. Hallo Herr Schade,

    danke für Ihre Antwort.

    Ich habe Ihnen gerade den Code schreiben wollen als mir dabei ein wirklich blöder Tippfehler aufgefallen ist.
    Ich entschuldige mich für Ihre mühen, jetzt klappt alles.

    Mit freundlichen Grüßen

    Cremer

    Antworten
  30. Hallo Herr Schade,
    ich verwende den Code zum auslesen bestimmter Ordner von Bildern. Funktioniert wunderbar. Wäre es auch noch möglich die HÖHE und die BREITE der Bilder in diesem Ordner auszulesen und in Spalte 5 bzw. 6 einzutragen?
    Ich habe es so probiert, klappt aber nicht, leider.
    Sub DateienH200()
    ‚https://www.makro-excel.de/2017/01/31/dateinamen-eines-verzeichnisses-mit-vba-auslesen-und-in-excel-schreiben/
    Dim lngZeile As Long
    Dim objFileSystem As Object
    Dim objVerzeichnis As Object
    Dim objDateienliste As Object
    Dim objDatei As Object
    Dim objPicture As Object

    Dim t As Double
    t = Timer

    With Worksheets(„H200“)
    Sheets(„H200“).Select
    ActiveSheet.Unprotect

    Range(„A4:A3200“).ClearContents
    Range(„A2“).Select

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Set objFileSystem = CreateObject(„scripting.FileSystemObject“)
    Set objVerzeichnis = objFileSystem.getfolder(„F:\Excel\KK\H\Bilder\200×200\“)
    Set objDateienliste = objVerzeichnis.Files
    lngZeile = 4

    For Each objDatei In objDateienliste
    ‚If Not objDatei Is Nothing And Not Right(LCase(objDatei.Name), 4) = „.jpg“ Then
    If Not objDatei Is Nothing And Right(LCase(objDatei.Name), 4) = „.jpg“ Then
    ‚If Not objDatei Is Nothing Then
    ActiveSheet.Cells(lngZeile, 1) = objDatei.Name

    ActiveSheet.Cells(lngZeile, 5) = objPicture.Height

    lngZeile = lngZeile + 1
    End If

    Next objDatei
    End With
    ActiveSheet.Protect

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

    MsgBox Timer – t & “ sec“, , „Makrolaufzeit“

    End Sub

    Antworten
  31. Hallo zusammen,

    ich verwende den ersten Code auf dieser Seite zum Auslesen von Dateinamen aus einem Verzeichnis und Schreiben in eine Exceltabelle. Alles funktioniert gut. Nun möchte ich die in die Tabelle geschriebenen Dateinamen ergänzen um ein vorangestelltes http://download.firma.de/download/
    Der ausgelesene Dateiname lautet liesmich.txt
    Als Ergebnis möchte ich dann den Link erzeugen: http://download.firma.de/download/liesmich.txt

    Habt Ihr eine Idee für mich
    Schöne Grüße Nick

    Sub DateienAuflisten()

    Dim lngZeile As Long
    Dim objFileSystem As Object
    Dim objVerzeichnis As Object
    Dim objDateienliste As Object
    Dim objDatei As Object

    Set objFileSystem = CreateObject(„scripting.FileSystemObject“)
    Set objVerzeichnis = objFileSystem.GetFolder(„\\testbetrieb.de\tb\tbShare\tbUpload\download“)
    Set objDateienliste = objVerzeichnis.Files

    lngZeile = 11

    For Each objDatei In objDateienliste
    If Not objDatei Is Nothing Then
    ActiveSheet.Cells(lngZeile, 20) = objDatei.Name
    lngZeile = lngZeile + 1
    End If
    Next objDatei

    End Sub

    Antworten
  32. Hallo Herr Schade,

    vielen, vielen Dank für dieses Makro. Das ist für mich wirklich sehr hilfreich. Ich bin absoluter VBA Anfänger und kenne mich hier leider überhaupt nicht aus. Ich war auf der Suche nach einem Makro, mit der ich alle Dateien aus meinem Ordner auflisten kann.
    In meiner Excel Datei möchte ich jetzt noch zusätzlich eine Spalte hinzufügen, in der ich dann immer manuell ein Datum eintragen kann (Datum, wann ich das Dokument verschickt habe).
    Ich habe versucht die Spalte einfach manuell hinzuzufügen. Wenn jetzt jedoch neue Dokumente in meinem Ordner abliegen und ich die Excel Liste aktualisiere, dann wird hier leider keine neue Zeile hinzugefügt, somit stimmen dann die Daten natürlich nicht mehr überein.
    Gibt es hier eine Möglichkeit, dass, sobald ein neues Dokument im Ordner ist und dieses in der Excel Liste aktualisiert wird, eine komplett neue Zeile eingefügt wird?
    Ideal wäre, dass ich dann filtern kann und somit sehe, für welche Dokumente noch kein Datum drinnen steht (diese Dokumente wurden ergo also noch nicht verschickt).

    Über Hilfe wäre ich wirklich sehr sehr dankbar 🙂

    Antworten
    • @Sonja: Das geht nicht ohne größere Anpassung. Das Makro kann nur Die Dateinamen eines Verzeichnisses auflisten. Nicht mehr und nicht weniger. Führt man das Makro mehrfach aus, werden bestehende Einträge natürlich wieder überschrieben. Es soll nur als Muster dienen. Wenn Sie bisher mit VBA nicht selbst programmieren, würde ich als Alternative empfehlen, die erneute Auflistung in einem getrennten Tabellenblatt durchzuführen. Dann können Sie anschließend über die Sverweis-Formelfunktion auch ohne VBA Makro die Spalten mit dem Datum aus dem ursprünglichen Tabellenblatt zuspielen. Danach können Sie noch die über kopieren und Werte einfügen die Formeln wieder entfernen. Überall wo der Eintrag #NV vorkommt, war der Dateiname dann in der ursprünglichen Auflistung nicht vorhanden.

      Antworten
  33. Hallo Herr Schade

    Ich habe den Code von Andy (vom 29. März 2020, 01:11) verwendet und dann noch versucht Ihre Zeile
    Set objFileSystem = CreateObject(„scripting.FileSystemObject“)
    an mehreren Stellen einzufügen, eber es kommt nur der Fehler wie von Andy erwähnt…
    Wo gehört Ihre Zeile hin?

    PS: Ich nehme an die 8 letzten Zeilen von Andys Code (vom 28. März, 7:07) müssen auch noch abschliessend drin stehen?

    besten Dank für Hilfe
    Adrian

    Antworten
    • @Adrian: Die Zeile muss natürlich zwischen der Deklaration der Objektvariablen „objFileSystem“ und der ersten Programmzeile in der die Variable genutzt wird eingefügt werden.

      Dim objFileSystem As Object

      Set objFileSystem = CreateObject(„scripting.FileSystemObject“)

      Set objVerzeichnis = objFileSystem.GetFolder(strPfad)

      Antworten
  34. Hallo zusammen,
    ich habe mir das Makro soweit anpassen können.
    Jedoch suche ich nach einer Möglichkeit, die es mir erlaubt, das das kopierte Verzeichnis mehrfach untereinander in der Spalte c steht.
    Eintragungen die bereits in den anderen Spalten gemacht wurden sollten dabei die gemachten Eintragungen behalten.

    Sprich wenn das Verzeichnis sich in der Spalte C mal verlängert oder aktualisiert, sollten sich die Werte die zum Dateinamen in den Nachbarspalten eingetragen wurden weiterhin passen.

    Sub Dateienliste()

    Dim lngZeile As Long
    Dim objFileSystem As Object
    Dim objVerzeichnis As Object
    Dim objDateienliste As Object
    Dim objDatei As Object
    Dim Qpfad As Object

    Dim i As Long

    Set Qpfad = ActiveSheet.Range(„N2“)

    Set objFileSystem = CreateObject(„scripting.FileSystemObject“)
    Set objVerzeichnis = objFileSystem.GetFolder(Qpfad)
    Set objDateienliste = objVerzeichnis.Files
    lngZeile = 3
    For Each objDatei In objDateienliste
    If Not objDatei Is Nothing Then
    ActiveSheet.Cells(lngZeile, 3) = objDatei.Name
    lngZeile = lngZeile + 1
    End If

    Next objDatei
    End Sub

    Antworten
    • @Dennis: Das habe ich jetzt nicht wirklich verstanden. In Spalte C wird der jeweilige Dateiname aufgelistet, nicht der Dateipfad. Der Dateipfad steht in Ihrem Beispielcode in Zelle N2. Wenn der Dateipfad jetzt jeweils in eine Zelle neben dem Dateinamen erscheinen soll, kann das ganz einfach mit einer zusätzlichen Programmzeile erfolgen.

      ActiveSheet.Cells(lngZeile, 4) = Qpfad.Value

      alternativ:

      ActiveSheet.Cells(lngZeile, 4) = ActiveSheet.Range("N2")
      Antworten
  35. Hallo,

    ganz herzlichen Dank für das Makro. Es hat mir enorm weitergeholfen!

    Ich hatte auch das Problem, dass beim Durchsuchen der Unterodner in der ersten Zeile erst einige Werte überschrieben wurden bevor dann das Auflsiten funktionierte. Ich habe das gelöst, indem ich den ersten Wert in die zweite Zeile schreibe.

    Ich vermute, dass Problem taucht auf, weil ich keine Dateien in dem obersten Verzeichnis habe und nur jeweils eine in den ersten Unterordnern, die durchsucht werden. Dadurch wird

    Cells(Rows.Count, 1).End(xlUp).Row > 1

    am Anfang nicht sofort erfüllt und es wird die erste Zeile wird erneut beschrieben. Ich hoffe das hilft, das Problem zu indentifizieren und sorry, falls meines Vermutung quatsch ist.

    Viele Grüße
    Ute

    Antworten
    • @Ute: Vielen Dank für den Hinweis mit den Ordnern ohne Dateien oder mit nur einer Datei. Das war genau der Hinweis, der mir geholfen hat den Bug nachstellen zu können.

      Der Fehler steckte in der Zeile:

      i = 1

      Richtig ist natürlich

      i = 2

      da die Überschrift in Zeile 1 nicht überschrieben werden soll. Den Bericht und die Mustermappe werde ich entsprechend aktualisieren.

      Antworten
  36. Hallo,

    kann man das Makro so umschreiben, dass die Dateiliste in eine Dropdown-Liste eingelesen wird, so dass man eine Datei auswählen kann, die dann in einem neuen Tabellenblatt geöffnet wird?

    Lieben Dank für einen Hinweis
    Dominik

    Antworten
  37. Moin,

    Vorab, super geiles Makro. Es funktioniert bei mir Lokal absolut perfekt. Nun Möchte ich damit aber ein Netzlaufwerk auslesen und das funktioniert leider nicht? Ich habe es mit einem Laufwerkspfad „H:\XXX\XXX“ probiert, sowie mit einem UTC-Pfad. Gibt es dafür eine Erklärung?

    Ich habe verschieden Netz-Pfade getestet, auch sind natürlich Lese- und Schreibrechte vorhanden.

    Antworten
      • So, die Pfade und die Berechtigung war nicht das Problem. Ich wollte es so haben, das nur bestimmte Dateien gefunden werden, mit PDF klappte das problemlos. Wenn ich allerdings nur nach „.abcdefgh“ Dateien Suche, geht das nicht. Deswegen lasse ich ihn nun nach allen Dateien in dem entsprechenden Ordner suchen und schließe PDF aus. Zum Glück liegen dort nur diese beiden Dateien Typen. „.abcdefh“ ist natürlich symbolisch, entspricht aber der tatsächlichen String-Länge nach dem Punkt. Ungewöhnlich, aber daran liegt es wohl vermutlich.

        Die nächste Herausforderung liegt nun für mich darin, auch noch ein entsprechendes Datum der Datei in eine Zeile rauszuschreiben.

        Antworten
        • Und auch das konnte ich Aufgrund der Kommentare hier problemlos lösen. Wirklich super 🙂 Am ende lasse ich es per Makro noch so sortieren, das die aktuellste Datei immer ganz oben steht.

          Antworten
        • @helmded: Die Dateiendung „.abcdefgh“ umfasst inklusive Punkt 9 Zeichen. Daher müsste dann der Teil

          Right(LCase(objDatei.Name), 4) = ".jpg"

          in

          Right(LCase(objDatei.Name), 9) = ".abcdefgh"

          geändert werden.

          Antworten
  38. Hallo Herr Schade, vielen Dank für das Makro. Lässt sich das Makro so abändern, dass bei dem Dateipfad auch alle leeren Verzeichnisse mit dargestellt werden?

    Antworten
  39. Hallo,
    bei mir (Excel 2019) funktioniert das Auslesen von Unterordnern nur teilweise. Ich habe 450 Unterordner und es werden nur 299 ausgelesen. Dazu kommt die Meldung ‚Laufzeitfehler 70, Zugriff verweigert‘.
    Wie lässt sich das beheben, so dass alle 450 ausgelesen werden?

    Antworten
    • @Erik: Das Tool kann natürlich nur die Ordner auslesen, auf die auch eine Zugriffsberechtigung besteht. Zugriffsberechtigungen für die Ordner, müssen vom Administrator für die benötigten Ordner eingerichtet werden.

      Antworten

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.