Sitemap  · Français  · English  · Deutsch
Home » Blog » Artikel

Artikel

Verzeichnisstruktur mit VBA auflisten

31.01.2009

Nachtrag bzw. Aktualisierung vom 05.11.2010: Eine neue Variante des Tools inklusive Beschreibung der Funktionen und dem Code ist in meinem weiteren Blog Excel-Ticker zu finden. Verzeichnisse und Dateien mit Windows API Funktionen in Excel auflisten.

In Foren taucht ab und zu die Frage auf, wie alle Unterverzeichnisse Ordners von der Festplatte - z.B. von C:\Programme - in Excel VBA ausgelesen und in einer Tabelle aufgelistetet werden können. Es gibt hierfür zwei Lösungen. Eine, die sich auf das Windows Scripting Modell stützt und eine weitere, die das Windows API nutzt. Wir werden letztere Variante nutzen.



Wenn Sie möchten, können Sie gerne unsere Beispieldatei mit dem Code herunterladen und für Ihre Zwecke anpassen.

Nun, was macht der Code? Zunächst werden Standard-Konstanten für die Windows API - Application Programming Interface - definiert. Übrigens, eine Liste der API Funktionen finden Sie bei MSDN, allerdings in Englisch. Anschließend werden die API Funktionen "importiert", so dass wir diese auch aufrufen können. Die Funktion mlfpGetDirectories() ermittelt in einer Schleife alle Objekte (Dateien, Verzeichnisse, ...) in dem Startordner. Zudem prüft die Funktion, ob dieses Objekt ein Ordner ist und ruft sich selbst rekursiv auf. Jeder Ordner wird in die Ausgabetabelle geschrieben, wobei ein Zähler die aktuelle Tiefe mitführt.
'
' Copyright  : 2009 by Maninweb.de - www.excelsharp.de
'
' Version    : 0100
'
' Disclaimer : Sie können diesen Code in Ihren Projekten
'              frei verwenden.
'              Wir würden uns freuen, wenn Sie diesen
'              Hinweis auf den Autor beibehalten würden.
'
' .......................................................
  
' Optionen...
  
  Option Explicit
  
' Konstanten...
  
  Const MAX_PATH                    As Long = 259
  
  Const FILE_ATTRIBUTE_ARCHIVE      As Long = &H20
  Const FILE_ATTRIBUTE_COMPRESSED   As Long = &H800
  Const FILE_ATTRIBUTE_DIRECTORY    As Long = &H10
  Const FILE_ATTRIBUTE_HIDDEN       As Long = &H2
  Const FILE_ATTRIBUTE_NORMAL       As Long = &H80
  Const FILE_ATTRIBUTE_READONLY     As Long = &H1
  Const FILE_ATTRIBUTE_SYSTEM       As Long = &H4
  Const FILE_ATTRIBUTE_TEMPORARY    As Long = &H100
  
' Flags...
  
  Private Const cAny                As Long = 0
  Private Const cDirectories        As Long = 1
  Private Const cFiles              As Long = 2
  
' Typen...
  
  Private Type FILETIME
    
    dwLowDateTime                   As Long
    dwHighDateTime                  As Long
  
  End Type
  
  Private Type WIN32_FIND_DATA
    
    dwFileAttributes                As Long
    ftCreationTime                  As FILETIME
    ftLastAccessTime                As FILETIME
    ftLastWriteTime                 As FILETIME
    nFileSizeHigh                   As Long
    nFileSizeLow                    As Long
    dwReserved0                     As Long
    dwReserved1                     As Long
    cFileName                       As String * MAX_PATH
    cAlternate                      As String * 14
  
  End Type
  
' API Importe...
  
  Private Declare _
          Function FindFirstFile Lib "kernel32" _
          Alias "FindFirstFileA" ( _
          ByVal lpFileName As String, _
                lpFindFileData As WIN32_FIND_DATA) As Long
          
  Private Declare _
          Function FindNextFile Lib "kernel32" _
          Alias "FindNextFileA" ( _
          ByVal hFindFile As Long, _
                lpFindFileData As WIN32_FIND_DATA) As Long
          
  Private Declare _
          Function FindClose Lib "kernel32" ( _
          ByVal hFindFile As Long) As Long
  
' Verzeichnislister...
  
  Private Function mlfpGetDirectories(Book As String, _
                                      Sheet As String, _
                                      Column As Long, _
                                      Line As Long, _
                                      Root As String, _
                                      Start As Boolean) As Long
    
    Dim b As Boolean
    Dim c As Long
    
    Dim h As Long
    
    Dim i As Long
    Dim j As Long
    Dim k As Long
    
    Dim t As WIN32_FIND_DATA
    
    Dim f As String
    Dim r As String
    
'   Initialisieren...
    
    c = 0
    i = Line
    j = Column
    r = Root
    h = FindFirstFile(r & "\" & "*.*", t)
    
'   Start...
    
    If Start Then
      
'     Ablegen...
      
      Application.Workbooks(Book).Worksheets(Sheet). _
      Cells(i, j).Value = r
      
'     Zähler...
      
      i = i + 1
      j = j + 1
      
    End If
    
'   Prüfen...
    
    If h = 0 Then
    
      Exit Function
    
    End If
      
    Do
      
'     Finden...
      
      f = Left(t.cFileName, InStr(t.cFileName, Chr(0)) - 1)
      b = CBool((t.dwFileAttributes And _
                 FILE_ATTRIBUTE_DIRECTORY) <> _
                 FILE_ATTRIBUTE_DIRECTORY)
      
'     Prüfen...
      
      If Not b Then
        
'       Prüfen...
        
        If CBool(f <> ".") And CBool(f <> "..") Then
          
'         Ablegen...
          
          Application.Workbooks(Book).Worksheets(Sheet). _
          Cells(i, j).Value = "'" & f
          
'         Rekursion...
          
          i = mlfpGetDirectories(Book, Sheet, j + 1, i + 1, _
              r & "\" & f, False)
          
        End If
        
      End If
      
    Loop While FindNextFile(h, t)
    
'   Schließen...
    
    FindClose h
    
'   Return...
    
    mlfpGetDirectories = i
    
  End Function
  
' Testfunktion...
  
  Public Sub mlfpGetDirectoriesTester()
    
'   Simple Abfrage...
    
    If Len(ThisWorkbook.Worksheets(1). _
       Cells(14, 2).Value) > 0 Then
    
'     Löschen...
      
      ThisWorkbook.Worksheets("Verzeichnisse"). _
      Range("$A$1:$IV$32000").ClearContents
      
'     Aufrufen...
      
      mlfpGetDirectories ThisWorkbook.Name, "Verzeichnisse", _
      1, 1, ThisWorkbook.Worksheets("Start"). _
      Cells(14, 2).Value, True
      
'     Ansicht...
      
      ThisWorkbook.Worksheets("Verzeichnisse").Activate
      
    End If
    
  End Sub