Ordnerstruktur auslesen - Sortierung falsch

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Madde.

    Ordnerstruktur auslesen - Sortierung falsch

    Hallo Zusammen,

    mit angehangenem Code wird eine gesamte Ordnerstruktur inklusive Unterordner eingelesen und jeweils in Spalten angezeigt.
    Soweit so gut. Funktioniert auch wunderbar.
    Heute habe ich gemerkt, dass es Schwierigkeiten mit der Sortierung von Zahlen gibt.

    Ordnerstruktur im Explorer Oberordner/Unterordner

    1
    2
    1 in 2
    10
    11
    1 in 11
    100

    Sortierung nach dem Einlesen in Excel

    1
    10
    100
    11
    1 in 11
    2
    1 in 2

    Wie und wo kann ich im Code festlegen, dass die eingelesenen Werte genau so dargestellt werden wie im Explorer?
    Danke im voraus!


    Quellcode

    1. Public Sub OrdnerListen_Start()
    2. Dim fso As Object
    3. With ActiveSheet
    4. .UsedRange.ClearContents
    5. Set fso = CreateObject("Scripting.FileSystemObject")
    6. Call OrdnerListen(fso, "E:\Test", .Range("A1")) ' Pfad anpassen!
    7. Set fso = Nothing
    8. End With
    9. End Sub
    10. Private Sub OrdnerListen(fso As Object, Ordnerangabe As String, rng As Range, Optional Zeile As Long, Optional Spalte As Long)
    11. Dim o, uo
    12. Set o = fso.GetFolder(Ordnerangabe)
    13. rng.Offset(Zeile, Spalte).Value = o.Name
    14. Zeile = Zeile + 1
    15. For Each uo In o.SubFolders
    16. Spalte = Spalte + 1
    17. Call OrdnerListen(fso, uo.Path, rng, Zeile, Spalte)
    18. Spalte = Spalte - 1
    19. Next
    20. Set o = Nothing
    21. Set uo = Nothing
    22. End Sub
    Alter Hut. Alles Strings. Und da wird Zeichen für Zeichen verglichen. Und wenn Du "4321" mit "1234567890" vergleichst. Dann kommt - weil 1 vor 4 kommt - die Reihenfolge raus, die Du nicht erwartest. Da müsstest Du schon die Zahl-Dateinamenteile in Integer umwandeln und dann sortieren. Etwas kompliziert, wenn es die Dateinamen neben der Extension nicht nur als Zahlen bestehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed
    Danke Dir erstmal.
    Vielleicht hätte ich erwähnen sollen, dass ich nicht besonders bewandert in VBA oder generell dem Programmieren bin.
    Dateinamen werden im Übrigen nicht dargestellt, nur rein die Ordnerstruktur mit den jeweiligen Unterordnern.
    Könntest Du mir einen Ansatz liefern, wie ich den Code anpassen müsste?
    Danke!
    Hallo Zusammen,

    sollte es mit dem aufgeführten Code nicht möglich sein, hat vlt jemand eine alternative Einlese-Routine, welche ich nutzen könnte.
    Wichtig wäre, dass die Verzeichnisstruktur der Ordner/Unterordner versetzt in den Spalten aufgelistet werden, ergo wie eine Baumstruktur und dann eben so sortiert, wie im Explorer gelistet.
    Dateien sollen nicht angezeigt werden.

    Wäre Klasse, wenn Ihr mir helfen könntet.

    MfG Madde
    Im Explorer bekommst du seit Windows 10 eine numerische Sortierreihenfolge.
    Das war übrigens nicht immer so und kann auch verändert werden.
    tenforums.com/tutorials/91417-…xplorer-windows-10-a.html


    In deinem Fall bist du auf die Lesereihenfolge von FileSystemObject.GetFolder angewiesen.
    Das kannst du nicht beeinflussen.
    Du kannst aber die eingelesene Collection SubFolders nach deinen Wünschen sortieren, bevor du sie verarbeitest.

    Oder du befüllst die Zellen mit einer Hilfsspalte, dass alle Pfade numerisch untereinander stehen und du auf die Zellen einen numerischen Sort-Vorgang anwenden kannst.

    Oder du akzeptierst es, wie es ist.
    Wo ist dabei das Problem?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Wo ist dabei das Problem?


    Die Verzeichnisstruktur dient mir als Vorlage für den Druck von Registerblättern zwischen diversen Unterlagen damit diese nicht per Hand erstellt werden müssen.
    Hierbei ist daher wichtig, dass die Reihenfolge vom ersten bis zum letzten Ordner, inklusive der Unterordner stimmt, um sie komplett drucken zu können.

    MfG Madde
    Dann musst du deinen eigenen Sortiermechanismus einbauen, bevor du die Daten verarbeitest.
    Ich will ja mal nicht so sein.
    Ersetze deinen Code gegen folgenden:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim fso As Object
    3. Public Sub OrdnerListen_Start()
    4. Set fso = CreateObject("Scripting.FileSystemObject")
    5. ActiveSheet.UsedRange.ClearContents
    6. ListFolders "D:\Test", ActiveSheet.Range("A1")
    7. End Sub
    8. Sub ListFolders(ByVal Path As Variant, ByRef c As Range)
    9. Dim p
    10. If Not IsObject(Path) Then Set Path = fso.GetFolder(Path) 'string to object
    11. c.Value = Path.Name
    12. Set c = c.Offset(1, 1)
    13. For Each p In OrderedList(Path.SubFolders)
    14. ListFolders p, c
    15. Next
    16. Set c = c.Offset(0, -1)
    17. End Sub
    18. Function OrderedList(ByVal List As Object) As Collection
    19. Dim coll As New Collection, p1 As Variant, i As Integer
    20. For Each p1 In List
    21. If coll.Count < 1 Then
    22. coll.Add p1
    23. Else
    24. For i = 1 To coll.Count
    25. If Val(p1.Name) < Val(coll(i).Name) Then
    26. coll.Add p1, Before:=i
    27. Exit For
    28. End If
    29. If i = coll.Count Then coll.Add p1, After:=i
    30. Next
    31. End If
    32. Next
    33. Set OrderedList = coll
    34. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --