dressa
Goto Top

Excel 2010 mit VBA sortieren ?

Hallo miteinander,

Ich habe die Aufgabe mit Excel einen Dateiordner auszulesen und diese in Excel nach 2 Kriterien in 2 Spalten zu sortieren.
Als absoluter Vollleie konnte ich mit Hilfe des Internets und ein paar hilfsbereiten User von diesem Forum nun geschafft den Ordner auszulesen.
Die Sortierung nach den 2 Spalten wollte ich mit Hilfen von Formeln durchführen was bei meinem Text auch funktioniert hat.

Für das bessere Verständnis
In der Tabelle 2 werden die Dateinamen aufgelistet und in der Tabelle 1 die sortierte Liste.

Dies hat in meinem Test funktioniert.
Wenn ich jedoch die Excel-Datei schliesse und wieder öffne, braucht Ecxel über 30 Minuten um die Datei zum öffnen.
Ich muss dazu sagen das ich nach 30 Minuten abgebrochen habe,

Ich vermute das das Macro das die Dateiliste erstellt einen komflikt mit der Formel in der Tabelle 1 bekommt.
Das die Formel jedesmall wenn eine neue Datei dazukommt wieder von vorne beginnt mit der Berechnung.

Deshalb meine Frage, kann die Sortierung der Dateien direkt in VBA-Code während dem einlesen gemacht werden ?

Hier mein Code der die Dateinamen in Excel schreibt.
Das auslesen der 2500 Dateien erfolgt in ca. 10 Sek.

Sub Filelist()

    Dim fs As Object
    Dim fVerz As Object
    Dim fDatei As Object
    Dim fdateien As Object
    Dim strDat As String
    Dim Zeile As Integer
    
    Set fs = CreateObject("scripting.FileSystemObject")  
    Set fVerz = fs.getFolder("\\10.20.50.200\archiv")  
    Set fdateien = fVerz.Files
    
    For Each fDatei In fdateien
        If InStr(fDatei, "") > 0 Then  
            Zeile = Zeile + 1
            Sheets(2).Cells(Zeile, 1) = fDatei.Name
            
        End If
    Next fDatei

End Sub

Wäre echt super wenn mir jemand helfen könnte.
Andy

Content-ID: 339180

Url: https://administrator.de/contentid/339180

Ausgedruckt am: 25.11.2024 um 03:11 Uhr

Kraemer
Kraemer 29.05.2017 um 16:26:12 Uhr
Goto Top
Moin,

klar geht das. Du schreibst aber leider nicht, was wann wie sortiert werden soll.

Gruß
colinardo
colinardo 30.05.2017 aktualisiert um 10:36:52 Uhr
Goto Top
Servus,
da hast du mehrere Möglichkeiten. In deinem Fall mache ich das gerne so, dass ich die Dateiliste in ein Recordset-Objekt einlese dem man auch mehr als eine Eigenschaft der Datei hinterlegen kann, z.B. das Änderungsdatum der Datei. So kann man im Nachhinein die Liste im Voraus nach Wunsch sortieren und filtern.
Die zweite Möglichkeit ist das Sortieren über die üblichen Excel-Funktionen.

Ich werde hier mal beide Möglichkeiten veranschaulichen:

back-to-topMethode "Recordset"
Sub WriteSortedListToSheet()
    'work on sheet 1  
    With Sheets(1)
        ' get sorted list of filenames from directory  
        Set Files = GetSortedFileList("\\10.20.50.200\archiv")  
        r = 1
        'write file names to sheet  
        While Not Files.EOF
            .Cells(r, 1).Value = Files.Fields("name").Value  
            Files.MoveNext
            r = r + 1
        Wend
    End With
End Sub

Function GetSortedFileList(strFolder)
    Set objList = CreateObject("ADOR.Recordset")  
    Set fso = CreateObject("Scripting.Filesystemobject")  
    objList.Fields.Append "name", 200, 255  
    objList.Fields.Append "date", 7  
    objList.Open
    For Each file In fso.GetFolder(strFolder).Files
        objList.AddNew
        objList("name").Value = file.Name  
        objList("date").Value = file.DateLastModified  
        objList.Update
    Next
    objList.Sort = "name"  
    Set GetSortedFileList = objList
    Set fso = Nothing
    Set objList = Nothing
End Function
back-to-topMethode Sortieren über Excel-Methode Range.Sort
Du importierst deine Dateinamen wie gewohnt unsortiert und sortierst dann einfach den Bereich in dem die Namen stehen nach folgendem Schema (hier wird Spalte A des ersten Sheets sortiert)
With Sheets(1)
    .Columns(1).Sort .Columns(1), xlAscending
End with
p.s. eine kurze Aufzeichnung mit dem Makro-Rekorder wäre doch eigentlich nicht viel verlangt gewesen face-wink ?! Er hätte dir zumindest schon mal den Weg gewiesen.

Grüße Uwe
dressa
dressa 08.06.2017 um 13:35:27 Uhr
Goto Top
Hallo Uwe.

Das mit dem Makro-Recorder habe ich natürlich schon probiert, aber der hat das nicht geschnallt was ich gemacht habe.

Leider muss ich mich selber etwas beschuldigen:
Ich habe gar nicht geschrieben wie die Sortierung gemacht werden soll. face-sad
Weiss auch nicht warum gerade der wichtigste Teil nicht da ist face-sad

Nur sortieren im einfachen Sinne wäre zu einfach.
Das hätte ich auch gar nicht hier gefragt.

Hier der wichtige Nachtrag:

Es gibt Dateien mit dem Namen.

20170404_002.html
20170404_003.html
20170405_002.html
20170406_002.html
20170406_003.html
usw.

Meine Sortierung sollte nun so funktionieren, das in der Spalte B alle File mit xxxx_002.html drin stehen
und in der Spalte C alle File mit xxxx_003.html drin stehen.

Ich habe das mit Excel Befehlen gemacht.
Was aber eben dazu führt das das Excel zwar berechnet aber in einer Schleife hängen bleibt.

Deshalb will ich es eben mit VBA probieren.
colinardo
Lösung colinardo 08.06.2017 aktualisiert um 14:10:04 Uhr
Goto Top
Zitat von @dressa:
Das mit dem Makro-Recorder habe ich natürlich schon probiert, aber der hat das nicht geschnallt was ich gemacht habe.
Schade.
Weiss auch nicht warum gerade der wichtigste Teil nicht da ist face-sad
? Vielleicht das nächste mal sich vorher den Text nochmal ansehen bevor man ihn postet. Immerhin machen sich hier Leute Gedanken und opfern Ihre Zeit für Leute wie dich denen es anscheinend zu schwer fällt mal 2-3 Stunden in der VBA-Referenz zu lesen und dann nach knapp 2 Wochen ohne Rückmeldung wieder antanzen. Schade face-confused.
Es gibt Dateien mit dem Namen.

20170404_002.html
20170404_003.html
20170405_002.html
20170406_002.html
20170406_003.html
usw.

Meine Sortierung sollte nun so funktionieren, das in der Spalte B alle File mit xxxx_002.html drin stehen
und in der Spalte C alle File mit xxxx_003.html drin stehen.

Ich habe das mit Excel Befehlen gemacht.
Was aber eben dazu führt das das Excel zwar berechnet aber in einer Schleife hängen bleibt.
Dafür gibt es im VBA-Editor Breakpoints und den Debugger der dich den Code Step by Step ausführen, und die Zustände der Variablen beobachten lässt. Man muss die Tools nur nutzen, dazu sind sie da!
Deshalb will ich es eben mit VBA probieren.
Für das obige erste Beispiel einfach die erste Funktion so abändern (die Function gehört natürlich immer noch dazu, die bleibt aber gleich, deswegen poste ich sie nicht erneut.):
Sub WriteSortedListToSheet()
    On Error Resume Next
    Dim col As Integer
    'work on sheet 1  
    With Sheets(1)
        ' get sorted list of filenames from directory  
        Set Files = GetSortedFileList("\\10.20.50.200\archiv")  
        r = 1
        'write file names to sheet  
        While Not Files.EOF
            'Spalte aus dem Dateinamen ermitteln  
            col = Int(Split(Split(Files.Fields("name").Value, "_", 2, 1)(1), ".", 2, 1)(0))  
            If Err.Number <> 0 Then
                 MsgBox "Dateiname '" & Files.Fields("name").Value & "' konnte keiner Spalte zugeordnet werden!", vbExclamation  
                Err.Clear
            Else
                'Dateiname in nächste freie Zeile der jeweiligen Spalte schreiben  
                .Cells(Rows.Count, col).End(xlUp).Offset(1, 0).Value = Files.Fields("name").Value  
            End If
            'nächster Name  
            Files.MoveNext
        Wend
    End With
End Sub
Viel Erfolg noch, ich bin jetzt raus.

Grüße Uwe