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

VBA Macro um Inhalt eines Ordners auszulesen

Forumthread: VBA Macro um Inhalt eines Ordners auszulesen

VBA Macro um Inhalt eines Ordners auszulesen
29.01.2016 17:11:10
André
Hallo zusammen, mein erster Beitrag bei euch. Hoffe hier kann mir jemand weiterhelfen bzw. Tipps geben:
Folgender Sachverhalt:
Ich synchronisiere über mehrere Rechner hinweg Daten, eine xlsm fungiert dabei u.a. als Inhaltsverzeichnis. Um weitere Informationen über den Ordnerinhalt zu bekommen, habe ich ein VBA Makro der xlsm hinzugefügt, welche mir relevante Informationen anzeigt. Das funktioniert soweit ganz gut, sofern ich einen absoluten Ordnerpfad Const STRFOLDER As String = "D:\Projekte_Sync\" angebe; da ich jedoch wie o.g. die Daten über mehrere Rechner hinweg synchronisiere - sich dementsprechend die Pfade je nach Rechner unterscheiden - würde ich als Pfad gerne einen relativen Bezug angeben (ausgehend vom Ordner der Excel).
Das VBA Makro lautet wie folgt:
Public Sub Auto_Open()
Const STRFOLDER As String = "D:\Projekte_Sync\"
Dim objShell As Object, objFolder As Object
Dim bytIndex As Byte, intColumn As Integer, lngRow As Long
Dim varName, arrHeaders(37)
If Dir(STRFOLDER, 16) = "" Then
MsgBox "Der Ordner " & STRFOLDER & " wurde nicht gefunden!", 64, "Hinweis"
Exit Sub
End If
Application.ScreenUpdating = False
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(STRFOLDER)
intColumn = 1
For bytIndex = 0 To 37
arrHeaders(bytIndex) = objFolder.GetDetailsOf(varName, bytIndex)
Cells(1, intColumn + bytIndex) = arrHeaders(bytIndex)
Next
Rows(1).Font.Bold = True
lngRow = 2
For Each varName In objFolder.Items
For bytIndex = 0 To 37
Cells(lngRow, intColumn + bytIndex) = objFolder.GetDetailsOf(varName, bytIndex)
Next
lngRow = lngRow + 1
Next
Columns.AutoFit
Set objShell = Nothing
Set objFolder = Nothing
Application.ScreenUpdating = True
End Sub

Wie kann ich in der o.g. Zeile den Pfad für meine Bedürfnisse anpassen (habe hinsichtlich VBA nur rudimentäre Kenntnisse)?
Vielen Dank fürs Lesen,
André

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Macro um Inhalt eines Ordners auszulesen
29.01.2016 17:54:55
Nepumuk
Hallo,
an den Pfad in dem sich die Excelmappe befindet kommst du so:
Thisworkbook.Path
Gruß
Nepumuk

AW: VBA Macro um Inhalt eines Ordners auszulesen
29.01.2016 18:51:55
André
Hallo Nepumuk,
vielen Dank für deine Antwort. Damit habe ich es schon probiert, leider erhalte ich - sofern ich deinen Vorschlag folge - lediglich eine Warnung: "Fehler beim Kompelieren. Konstanter Ausdruck erforderlich".
Soweit ich es bisher verstanden habe, ist es nicht möglich die Konstante (Const) mit einer Variable zu "bedienen".

Anzeige
AW: VBA Macro um Inhalt eines Ordners auszulesen
29.01.2016 19:32:33
Nepumuk
Hallo,
so:
Public Sub Auto_Open()
    Dim STRFOLDER As String
    Dim objShell As Object, objFolder As Object
    Dim bytIndex As Byte, intColumn As Integer, lngRow As Long
    Dim varName, arrHeaders(37)
    STRFOLDER = ThisWorkbook.Path & "\"
    If Dir(STRFOLDER, 16) = "" Then
        MsgBox "Der Ordner " & STRFOLDER & " wurde nicht gefunden!", 64, "Hinweis"
        Exit Sub
    End If
    Application.ScreenUpdating = False
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(STRFOLDER)
    intColumn = 1
    For bytIndex = 0 To 37
        arrHeaders(bytIndex) = objFolder.GetDetailsOf(varName, bytIndex)
        Cells(1, intColumn + bytIndex) = arrHeaders(bytIndex)
    Next
    Rows(1).Font.Bold = True
    lngRow = 2
    For Each varName In objFolder.Items
        For bytIndex = 0 To 37
            Cells(lngRow, intColumn + bytIndex) = objFolder.GetDetailsOf(varName, bytIndex)
        Next
        lngRow = lngRow + 1
    Next
    Columns.AutoFit
    Set objShell = Nothing
    Set objFolder = Nothing
    Application.ScreenUpdating = True
End Sub

Gruß
Nepumuk

Anzeige
AW: VBA Macro um Inhalt eines Ordners auszulesen
29.01.2016 20:00:02
André
Nochmal danke für deine schnellen Antworten!
Habe ich auch schon ausprobiert, ich bekomme dann jedoch immer den Fehler "Laufzeitfehler '91' Objektvariable oder With-Blockvariable nicht festgelegt".

AW: VBA Macro um Inhalt eines Ordners auszulesen
30.01.2016 09:43:01
Nepumuk
Hallo,
in welcher Zeile?
Gruß
Nepumuk

AW: VBA Macro um Inhalt eines Ordners auszulesen
30.01.2016 12:30:37
André
Hallo Nepumuk.
Der Fehler bezieht sich auf

arrHeaders(bytIndex) = objFolder.GetDetailsOf(varName, bytIndex)

Anzeige
AW: VBA Macro um Inhalt eines Ordners auszulesen
31.01.2016 11:19:13
Nepumuk
Hallo,
dann gibt es den Ordner nicht.
Gruß
Nepumuk

AW: VBA Macro um Inhalt eines Ordners auszulesen
31.01.2016 13:54:09
André
Hallo Nepumuk.
Aber wie kann das denn sein? Wenn ich die Excel irgendwo ablege, so gibt es doch immer einen Pfad. Habe es in diversen Ordnern versucht und der Fehler bleibt immer der gleiche. Wenn ich jedoch in das VBA Bearbeitungsfenster gehe und die Variable STRFOLDER mit dem Cursor "überfliege" so zeigt er mich auch den richtigen Pfad an (z.B. C:\Test).
Gruß,
André

Anzeige
AW: VBA Macro um Inhalt eines Ordners auszulesen
31.01.2016 14:10:46
André
Hab es gelöst. Wenn Variant benutzt wir

Public Sub Auto_Open()
Dim STRFOLDER As Variant

läuft es ohne Probleme.
Nochmals tausend Dank Nepumuk, dass du etwas von deiner Zeit für mich entbehren konntest. Tolles Forum.
Anbei noch das funktionsfähige Makro:
Public Sub Auto_Open()
Dim STRFOLDER As Variant
Dim objShell As Object, objFolder As Object
Dim bytIndex As Byte, intColumn As Integer, lngRow As Long
Dim varName, arrHeaders(37)
STRFOLDER = ThisWorkbook.path & "\"
If Dir(STRFOLDER, 16) = "" Then
MsgBox "Der Ordner " & STRFOLDER & " wurde nicht gefunden!", 64, "Hinweis"
Exit Sub
End If
Application.ScreenUpdating = False
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(STRFOLDER)
intColumn = 1
For bytIndex = 0 To 37
arrHeaders(bytIndex) = objFolder.GetDetailsOf(varName, bytIndex)
Cells(1, intColumn + bytIndex) = arrHeaders(bytIndex)
Next
Rows(1).Font.Bold = True
lngRow = 2
For Each varName In objFolder.Items
For bytIndex = 0 To 37
Cells(lngRow, intColumn + bytIndex) = objFolder.GetDetailsOf(varName, bytIndex)
Next
lngRow = lngRow + 1
Next
Columns.AutoFit
Set objShell = Nothing
Set objFolder = Nothing
Application.ScreenUpdating = True
End Sub

Beste Grüße aus Nürnberg,
André
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

VBA Makro zum Auslesen des Inhalts eines Ordners


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und erstelle ein neues Arbeitsblatt oder eine neue Arbeitsmappe.

  2. Aktiviere die Entwicklertools. Gehe zu Datei > Optionen > Menüband anpassen und aktiviere die Entwicklertools.

  3. Öffne den VBA-Editor. Klicke auf Entwicklertools > Visual Basic.

  4. Füge ein neues Modul hinzu: Rechtsklicke auf VBAProject (DeineMappe) und wähle Einfügen > Modul.

  5. Kopiere und füge den folgenden Code ein:

    Public Sub Auto_Open()
       Dim STRFOLDER As Variant
       Dim objShell As Object, objFolder As Object
       Dim bytIndex As Byte, intColumn As Integer, lngRow As Long
       Dim varName, arrHeaders(37)
       STRFOLDER = ThisWorkbook.Path & "\"
       If Dir(STRFOLDER, 16) = "" Then
           MsgBox "Der Ordner " & STRFOLDER & " wurde nicht gefunden!", 64, "Hinweis"
           Exit Sub
       End If
       Application.ScreenUpdating = False
       Set objShell = CreateObject("Shell.Application")
       Set objFolder = objShell.Namespace(STRFOLDER)
       intColumn = 1
       For bytIndex = 0 To 37
           arrHeaders(bytIndex) = objFolder.GetDetailsOf(varName, bytIndex)
           Cells(1, intColumn + bytIndex) = arrHeaders(bytIndex)
       Next
       Rows(1).Font.Bold = True
       lngRow = 2
       For Each varName In objFolder.Items
           For bytIndex = 0 To 37
               Cells(lngRow, intColumn + bytIndex) = objFolder.GetDetailsOf(varName, bytIndex)
           Next
           lngRow = lngRow + 1
       Next
       Columns.AutoFit
       Set objShell = Nothing
       Set objFolder = Nothing
       Application.ScreenUpdating = True
    End Sub
  6. Schließe den VBA-Editor und kehre zu Excel zurück.

  7. Speichere die Arbeitsmappe als .xlsm, um das Makro zu aktivieren.

  8. Führe das Makro aus: Gehe zu Entwicklertools > Makros, wähle Auto_Open und klicke auf Ausführen.


Häufige Fehler und Lösungen

  • Laufzeitfehler '91': Dieser Fehler tritt auf, wenn die Objektvariable nicht festgelegt ist. Stelle sicher, dass der Ordner, der mit STRFOLDER angegeben wird, existiert.

  • Konstanter Ausdruck erforderlich: Wenn Du Const STRFOLDER verwendest, ersetze es durch Dim STRFOLDER As Variant, um die Zuweisung von ThisWorkbook.Path zu ermöglichen.

  • Ordner nicht gefunden: Vergewissere Dich, dass der Pfad korrekt ist und der Ordner tatsächlich vorhanden ist. Du kannst den Pfad im Debugger überprüfen.


Alternative Methoden

Wenn Du nicht mit VBA arbeiten möchtest, kannst Du auch Power Query verwenden, um den Inhalt eines Ordners auszulesen. Gehe zu Daten > Daten abrufen > Aus Datei und wähle den Ordner aus, um die Dateien zu importieren. Dies ist besonders nützlich, wenn Du keine Programmierkenntnisse hast.


Praktische Beispiele

Hier ein Beispiel, wie Du den Code anpassen kannst, um zusätzliche Informationen anzuzeigen:

arrHeaders(0) = "Name"
arrHeaders(1) = "Größe"
arrHeaders(2) = "Änderungsdatum"

Mit diesen Anpassungen kannst Du spezifische Details zu den Dateien im Ordner auslesen.


Tipps für Profis

  • Nutze Objektvariablen, um die Performance zu verbessern, indem Du weniger auf den Worksheet-Zugriff zugreifst.

  • Arbeite mit Fehlerbehandlungsroutinen, um das Makro robust zu gestalten. Verwende On Error Resume Next oder On Error GoTo Fehlerbehandlung.

  • Experimentiere mit der shell.application namespace, um weitere Details zu erhalten, die möglicherweise nicht in der Standardansicht enthalten sind.


FAQ: Häufige Fragen

1. Wie kann ich den Pfad zu einem anderen Ordner ändern?
Du kannst den Pfad in der Zeile STRFOLDER = ThisWorkbook.Path & "\" anpassen, indem Du den gewünschten Ordnerpfad direkt angibst.

2. Kann ich das Makro auch in Excel Online verwenden?
Leider unterstützt Excel Online keine VBA-Makros. Du musst die Desktop-Version von Excel verwenden.

3. Was ist CreateObject("Shell.Application")?
Dies ist eine Methode, um auf die Windows-Shell-Funktionen zuzugreifen. Du kannst damit auf Dateiinformationen zugreifen und verschiedene Operationen auf Dateien und Ordnern durchführen.

4. Wie viele Details kann ich mit GetDetailsOf abrufen?
Standardmäßig kannst Du bis zu 38 Detailinformationen abrufen, die durch den Index 0 bis 37 adressiert werden.

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