Verzeichnisstruktur auslesen mit Excel Makro

speedyjoe

Rear Admiral
Registriert
Juli 2005
Beiträge
5.511
Hallo allerseits

Um Verzeichnisstrukturen zu analysieren habe ich im Internet nach Makros recherchiert und eines gefunden, dass meinen Vorstellungen entspricht. Jeder Unterordner wird nämlich in einer separaten Spalte festgehalten.
Option Explicit

Sub Main()
Dim strStartPath As String, lngZeile As Long, intLevel As Integer, objFS As Object, objFolder As Object

strStartPath = "d:\musik"
lngZeile = 1
intLevel = 1

Set objFS = CreateObject("scripting.filesystemobject")
Set objFolder = objFS.GetFolder(strStartPath)
Tree objFolder, lngZeile, intLevel
Set objFolder = Nothing
Set objFS = Nothing
End Sub

Sub Tree(ByVal objFolder As Object, ByRef lngZeile As Long, ByVal intLevel As Integer)
Dim objSubFolder As Object

For Each objSubFolder In objFolder.subfolders
Cells(lngZeile, intLevel).Value = objSubFolder.Name
lngZeile = lngZeile + 1
Tree objSubFolder, lngZeile, intLevel + 1
Next
End Sub
Jetzt hätte ich allerdings noch zwei Extrawünsche.:D Ich würde gerne auch die Dateien miteinbeziehen und dass es in einer separaten Spalte festhält, ob es sich um einen Ordner oder um eine Datei handelt. Meine Schwierigkeit ist, dass ich von der Programmierung keine Ahnung habe und ich somit auch nicht weiss, wie ich meine "Sonderwünsche" in diesen Code einbauen soll.
Ich beabsichtige mit diesem Makro die Fileablage einer Organisation unter dem Aspekt von Records Management zu analysieren. Ich würde es mir dann dafür mit benutzerdefinierten Formatierungen einfärben. Und ich denke, dass die Darstellung in dieser Baumstruktur für mich sehr nützlich sein könnte.

Ich danke euch schon vielmals für eure Unterstützung.

Gruss, speedyjoe

P.S. Dass bei StartPath d:\musik steht, hat einfach damit zu tun, dass ich es zu Hause schon mal erfolgreich getestet habe. Der müsste natürlich vor Ort angepasst werden. Ich nehme mal an, dass die Eingabe eines Pfades für ein Netzlaufwerk kein Problem darstellen sollte, oder?
 
Feigling :D
Mit was würdest du sonst so eine Aufstellung darstellen?

Ich würde gerne auch die Dateien miteinbeziehen
Dann würde es aber wohl doch zu unübersichtlich.
Dort wo der Ordner in die ›nächste‹ Zelle geschrieben wird kann einfach eine Info »Ordner« mit abgelegt werden. Und an selber Stelle… nach rechts hin, sonst ist die Übersicht wirklich im Eimer! - kann man die Files mit einer analogen For-Funktion (For Each Datei in Folders.Files) abklappern.

CN8
 
Da wäre ich tatsächlich gespannt auf die alternativen Vorschläge.

Ich hab mir gedacht, ich könnte es am Schluss so darstellen, wie im angehängten Bild. Das Bild ist nur ein schnelles fingiertes Beispiel. Mir scheint das ein gangbarer Weg zu sein, um die hierarchische Struktur einer Fileablage zu verstehen, falls überhaupt sowas wie einen hierarchischen Aufbau gibt. Die Dateien sollen mir helfen, ab wann "Dossiers" gebildet werden. Also ab wann in der Registratur die Ordner dazu da sind, eine Mappe zu unterteilen, um es mal so zu erklären.
Das wäre, CN8, durchaus eine Möglichkeit. Und was müsste ich da programmieren?
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    391,3 KB · Aufrufe: 527
Zuletzt bearbeitet:
Vielen Dank für die bisherige Unterstützung. Ich bin jetzt ein gutes Stück weitergekommen. Ich habe ein Marko gefunden, dass für mich in die richtige Richtung geht. Für die folgenden Schritte habe ich auch noch eine Lösung gefunden. Das Makro stellt mir die Verzeichnisstruktur so dar, wie ich es gern hätte. Das Einzige was mich stört, ist, dass bei den Dateien der Verzeichnispfad angegeben wird. Z.B. "C:\LeaugeofLegends\Data\LoL.exe" anstatt einfach "LoL.exe."
Was müsste ich im Code ändern, damit es mir nur den Dateinamen anzeigt. Danke im Voraus für die Antwort.
Option Explicit

Private zeile&
Private pfadTiefeBasis&
Private fso As Object

Sub Auflisten()
Dim sh As Object
Dim shFolder As Object
Dim fsoFolder As Object
Dim x As Object
Dim y As Object
Set sh = CreateObject("Shell.Application")
With sh
Set shFolder = .BrowseForFolder(0&, "Inhaltsverzeichnis erstellen für:", 0, "d:\")
End With

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsoFolder = fso.GetFolder(shFolder.self.Path)
Set shFolder = Nothing
Set sh = Nothing

Cells.Clear
Cells.NumberFormat = "@"

zeile = 2
pfadTiefeBasis = UBound(Split(fsoFolder.Path, "\"))
ordnerAusgeben fsoFolder
End Sub

Private Sub ordnerAusgeben(ByVal f As Object) ' FSO.Folder Object
Dim pfadTiefe&
Dim verz, datei

zeile = zeile + 1
pfadTiefe = UBound(Split(f.Path, "\")) - pfadTiefeBasis + 2
Cells(zeile, pfadTiefe) = f.Name
Cells(zeile, pfadTiefe).Font.Bold = True
For Each datei In f.Files
zeile = zeile + 1
Cells(zeile, pfadTiefe + 1) = datei
Next
For Each verz In f.SubFolders
ordnerAusgeben verz
Next

End Sub
 
Cells(zeile, pfadTiefe) = f.Name
Cells(zeile, pfadTiefe + 1) = datei
Ich weiß aus dem Stegrif nicht was der Standard von «datei» ist; Pfad? Name? Siehe f.name. Vielleich reicht das?

Und - woher bekommst du solch unleabaren Code der keine fürs Auge verfolgbare Struktur hat, Aribalern wild DIMt und sich nicht um sprechende Dateinamen bemüht? In 4 Wochen fängt man an sich wieder voll diurchzuquälen was das tun soll.

CN8
 
Ja, der Zusatz .name hat schon gereicht. Konnte ich mittlerweile auch herausfinden. Trotzdem danke ich dir für die Nachricht.
Den Code habe ich mithilfe Google recherchiert. Und da ich vielleicht noch irgendetwas vom Code verstehe, aber sicher nicht wüsste, wie man sowas programmieren kann, ist es für mich zweitrangig, ob ich mich vier Wochen später durch den Code quälen kann. Es reicht mir, dass sein Einsatzzweck klar ist. Mehr kann ich mit meinen vernachlässigbaren Programmierkenntnissen nicht leisten.
 
Zurück
Oben