Zum Inhalt springen

VBA Performance: Code 10x schneller machen

VBA-Code bis zu 10× schneller: ScreenUpdating, manuelle Berechnung, Arrays statt Ranges, With-Blöcke und Dictionary. 10.000 Zeilen in 0,5 statt 30 Sekunden.

VBA & Makros· 2 Min. Lesezeit

Ihr VBA-Makro läuft sehr lange? 10.000 Zeilen in 30 Sekunden statt 0,5 Sekunden? Mit diesen 7 Optimierungen machen Sie Ihren Code bis zu 10x schneller, ohne die Logik zu ändern.

1. Application.ScreenUpdating = False

Das Problem: Excel zeichnet bei jeder Zelländerung den Bildschirm neu. Das ist sehr langsam.

Langsam (30 Sekunden):

For i = 1 To 10000
  Cells(i, 1).Value = i
Next i

Schnell (0.5 Sekunden):

Application.ScreenUpdating = False
For i = 1 To 10000
  Cells(i, 1).Value = i
Next i
Application.ScreenUpdating = True

Wichtig: Am Ende immer wieder auf True setzen, sonst bleibt der Bildschirm eingefroren.

2. Application.Calculation = xlCalculationManual

Bei jeder Zelländerung berechnet Excel alle Formeln neu. Bei 1000 Formeln wird das sehr langsam.

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

' Ihr Code hier

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

3. Arrays statt Ranges

Das größte Performance-Problem in VBA: Range-Zugriffe sind sehr langsam.

Langsam (15 Sekunden):

For i = 1 To 10000
  Cells(i, 2).Value = Cells(i, 1).Value * 2
Next i

Schnell (0.2 Sekunden):

Dim arr As Variant
arr = Range("A1:A10000").Value ' Array laden

Dim i As Long
For i = 1 To UBound(arr, 1)
  arr(i, 1) = arr(i, 1) * 2
Next i

Range("B1:B10000").Value = arr ' Zurück schreiben

Speedup: 75x schneller

4. With-Statements nutzen

Langsam:

Worksheets("Daten").Range("A1").Value = "Test"
Worksheets("Daten").Range("A1").Font.Bold = True
Worksheets("Daten").Range("A1").Font.Size = 14

Schnell:

With Worksheets("Daten").Range("A1")
  .Value = "Test"
  .Font.Bold = True
  .Font.Size = 14
End With

5. Select/Activate vermeiden

Langsam:

Range("A1").Select
Selection.Value = "Test"

Schnell: Range(“A1”).Value = “Test”

6. Dictionary statt Schleifen für Lookups

Problem: VLOOKUP/XVERWEIS in VBA mit Schleifen → O(n²) Komplexität.

Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")

' Lookup-Tabelle laden (1x)
For i = 1 To 1000
  dict(Cells(i, 1).Value) = Cells(i, 2).Value
Next i

' Lookup (superschnell!)
For i = 1 To 10000
  Cells(i, 3).Value = dict(Cells(i, 1).Value)
Next i

Speedup: 100x schneller als verschachtelte Schleifen

7. Performance-Template

Sub PerformanceOptimiert()
  Dim startTime As Double
  startTime = Timer

  ' Performance-Booster aktivieren
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Application.EnableEvents = False

  On Error GoTo ErrorHandler

  ' === IHR CODE HIER ===

  ' Performance-Booster deaktivieren
Cleanup:
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
  Application.EnableEvents = True

  Debug.Print "Dauer: " & Format(Timer - startTime, "0.00") & " Sek"
  Exit Sub

ErrorHandler:
  MsgBox "Fehler: " & Err.Description
  Resume Cleanup
End Sub

Vor/Nachher Benchmarks

Test: 10.000 Zeilen mit Formel füllen

  • Ohne Optimierung: 28,5 Sekunden
  • Mit ScreenUpdating: 3,2 Sekunden
  • Mit Arrays: 0,4 Sekunden
  • Alle Optimierungen: 0,2 Sekunden

Speedup: 142x schneller

Fazit

Diese 7 Techniken machen VBA-Code deutlich schneller:

  • ScreenUpdating = False
  • Calculation = Manual
  • Arrays statt Ranges
  • With-Statements
  • Select/Activate vermeiden
  • Dictionary für Lookups
  • Performance-Template nutzen

Das könnte Sie auch interessieren:

Das könnte Sie auch interessieren

Lieber machen lassen?

Wir setzen Ihre Excel-, Word- oder PDF-Lösung um, zum Festpreis und mit kostenlosem Angebot innerhalb von 48 Stunden.

  • Angebot in 48 Stunden
  • Festpreis ohne versteckte Kosten
  • 14 Tage kleinere Anpassungen kostenfrei