Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Code zu langsam

Forumthread: VBA Code zu langsam

VBA Code zu langsam
03.02.2016 06:10:19
Bernd

Liebe Excelprofis,
mir wurde bereits vor Jahren hier geholfen und habe mir mit dieser Hilfe diese Datei
https://www.herber.de/bbs/user/103241.xlsm
(nur Muster) erstellt.
Es funktioniert alles bis auf eine Kleinigkeit, das ist zwar nicht Lebensnotwendig aber sehr nervig.
Wenn ich in meiner Übersicht den Löschen Button ausführe und danach auf den Sortierenbutton klicke, dauert es ständig 5-7 Sekunden Wartezeit bis ich wieder Zugriff auf die Datei habe um diese z.B.: zu speichern.
Könnte mir jemand bei dem VBA Code so behilflich sein, dass mein vorgenanntes Problem behoben wird?
Ich Danke allen die sich meiner annehmen und wünsche einen schönen Tag,
lg Bernd

Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Steht doch im Code!
03.02.2016 06:18:59
RPP63
Hi!
Entferne im Makro sbName das Hochkomma vor:
'  Application.ScreenUpdating = False     ' evtl. NACH dem Test aktivieren
Gruß Ralf

AW: Steht doch im Code!
03.02.2016 06:56:45
Bernd
Hallo Ralf,
ich Danke Dir für den Hinweis. Trotzdem ich ein paar wenige VBA Kenntnisse habe, wäre ich auf Deine Lösung nicht gekommen.
Ja, es geht etwas schneller nun, aber einige Zeit wird doch benötigt. Ich Denke aber, dass dies aufgrund der größe normal sein wird.
Recht herzlichen Dank für Deine Hilfestellung und liebe Grüße.
mfg Bernd

Anzeige
AW: Steht doch im Code!
03.02.2016 06:59:16
Werner
Hallo Bernd,
da gibt es hier im Netz das Makro GetMoreSpeed, probier das mal aus.
Folgenden Code in dein Modul1 kopieren:
Public Static Sub GetMoreSpeed(Optional ByVal Modus As Boolean = True)
Dim intCalculation As Integer
If Modus = True Then intCalculation = Application.Calculation
With Application
.ScreenUpdating = Not Modus
.EnableEvents = Not Modus
.Calculation = IIf(Modus = True, xlManual, intCalculation)
.Cursor = IIf(Modus = True, 2, -4143)
End With
End Sub
Dann am Anfang des Codes deines Sortierenbuttons dann so aufrufen:
Sub sbName()
Dim strN As String, X As Long, Y As Long, i As Long
GetMoreSpeed (True)
With Sheets("01. Übersichtsliste")
.Unprotect
For X = 1 To Worksheets.Count - 1
For Y = X + 1 To Worksheets.Count
If Worksheets(Y).Name < Worksheets(X).Name Then
Worksheets(Y).Move Before:=Worksheets(X)
End If
Next Y
Next X
.Activate
Range("A:B").ClearContents
Application.PrintCommunication = False
For i = 1 To Worksheets.Count
strN = Worksheets(i).Name
.Cells(i + 2, 2) = strN
.Hyperlinks.Add Anchor:=Cells(i + 2, 2), Address:="", _
SubAddress:="'" & strN & "'!A1", TextToDisplay:=strN
If .Name <> strN Then
.Cells(i + 2, 1) = i - 1
Worksheets(i).Cells(2, 2).Value = i - 1
Worksheets(i).PageSetup.RightFooter = CStr(i - 1)
End If
Next i
.Columns("A:A").EntireColumn.AutoFit
Application.PrintCommunication = True
Application.GoTo Reference:="R3C1"
.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
GetMoreSpeed (False)
End Sub
Gruß Werner

Anzeige
AW: Steht doch im Code!
03.02.2016 07:02:30
Bernd
Hallo Werner,
habe auch Deinen Vorschlag getestet und komme zum selben Ergebnis wie beim Vorschlag von Ralf.
Auch Dir ein dickes Dankeschön für Deine Mühen.
lg Bernd

AW: Danke für die Rückmeldung. o.w.T.
03.02.2016 19:45:37
Werner

;
Anzeige

Infobox / Tutorial

Optimierung von VBA-Code für schnellere Ausführung


Schritt-für-Schritt-Anleitung

Um die Ausführung Deines VBA-Codes zu beschleunigen, kannst Du folgende Schritte befolgen:

  1. Hochkomma entfernen: Im Makro sbName solltest Du das Hochkomma vor Application.ScreenUpdating = False entfernen. Dies wird dazu führen, dass Excel die Bildschirmaktualisierung während der Ausführung des Codes pausiert:

    Application.ScreenUpdating = False
  2. GetMoreSpeed-Makro einfügen: Füge das folgende Makro in Dein Modul ein. Es hilft, die Geschwindigkeit zu erhöhen, indem es die Bildschirmaktualisierung und Berechnungen steuert:

    Public Static Sub GetMoreSpeed(Optional ByVal Modus As Boolean = True)
       Dim intCalculation As Integer
       If Modus = True Then intCalculation = Application.Calculation
       With Application
           .ScreenUpdating = Not Modus
           .EnableEvents = Not Modus
           .Calculation = IIf(Modus = True, xlManual, intCalculation)
           .Cursor = IIf(Modus = True, 2, -4143)
       End With
    End Sub
  3. Aufruf des GetMoreSpeed-Makros: Platziere den Aufruf des GetMoreSpeed-Makros am Anfang und am Ende Deines sbName-Makros:

    Sub sbName()
       GetMoreSpeed (True)
       ' ... dein bestehender Code ...
       GetMoreSpeed (False)
    End Sub
  4. Testen: Führe nun Dein Makro aus und überprüfe, ob sich die Ausführungszeit beim Sortieren und Löschen verringert hat.


Häufige Fehler und Lösungen

  • Fehler: Der Code läuft immer noch langsam.

    • Lösung: Stelle sicher, dass alle Bildschirmaktualisierungen und Berechnungen deaktiviert sind, bevor der Code ausgeführt wird. Überprüfe auch andere Teile des Codes, die möglicherweise ineffizient sind.
  • Fehler: Der Code funktioniert nicht.

    • Lösung: Überprüfe, ob Du den Code genau wie beschrieben eingefügt hast. Achte darauf, dass alle Variablen und Objekte korrekt definiert sind.

Alternative Methoden

Wenn die obigen Methoden nicht ausreichen, kannst Du auch folgende Alternativen ausprobieren:

  • Effiziente Datenstrukturen verwenden: Überlege, ob Du Dictionaries oder Collections verwenden kannst, um Daten effizienter zu verwalten.
  • Optimierung von Schleifen: Reduziere die Anzahl der Iterationen in Schleifen, wo immer es möglich ist.

Praktische Beispiele

Hier ist ein Beispiel für einen optimierten VBA-Code, der die oben genannten Techniken verwendet:

Sub sbName()
    GetMoreSpeed (True)
    With Sheets("01. Übersichtsliste")
        .Unprotect
        ' Sortierlogik hier
        ' ...
        .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End With
    GetMoreSpeed (False)
End Sub

In diesem Beispiel wird die Geschwindigkeit der Sortierung durch das Deaktivieren der Bildschirmaktualisierung und der Berechnung während der Ausführung des Codes erhöht.


Tipps für Profis

  • Verwende Debugging: Nutze die Debugging-Funktionen von VBA, um Engpässe im Code zu identifizieren.
  • Profiling-Tools: Es gibt Tools, die Dir helfen können, die Ausführungszeit verschiedener Teile Deines Codes zu analysieren.

FAQ: Häufige Fragen

1. Warum ist mein VBA-Code langsam? Der Code kann aus verschiedenen Gründen langsam sein, darunter ineffiziente Schleifen, Bildschirmaktualisierungen oder Berechnungen.

2. Wie kann ich die Ausführungsgeschwindigkeit meines Codes testen? Du kannst die Zeit messen, die zur Ausführung des Codes benötigt wird, indem Du die Funktionen Timer oder Now verwendest, um die Start- und Endzeit zu erfassen.

3. Was sind die besten Praktiken für effizienten VBA-Code? Verwende möglichst viele native Excel-Funktionen, reduziere die Anzahl der Bildschirmaktualisierungen und vermeide unnötige Berechnungen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige