In diesem Beitrag zeige ich, wie man eine hohe CPU-Auslastung während der Automatisierung von MS-Office vermeiden kann. Eine hohe CPU-Auslastung ist in 99% der Fälle die Folge einer fehlerhaften Programmierung. Die meisten Probleme einer solchen Auslastung treten dann auf, wenn mehrere Vorgänge innerhalb einer Schleife mehrfach wiederholt werden. Das können FOR…TO…NEXT, DO…LOOP oder DO WHILE…LOOP schleifen sein. Diese drei Schleifen unterscheiden sich nur in der Art, ob die Werte zum Anfang (Kopf-Schleife) oder am Ende (Fußschleife) überprüft werden. Dabei ist es egal, welche Art von Schleife Du nimmst. Es kann bei allen Typen passieren, dass die Auslastung der CPU auf 100% steigt und somit die Office Anwendung nicht mehr bedienbar ist.
Im folgenden zeige ich verschiedene Möglichkeiten, warum die Auslastung der CPU auf 100% ansteigt :
- Wenn die Schleife Vorgänge auf einem Tabellenblatt abarbeitet, vermeide die Auswahl des Tabellenblattes bei jedem Durchgang.
- Durch die ständige Aktualisierung des Bildschirms während der Ausführung der Schleife kann ebenfalls die Auslastung nach oben gehen. Diese Aktualisierung kann für den Zeitraum mit dem folgenden Befehl aus- und wieder eingeschaltet werden :Bildschirmaktualisierung ausschalten :
Application.ScreenUpdating = False
Bildschirmaktualisierung einschalten :
Application.ScreenUpdating = True
- Die folgende Funktion bietet gleich mehrere Möglichkeiten verschiedene Aufgaben ein- und auszuschalten :
Sub getMoreSpeed(bDoIt As Boolean) Application.ScreenUpdating = Not (bDoIt) Application.EnableEvents = Not (bDoIt) Application.Calculation = IIf(bDoIt, xlCalculationManual, xlCalculationAutomatic) End Sub
Die erste Zeile der Funktion kennen Sie schon von Punkt 2. Die zweite Zeile schaltet alle Events ab, wie zum Beispiel Workbook_BeforeSave, Workbook_BeforePrint, Workbook_BeforeClose.
Das heißt, hat EnableEvents den Wert False, wird keines dieser Ereignis ausgeführt. Erst wieder dann, wenn EnableEvents den Wert True hat. Die dritte Zeile in der Funktion schaltet durch den Befehl IIF von manueller Berechnung auf automatische Berechnung um und umgekehrt. Damit wird ebenfalls erreicht, dass in einer Schleife nicht immer alle Formeln in der Tabelle neu berechnet werden. - Überprüfen, ob der Endwert sich innerhalb der Schleife immer wieder neu berechnet. Daraus kann dann eine Endlosschleife entstehen.
Treffen keine dieser Möglichkeiten zu, muss der Inhalt der Schleife nochmals komplett auf den Prüfstand gestellt werden. Um den Fehler zu finden ist es empfehlenswert einzelne oder mehrere Zeilen innerhalb der Schleife aus zukommentieren.