Schnellere Alternative zur For-Schleife

  • Excel

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Schnellere Alternative zur For-Schleife

    Hallo,

    ich habe ein kleines Problem mit meinem Code. Leider dauert die Ausführung etwas zu lange.

    Also ich habe in Excel 3 Spalten befüllt (ca. 35000 Zeilen).

    Spalte A: Datum
    Spalte B: Uhrzeit
    Spalte C: Wert

    Jetzt möchte ich z.B. alle Datums, Uhrzeiten und Werte von den Monaten Sept., Okt. und Nov. in ein neues Tabellenblatt schreiben. Im neuen Tabellenblatt sollen diese dann noch sortiert werden und Duplikate geloscht werden. Aber das geht eigentlich ganz zackig. Was aber m.E. aufhält ist das Einfügen in ein neues Tabellenblatt.

    Anbei mein Codeausschnitt:

    Visual Basic-Quellcode

    1. 'HERBST
    2. zei = 0
    3. For Wiederholungen = 1 To Worksheets.Count
    4. If Sheets(Wiederholungen).Name = "Herbst" Then Blatt_vorhanden = True
    5. Next
    6. If Blatt_vorhanden = False Then
    7. With Worksheets.Add(Sheets(1))
    8. .Name = "Herbst"
    9. End With
    10. End If
    11. Sheets("Herbst").Columns("A").NumberFormat = "m/d/yyyy"
    12. Sheets("Herbst").Columns("B").NumberFormat = "hh:mm:ss;@"
    13. Sheets("Herbst").Columns("C").NumberFormat = "#,##0"
    14. Sheets("Herbst").Columns("A:Z").Font.Size = 8
    15. Sheets("Herbst").Columns("A:Z").Font.Name = "Arial"
    16. With Worksheets("Quelle")
    17. For n = 3 To .range("a65536").End(xlUp).Row
    18. If Month(.Cells(n, "a")) = 9 Then
    19. zei = zei + 1
    20. Worksheets("Herbst").Cells(zei + 1, "a") = .Cells(n, "a")
    21. Worksheets("Herbst").Cells(zei + 1, "b") = .Cells(n, "b")
    22. Worksheets("Herbst").Cells(zei + 1, "c") = .Cells(n, "c")
    23. End If
    24. If Month(.Cells(n, "a")) = 10 Then
    25. zei = zei + 1
    26. Worksheets("Herbst").Cells(zei + 1, "a") = .Cells(n, "a")
    27. Worksheets("Herbst").Cells(zei + 1, "b") = .Cells(n, "b")
    28. Worksheets("Herbst").Cells(zei + 1, "c") = .Cells(n, "c")
    29. End If
    30. If Month(.Cells(n, "a")) = 11 Then
    31. zei = zei + 1
    32. Worksheets("Herbst").Cells(zei + 1, "a") = .Cells(n, "a")
    33. Worksheets("Herbst").Cells(zei + 1, "b") = .Cells(n, "b")
    34. Worksheets("Herbst").Cells(zei + 1, "c") = .Cells(n, "c")
    35. End If
    36. Next n
    37. End With


    Gibt es hier eine bessere bzw. schnellere Alternative?

    Danke, Gruß MArtin.



    Edit by Dodo:
    -> Topic verschoben (Grundlagen => VBA)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dodo“ ()

    generell kannste die drei Abfragen schon mal zu einer zusammenfassen, dann musste nich 3mal das ganze blatt absuchen:

    Visual Basic-Quellcode

    1. If Month(.Cells(n, "a")) = 9 ORelse Month(.Cells(n, "a")) = 10 ORelse Month(.Cells(n, "a")) = 11 then
    2. '...kopieren
    3. end if

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FloFuchs“ ()

    @Maig: For ist schnell, was Du damit machst, ist langsam.
    @FloFuchs: Or ==> OrElse ist auch performanter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @FloFuchs: Dann sind wir im falschen Forum gelandet. :S
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub herbst()
    3. Dim wb As Workbook 'Direkte Bezüge zu den Workbooks und Worksheets herstellen erleichtert die Arbeit
    4. Set wb = ThisWorkbook
    5. Dim wsZiel, wsQuelle As Worksheet
    6. Set wsQuelle = wb.Worksheets("Quelle")
    7. If Not (WorksheetExists("Herbst", wb)) Then 'guggen ob das Sheet existiert wenn nich erstellen
    8. Set wsZiel = wb.Worksheets.Add(after:=wb.Worksheets(wb.Worksheets.Count))
    9. ws.Name = "Herbst"
    10. Else
    11. Set wsZiel = wb.Worksheets("Herbst")
    12. End If
    13. With wsZiel 'Sheet formatieren - wobei ich persönlich mir da meist versteckte Vorlagensheets in den Dateien anlege muss man nur einmal ändern
    14. .Columns("A").NumberFormat = "m/d/yyyy"
    15. .Columns("B").NumberFormat = "hh:mm:ss;@"
    16. .Columns("C").NumberFormat = "#,##0"
    17. .Columns("A:Z").Font.Size = 8
    18. .Columns("A:Z").Font.Name = "Arial"
    19. End With
    20. wsQuelle.Sort.SortFields.Clear 'sortieren deines Datumsbereiches
    21. wsQuelle.Sort.SortFields.Add Key:=Range("A1"), _
    22. SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    23. With wsQuelle.Sort
    24. .SetRange Range("A:C") 'der Sortierbereich - die ersten 3 Spalten
    25. .Header = xlNo
    26. .MatchCase = False
    27. .Orientation = xlTopToBottom
    28. .SortMethod = xlPinYin
    29. .Apply
    30. End With
    31. With wsQuelle
    32. Dim rng As Range
    33. Dim rngAnfang, rngEnde As Range
    34. Dim StartEnde As Integer
    35. For Each rng In .Range("A:A") 'erstes Vorkommen vom September suchen
    36. If Month(rng.Value) = 9 Then
    37. rngAnfang = rng
    38. StartEnde = rng.Row
    39. Exit For
    40. End If
    41. Next rng
    42. Dim i As Integer 'letztes Vorkommen vom November suchen
    43. For i = .Range.Rows(StartEnde) To .Range.Rows.Count
    44. If Month(Cells(i, 1).Value) = 11 And (Month(Cells(i, 1).Offset(1, 0).Value) = 12 Or Month(Cells(i, 1).Offset(1, 0).Value) = Nothing) Then
    45. rngEnde = Range(Cells(i, 1))
    46. Exit For
    47. End If
    48. Next i
    49. Dim rngKopieren As Range 'Quellbereich definieren
    50. Set rngKopieren = .Range(rngAnfang, rngEnde.Offset(0, 2))
    51. rngKopieren.Copy
    52. .Range("A1").PasteSpecial 'und im Zielsheet ab "A1" einfügen
    53. End With
    54. End Sub
    55. Public Function WorksheetExists(ByVal IWorkSheetName As String, ByVal IWorkBook As Workbook) As Boolean
    56. Dim IWorkSheet As Worksheet 'function zum testen ob ein Worksheet in einem Workbook vorhanden ist
    57. For Each IWorkSheet In IWorkBook
    58. If IWorkSheet.Name = IWorkSheetName Then
    59. WorksheetExists = True
    60. Exit For
    61. Else
    62. WorksheetExists = False
    63. End If
    64. Next
    65. End Function
    Vielen Dank für deinen Code.

    Aber wie kann ich den denn am einfachsten testen, damit ich ihn bei mir einbauen kann?

    Hab jetzt eine neue Datei geöffnet mit meinen Werten in Tabellenblatt "Quelle" und lass das Programm laufen.

    Aber ich hab schon bei Zeile 11 einen Fehler:
    "Variable nicht definiert"

    Sollte der so wie er ist fehlerfrei durchlaufen?

    Danke nochmal!