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

Forumthread: Dateien eines Ordners - alphabetischer Reihenfolge

Dateien eines Ordners - alphabetischer Reihenfolge
Holger
Hallo,
der folgende VBA-Code liest eine Zelle aus allen Dateien eines Ordners aus und schreibt diese in einer Datei untereinander, was auch funktioniert.
Leider werden die Dateien in Reihenfolge des Speicherdatums ausgelesen, beginnend mit dem jüngsten.
Wie muss ich das anpassen, damit die Dateien des Ordners in alphabetischer Reihenfolge ausgelesen werden?
Vielen Dank im Voraus für eine hilfreiche Antwort.
Gruß
Holger

Sub datenAusDateien()
Dim strPath As String, strFile As String, strTab As String, strRef As String
Dim lngNext As Long
strPath = "E:\Forum" 'verzeichnis
strPath = IIf(Right(strPath, 1) = "\", strPath, strPath & "\")
strTab = "Tabelle1" 'Tabellenname
strRef = "B5" 'Zelladresse
lngNext = 4
strFile = Dir(strPath & "*.xls*", vbNormal)
On Error Resume Next
With Sheets("Planung")
Do While strFile  ""
.Cells(lngNext, 7).Formula = "='" & strPath & "[" & strFile & "]" & strTab & "'!" &  _
strRef
.Cells(lngNext, 7) = .Cells(lngNext, 7).Value
lngNext = lngNext + 1
strFile = Dir
Loop
End With
End Sub

Anzeige
AW: Dateien eines Ordners - alphabetischer Reihenfolge
30.10.2011 11:14:39
Josef

Hallo Holger,
dazu benötigt man eine komplett anderen Code. Warum sortierst du die Spalte anschließend nicht einfach?

« Gruß Sepp »

Anzeige
AW: Dateien eines Ordners - alphabetischer Reihenfolge
30.10.2011 13:27:52
Reinhard
Hallo Sepp,
wieso einen komplett anderen Code?
Holger muß doch nur in der Schleife strFile in eine Hilfsspalte schreiben und nach dieser Spalte 7 sortieren.
Wenn das seine tabellnstrukrur zwerhackt, dann halt erstmal in einem temporären Hilfsblatt die Formeln in a eintragen, StrFile in B und nach B sortieren und in a die Originaltab übertragen.
Sooo langsam ist das nicht.
Oder sehe ich da was falsch?
(Das ist der Grund warum ich nachfrage)
Gruß
Reinhard
Anzeige
AW: Dateien eines Ordners - alphabetischer Reihenfolge
30.10.2011 14:55:54
Josef

Hallo Reinhard,
"komplett anderer Code" bezieht sich auf das auslesen der Dateien.
Man kann mit entsprechendem Code, die Dateien gleich nach einem bestimmten Kriterium sortiert einlesen.

« Gruß Sepp »

Anzeige
Danke dir :-)                o.w.T
31.10.2011 09:11:33
Reinhard

Arraylist.sort-->.ToArray
30.10.2011 11:20:30
ransi
HAllo
Wie man die Dateien in Alphabetischer Reihenfolge ausliest weiß ich nicht.
Aber:
Alle Dateien in eine Arraylist auslesen.
Die Arraylist sortieren.
Die Elemente der Arraylist verformeln.
Schau es dir mal an:

Option Explicit

Sub Test()
    Dim objAL As Object
    Dim objFSO As Object
    Dim strPath
    Dim strFile
    Dim vntFiles As Variant
    Dim L As Long
    Set objAL = CreateObject("System.Collections.Arraylist")
    Set objFSO = CreateObject("Scripting.FilesystemObject")
    
    strPath = "E:\Forum" 'verzeichnis
    With objAL
        For Each strFile In objFSO.getfolder(strPath).Files 'Alle Dateien auslesen
            Select Case LCase(objFSO.getextensionname(strFile))
                Case "xls", "xlsx", "xla", "xlsm" 'nur Excel Dateien betrachten
                    .Add strFile.Path 'Datei in die Arraylist aufnehmen
            End Select
        Next
        .Sort 'ArrayList sortieren
        vntFiles = .toArray 'ArrayList in ein Array wegschreiben
    End With
    
    'Ausgeben
    For L = LBound(vntFiles) To UBound(vntFiles)
        MsgBox vntFiles(L) 'Die Formel bekommst du selber hin ?
    Next
    
    
End Sub


ransi
Anzeige
Und weil ich Esel, dass mit den Formeln ...
30.10.2011 11:53:07
Josef

... nicht gelesen habe, hier der Code von Ransi mit dem einfügen der Formeln.

Sub Test()
  Dim objAL As Object, objFSO As Object, objFile As Object
  Dim strPath As String, strTab As String, strRef As String
  Dim vntFiles As Variant
  Dim lngIndex As Long, lngNext As Long
  
  Set objAL = CreateObject("System.Collections.Arraylist")
  Set objFSO = CreateObject("Scripting.FilesystemObject")
  
  strPath = "E:\Forum" 'verzeichnis
  strPath = IIf(Right(strPath, 1) = "\", strPath, strPath & "\")
  strTab = "Tabelle1" 'Tabellenname
  strRef = "B5" 'Zelladresse
  lngNext = 4
  
  With objAL
    For Each objFile In objFSO.getfolder(strPath).Files 'Alle Dateien auslesen
      If LCase(objFSO.getExtensionName(objFile)) Like "xls*" Then .Add objFile.Name
    Next
    .Sort 'ArrayList sortieren
    vntFiles = .toArray 'ArrayList in ein Array wegschreiben
  End With
  
  For lngIndex = LBound(vntFiles) To UBound(vntFiles)
    vntFiles(lngIndex) = "='" & strPath & "[" & vntFiles(lngIndex) & "]" & _
      strTab & "'!" & strRef
  Next
  
  With Sheets("Planung").Cells(lngNext, 7).Resize(UBound(vntFiles) + 1, 1)
    .Formula = Application.Transpose(vntFiles)
    .Value = .Value
  End With
  
  Set objFile = Nothing
  Set objFSO = Nothing
  Set objAL = Nothing
End Sub




« Gruß Sepp »

Anzeige
AW: Und weil ich Esel, dass mit den Formeln ...
30.10.2011 13:47:26
Holger
Der VBA-Code funktioniert... :-)
Vielen Dank an alle die sich an der Lösung beteiligt haben.
PS:
Ich hatte vorher auch schon versucht die Dateien im Explorer anders zu sortieren, ohne Erfolg.
Ein sortieren der Werte nachträglich wäre nur dann sinnvoll, wenn ich nebendran zur Verbindung auch den Dateinamen hätte. Das wären dann 2 Hilfsspalten um die echte Spalte zu füllen. Wäre natürlich auch machbar gewesen,
aber so ists natürlich professionieller.
Vielen Dank nochmal.
Anzeige
AW: Dateien eines Ordners - alphabetischer Reihenfolge
30.10.2011 13:37:16
Daniel
Hi
ich vermute mal die DIR-Funktion liest die Daten in der Reihenfolge, wie du sie zuletzt im Dateiexplorer sortiert hast (bei mir ist die Reihenfolge nämlich alphabetisch.
aber es gibt für diesen Fall eine einfache lösung:
1. Schreibe erstmal die Formeln als Text in die Zellen (beispielsweise durch ein voranstellen von "xxx")
2. Sortiere dann die Texte mit der Sortierfunktion, da der Zellbezug als erstes steht, sollte richtig sortiert werden
3. Wandle dann die Texte in Formeln um, indem du einfach mit ERSETZEN die "xxx" entfernst. Den Rest erledigt dann Excel automatisch, da es die Zellinhalte nun wieder als Formeln erkennt und ensprechend reagiert.
Da du nur einfache Zellbezüge und keine komplexen Formeln hast, sollten keine Sprachprobleme zwischen VBA (englisch) und Excel (deutsch) zu erwarten sein.
hier der Code, die geänderten Zeilen sind Fett:

Sub datenAusDateien()
Dim strPath As String, strFile As String, strTab As String, strRef As String
Dim lngNext As Long
strPath = "d:\daten\excel" 'verzeichnis
strPath = IIf(Right(strPath, 1) = "\", strPath, strPath & "\")
strTab = "Tabelle1" 'Tabellenname
strRef = "B5" 'Zelladresse
lngNext = 4
strFile = Dir(strPath & "*.xls*", vbNormal)
On Error Resume Next
With Sheets(1)
Do While strFile  ""
.Cells(lngNext, 7).Formula = "xxx='" & strPath & "[" & strFile & "]"  _
& strTab & "'!" & strRef
.Cells(lngNext, 7) = .Cells(lngNext, 7).Value
lngNext = lngNext + 1
strFile = Dir
Loop
With Range(.Cells(4, 7), .Cells(lngNext - 1, 7))
.Sort key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlNo
.Replace "xxx=", "=", xlPart
End With
Endd With
End Sub

Gruß Daniel
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Dateien eines Ordners alphabetisch sortieren


Schritt-für-Schritt-Anleitung

Um die Dateien eines Ordners in alphabetischer Reihenfolge auszulesen, kannst du den folgenden VBA-Code verwenden. Dieser Code liest alle Excel-Dateien aus einem angegebenen Verzeichnis und sortiert sie alphabetisch, bevor die Zellbezüge erstellt werden.

Sub datenAusDateien()
    Dim objAL As Object, objFSO As Object, objFile As Object
    Dim strPath As String, strTab As String, strRef As String
    Dim vntFiles As Variant
    Dim lngIndex As Long, lngNext As Long

    Set objAL = CreateObject("System.Collections.Arraylist")
    Set objFSO = CreateObject("Scripting.FilesystemObject")

    strPath = "E:\Forum" 'verzeichnis
    strPath = IIf(Right(strPath, 1) = "\", strPath, strPath & "\")
    strTab = "Tabelle1" 'Tabellenname
    strRef = "B5" 'Zelladresse
    lngNext = 4

    With objAL
        For Each objFile In objFSO.getfolder(strPath).Files 'Alle Dateien auslesen
            If LCase(objFSO.getExtensionName(objFile)) Like "xls*" Then
                .Add objFile.Name 'Datei in die Arraylist aufnehmen
            End If
        Next
        .Sort 'ArrayList sortieren
        vntFiles = .toArray 'ArrayList in ein Array wegschreiben
    End With

    'Ausgeben
    With Sheets("Planung").Cells(lngNext, 7).Resize(UBound(vntFiles) + 1, 1)
        .Formula = Application.Transpose(vntFiles)
        .Value = .Value
    End With
End Sub

Dieser Code erstellt eine ArrayList, füllt sie mit den Dateinamen und sortiert die Dateien alphabetisch, bevor sie in das Excel-Blatt eingefügt werden.


Häufige Fehler und Lösungen

  1. Dateien werden nicht gefunden: Stelle sicher, dass der Pfad zu deinem Verzeichnis korrekt ist. Überprüfe die Schreibweise und die Dateiendungen.

  2. Sortierung funktioniert nicht: Vergewissere dich, dass die .Sort-Methode auf die ArrayList angewendet wird, bevor die Dateien in Excel eingefügt werden.

  3. Fehler beim Auslesen der Dateien: Achte darauf, dass du nur die richtigen Dateitypen (z.B. .xls, .xlsx) in die ArrayList aufnimmst.


Alternative Methoden

Eine alternative Methode zum alphabetischen Sortieren der Dateien könnte sein, die DIR-Funktion zu verwenden, um die Dateien in einer Schleife einzulesen und sie anschließend direkt in Excel zu sortieren. Hier ist ein Beispiel:

Sub datenAusDateien()
    Dim strPath As String, strFile As String
    Dim lngNext As Long
    strPath = "E:\Forum" 'verzeichnis
    strFile = Dir(strPath & "*.xls*")
    lngNext = 4

    ' Dateien einlesen
    Do While strFile <> ""
        Cells(lngNext, 7).Value = strFile
        lngNext = lngNext + 1
        strFile = Dir
    Loop

    ' Sortieren
    With Range(Cells(4, 7), Cells(lngNext - 1, 7))
        .Sort Key1:=.Cells(1, 1), Order1:=xlAscending, Header:=xlNo
    End With
End Sub

Hierbei werden die Dateien in eine Spalte geschrieben und anschließend mit der Excel-Sortierfunktion sortiert.


Praktische Beispiele

Wenn du beispielsweise in einem Ordner mit verschiedenen Excel-Dateien arbeitest, kannst du die oben genannten VBA-Codes verwenden, um die Dateien alphabetisch zu sortieren, bevor du sie in deine Hauptarbeitsmappe überträgst. Dies ist besonders nützlich, wenn du eine große Anzahl von Dateien verwalten musst und die Übersichtlichkeit wichtig ist.


Tipps für Profis

  • Fehlermeldungen ignorieren: Nutze On Error Resume Next, um temporäre Fehler zu ignorieren. Dies kann hilfreich sein, wenn du Dateien hast, die nicht geöffnet werden können.
  • Verwende temporäre Blätter: Wenn du komplexe Formeln hast, die du sortieren musst, kann es hilfreich sein, die Daten zuerst in ein temporäres Blatt zu übertragen und dort die Sortierung durchzuführen.
  • Optimierung durch Filter: Überlege, die Excel-Filterfunktion zu nutzen, um nur die relevanten Daten anzuzeigen, bevor du die endgültige Sortierung vornimmst.

FAQ: Häufige Fragen

1. Wie kann ich mehrere Dateitypen einlesen?
Du kannst die Bedingung in der If-Anweisung anpassen, um verschiedene Dateitypen zu berücksichtigen, z.B. If LCase(objFSO.getExtensionName(objFile)) Like "xls*" Or LCase(objFSO.getExtensionName(objFile)) Like "csv".

2. Was mache ich, wenn die Dateien nicht alphabetisch sortiert werden?
Stelle sicher, dass die Sort-Methode auf die ArrayList angewendet wird, bevor du die Daten in Excel einfügst. Überprüfe auch, ob die Dateinamen korrekt sind.

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