EXCEL - VBA - Runtime verkürzen?

C

Cheetah1337

Gast
Servus,

Habe grad für die Arbeit ein Makro grob zusammengeschustert.
Funktionieren würde das Teil an sich, aber es gibt noch Verbesserungsbedarf:

Die Runtime. Jede zweite Zeile (insgesamt 365) EINZELN zu löschen (FOR-Schleife) ist äußerst ineffizient, weil,obwohl nicht riesig viel passiert, die Runtime etwas explodiert.


Code:
Sub CLEAR_CAL()

Dim Lastrow As Integer
Lastrow = ActiveSheet.Cells(Rows.Count, 3).End(xlUp).Row

Application.ScreenUpdating = False

Range("F:BA").Select
Selection.Delete
Range("A:A").Select
Selection.Delete

For i = Lastrow + 1 To 3 Step -2

Rows(i).EntireRow.Delete

Next i

ActiveSheet.DrawingObjects.Select
Selection.Delete

Application.ScreenUpdating = True

On Error GoTo Errorhandler

ActiveWorkbook.SaveAs Filename:="J:\LWL\07 Terminkalender\FIRMA KALENDER EXPORT\FIRMA KALENDER.xlsx", _
        FileFormat:=xlOpenXMLWorkbook, CreateBackup:=True

Errorhandler:

Exit Sub

End If

End Sub

Hoffe mir kann geholfen werden.

Also eigentlich müsste ich ab Zeile 3 oder 4, hab das File grad nicht offen, bis zu letzten Zeile der Datei jede zweite Zeile markieren und DIESE Auswahl dann entfernen. Mir fällt da jetzt irgendwie keine brauchbare Lösung ein. Oder kann man Selections irgendwie "addieren"?

LG Cheetah
 
Zuletzt bearbeitet von einem Moderator:
Da du nur jede zweite Zeile löschen möchtest, ist das die schnellste Methode.
Vielleicht kannst Du die Tabelle umgestalten, so dass der zu löschende Bereich zusammenhängend ist?

Übrigens: du brauchst Zellbereiche vor dem Löschen nicht mit ".Select" auszuwählen. Statt
Range("F:BA").Select
Selection.Delete

verwende besser
Range("F:BA").Delete

Gruß,
Mick
 
  • Gefällt mir
Reaktionen: Cheetah1337
@MickH74 Problem ist, dass diese Tabelle leider so aufgebaut ist und anders nicht ihren Zweck erfüllen würde. ^^ Es werden quasi Daten aus unserem Kalender entfernt, die den Kunden nichts angehen. Und jo wie gesagt das Problem ist einfach die Runtime. Das Makro wird zwar nur einmal wöchentlich ausgeführt, dauert aber je nach Rechner 1-2 Minuten und das ist einfach nicht zufriedenstellend. :D Und genau dieses Problem habe ich bereits einmal umschifft indem ich eben gleich den ganzen Bereich entfernt habe, aber jo das geht eben hier nicht so direkt.

@Range.Delete: Ich bilde mir eben ein das mal versucht zu haben, weil jo klar er sollte ja mit der Range wissen was zu tun ist und das hat damals irgendwie nicht geklappt. Aber ich werds nochmal probieren. Danke für den Hinweis.
 
Deaktiviere mal die Events usw. zu beginn und aktiviere sie am Ende dann wieder (bei Error ein Go to setzen).
Das hilft meist schon ungemein.

Code:
    Application.EnableEvents = False
    Application.DisplayAlerts = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

Code:
    Application.ScreenUpdating = True
    Application.EnableEvents = True   
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic
 
  • Gefällt mir
Reaktionen: Cheetah1337
Normalerweise sollte das nicht so lange dauern (vor allem bei 365 Zeilen), es sei denn, da sind ein paar Formeln mit drin die in jeder Runde neu berechnet werden (SVERWEIS kommt da besonders gut).

Wie der @Scientist schon geschieben hat, sollte Application.Calculation = xlCalculationManual den größten Schub geben.
 
  • Gefällt mir
Reaktionen: Cheetah1337
Uuuuh DAS ... daaas klingt mal interessant. Es sind vor allem viele bedingte Formatierungen (einzeln definierte) ... wird gleich mal ausprobiert! :daumen:
Edit: Yuss! Hatte irgendwie nur die "Animation" im Kopf, die ja durchaus auch Zeit raubt, aber ja jetzt sinds am Laptop im Akku-Modus 15-20 Sekunden, das ist akzeptabel! :)
Danke nochmal!
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben