Hallo, ich habe mir in Excel ein Makro geschrieben... Das funktioniert einwandfrei, läuft aber zu lange. Wie kann ich das optimieren?

... komplette Frage anzeigen

5 Antworten

Das ist schon ziemlich schlank. :/

Du könntest probieren, die Filtermechanik zu verwenden.

Sub Filtern()
    Dim ws As Worksheet
    Set ws = ActiveSheet

On Error GoTo Fehler Application.ScreenUpdating = False Range("F:N").AutoFilter ActiveSheet.Range("$F:$N").AutoFilter Field:=1, Criteria1:="<>PLA4.TST", Operator:=xlAnd ws.AutoFilter.Range.Offset(1, 0).Delete shift:=xlUp Range("F:N").AutoFilter ActiveSheet.Range("$F:$N").AutoFilter Field:=9, Criteria1:="=0", Operator:=xlAnd ws.AutoFilter.Range.Offset(1, 0).Delete shift:=xlUp ActiveSheet.ShowAllData Range("F:N").AutoFilter
Fehler: On Error GoTo 0 Application.ScreenUpdating = True Set ws = Nothing End Sub
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Suboptimierer
12.08.2016, 11:15

Du könntest auch versuchen, in deinem Makro dich mittels Range.Find durch die Datensätze zu hangeln.

0

Du bearbeitest eine Matrix von mindestens 65000 x 14 Zellen, das sind fast 1 Million Zellen. Außerdem fragst du 65000 mal je 2 Zellen nach Bedingungen ab und - falls es zum Löschvorgang kommt - muss die ganze Matrix neu organisiert werden. Das dauert eben, ich glaube nicht, dass man da viel Zeit sparen kann. 

Es wäre aber interessant zu erfahren, ob tatsächlich jemand eine zündende Idee hat?

Antwort bewerten Vielen Dank für Deine Bewertung

Werden auf dem Spreadsheet Berechnungen durchgeführt? Wenn ja, dann setze diese Berechnung für die Dauer des Makros aus. Dies geht mit calculation=xlCalculationManual. Danach machst du dann calculation=CalculationAutomatic.

Das macht Makros, auf Spreadsheets mit aufwendigen Berechnungen, substanziell schneller.

Hilft das?

Abibabo.de

Antwort bewerten Vielen Dank für Deine Bewertung

Zusätzlich zu aibabos und Suboptimierers Ideen könntest du noch vermeiden, dass Leerzeilen abgearbeitet werden:
Falls die Spalten F und N immer gleich gefüllt sind, also die letzte Zeile immer die gleiche ist:

For i = Range("F65000").End(xlUp).Row To 2 Step -1

Falls es da Unterschiede gibt, müsste noch das Maximum bestimmt werden.

Antwort bewerten Vielen Dank für Deine Bewertung

Excel berechnet halt jeweils allescin einer recht komplexen Interpreter-Sprache.

Da hast Du in Excel wenig Chancen zur Beschleunigung.

Wenn diese Berechnung wirklich häufig notwenig ist, dann solltest Du ein Programm in einer echten Programmiersprache (Pascal oder C++) schreiben.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?