Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Geschwindigkeit unter VBA?

Forumthread: Geschwindigkeit unter VBA?

Geschwindigkeit unter VBA?
24.05.2002 08:17:51
Stefan
Hi, ich warte gerade mal wieder auf eine Programmausführung und das ganze Ding ist UNERTRÄGLICH langsam. Was kann man tun?
Also - zunächst das Problem. Ich führe mit einem relativ grossen Datensatz umfangreiche Berechnungen durch, für welche ich auf Excel-Funktinoen und Auswahlmechanismen zurückgreife (z.B. Standardabweichungen, Median, realtive Ränge usw. berechnen und Selektion bestimmter Datensätze nach Kriterien über die Auto-Filter Methode). Das Ergebnis lasse ich jeweils in einer neuen Spalte ausgeben, auf die ich dann für die folgenden Berechnungen zugreife. Und das alles geht wahnsinnig langsam.
Welche Möglichkeiten gibt es, hier die Performance zu verbessern, oder ist das einfach so.
Besonders lang scheint er immer für die Selektion via Auto-Filter und Berechnung von Rängen u.a. (z.B. auch Summewenn usw.) zu brauchen. Bringt es was, alles nur intern (z.B. in einem array) berechnen zu lassen und das erst ganz zum Schluss wieder in eine Excel-Tabelle schreiben zu lassen? Diese Mglchkt. wäre mir allerdings nicht so angenehm, weil ich da nicht wirklich sehen kann, was mein Programm mit den Sachen macht (bin nicht so sicher im Programmieren).

Und noch eine letzte Frage. Wie kann ich erkennen, ob VBA abgestürzt ist, oder noch arbeitet (ausser einem Zähler in der Application-Statusbar?). Oder passiert es selten, dass VBA abschmiert?

Viele Grüsse und einen schönene Morgen wünscht,

Stefan

Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: Geschwindigkeit unter VBA?
24.05.2002 08:21:30
Hajo
Hallo Stefan

eine Geschwindigkeitssteigerung bringt es schon, wenn Du auf Befehle wie select und ähnliches verzichtets.

Zu Fortschrittsanzeige schaue mal hier
369. API-Fortschrittsbalken
Hier der direkte Link zu Michael Schwimmer, resp. dem API-Fortschrittsbalken:
http://schwimmer.bei.t-online.de/sonderfunktionen.htm#Fortschrittsanzeige
Von Thomas Ramel


Gruß Hajo

Anzeige
Re: Geschwindigkeit unter VBA?
24.05.2002 08:47:47
Michael Scheffler
Hallo,

also VBA ist nun einmal eine Interpretersprache, das dauert immer langsam. Dann sind interne Arrays, denen Du feste Typen und Grenzen gibst (falls Du die kennst), immer schneller.

Und außerdem solltest Du auf die Aktaliseirung des Bildschirms verzichten, wenn Du schon auf die Tabellen zugreifen willst. Das daueret erfahrungsgemäß am längsten.

Gruß

Micha

Anzeige
Re: Geschwindigkeit unter VBA?
24.05.2002 08:50:03
Timo
Hallo Stefan,

helfen würde vermutlich, wenn du die Bildschirmaktualisierung für die Laufzeit des Makros deaktivierst. Dann siehst du allerdings auch nicht, was dein Makro grad macht...

Dazu musst du nur 2 Zeilen Quellcode ergänzen:
Application.Screenupdating = False 'Direkt nach der Variablendeklaration
Application.Screenupdating = True 'Am Ende des Makros

Hoffe, dir geholfen zu haben

Timo

Anzeige
Re: Geschwindigkeit unter VBA?
24.05.2002 09:03:19
rainer
Hallo! Bei mir hat der Einbau von application.xlcalculation = false am Anfang des Makros und application.xlcalculation = true am Ende Wunder bewirkt. Das hängt jedoch davon ab, ob du per Makro Werte in Zellen schreibst und Formeln in Zellen drin hast. Excel würde in diesem Fall immer bei Zelländerungen zuerst rechnen bevor es weitergeht. Mit den zwei Zeilen wird nur einmal am Ende des Makros gerechnet
Gruß
Rainer
Anzeige
;
Anzeige

Infobox / Tutorial

Geschwindigkeit unter VBA optimieren


Schritt-für-Schritt-Anleitung

  1. Deaktiviere die Bildschirmaktualisierung: Füge am Anfang Deines Makros die folgende Zeile ein, um die Bildschirmaktualisierung zu deaktivieren. Das verbessert die Excel Geschwindigkeit erheblich.

    Application.ScreenUpdating = False
  2. Nutze interne Arrays: Wenn Du mit großen Datensätzen arbeitest, verwende interne Arrays, um die Berechnungen schneller durchzuführen. Das sieht beispielsweise so aus:

    Dim myArray() As Variant
    myArray = Range("A1:A1000").Value
  3. Deaktiviere die automatische Neuberechnung: Setze die Berechnung auf manuell, indem Du folgende Zeilen hinzufügst:

    Application.Calculation = xlCalculationManual
    ' Dein Code hier
    Application.Calculation = xlCalculationAutomatic
  4. Verzichte auf die Verwendung von Select: Minimale Nutzung von Select und Activate kann die Leistung ebenfalls steigern.

  5. Aktiviere die Bildschirmaktualisierung am Ende: Vergiss nicht, die Bildschirmaktualisierung am Ende Deines Makros wieder zu aktivieren:

    Application.ScreenUpdating = True

Häufige Fehler und Lösungen

  • Fehler: Das Makro läuft extrem langsam.

    • Lösung: Überprüfe, ob Du die Bildschirmaktualisierung und die automatische Berechnung deaktiviert hast.
  • Fehler: VBA scheint abgestürzt zu sein.

    • Lösung: Verwende die Application.StatusBar, um den Fortschritt anzuzeigen. Achte darauf, dass Du den Status regelmäßig aktualisierst.

Alternative Methoden

  • Fortschrittsbalken implementieren: Nutze APIs, um einen Fortschrittsbalken anzuzeigen. Dies hilft, den Status Deines Makros zu visualisieren und die Nutzererfahrung zu verbessern. Eine gute Quelle ist Michael Schwimmer's API-Fortschrittsbalken.

  • Batch-Verarbeitung: Statt Daten sofort zu verarbeiten, speichere sie in einem Array und schreibe die Ergebnisse am Ende in die Excel-Tabelle.


Praktische Beispiele

Angenommen, Du hast eine große Datenmenge in Spalte A und möchtest die Summe in Spalte B berechnen:

Sub PerformanceVerbessern()
    Dim myArray() As Variant
    Dim i As Long

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    myArray = Range("A1:A1000").Value

    For i = LBound(myArray) To UBound(myArray)
        myArray(i, 1) = myArray(i, 1) * 2 ' Beispiel für eine Berechnung
    Next i

    Range("B1:B1000").Value = myArray
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Tipps für Profis

  • Profiling: Verwende Debug.Print um zu sehen, wie lange bestimmte Codeabschnitte dauern. So kannst Du gezielt die Excel Performance verbessern.

  • Vermeide unnötige Berechnungen: Wenn Du Daten eingibst, die nicht direkt verarbeitet werden müssen, speichere sie in einer temporären Variablen.

  • Verwende Excel-Funktionen direkt in VBA: Anstatt Daten in Excel zu schreiben und dann auf die Ergebnisse zuzugreifen, führe die Berechnungen direkt in VBA durch.


FAQ: Häufige Fragen

1. Wie kann ich feststellen, ob VBA abgestürzt ist?
Eine Möglichkeit ist, regelmäßig die Application.StatusBar zu aktualisieren, um den Fortschritt anzuzeigen.

2. Was kann ich tun, wenn mein Makro extrem langsam läuft?
Überprüfe, ob Du die Bildschirmaktualisierung und die automatische Berechnung deaktiviert hast. Verwende auch interne Arrays für schnellere Berechnungen.

3. Welche Rolle spielt die Bildschirmaktualisierung für die Geschwindigkeit?
Die Bildschirmaktualisierung kann während der Ausführung Deines Makros viel Zeit in Anspruch nehmen. Durch Deaktivierung kann die Excel Geschwindigkeit signifikant verbessert werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige