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

Code dauert sehr lange !

Forumthread: Code dauert sehr lange !

Code dauert sehr lange !
09.05.2013 16:38:25
rieckmann
Hallo,
ich habe auf der Arbeit nur ein altes Notebook mit Office XP.
Nun habe ich eine Mappe die beim Öffnen das Makro startet.
Es soll bestimmte Spalten in mehreren Tabellenblätter durchlaufen um Leerzeichen einzufügen.
Das Makro wurde hier im Forum erstellt.
Ich habe es lediglich für eine weitere Spalte erweitert.
Nun ist es aber so dass es eine gefühlte Ewigkeit dauert bis es abgearbeitet ist.
Könnt ihr mal schauen ob man es vekürzen oder abändern kann damit es auf dem alten Rechner schneller durchläuft ?
Hier der Code:
Private Sub Workbook_Open()
Dim wks As Worksheet
Dim rngC As Range
Application.ScreenUpdating = False
For Each wks In Worksheets
With wks
For Each rngC In .Range(.Cells(2, 10), .Cells(Rows.Count, 10).End(xlUp))
rngC = Replace(Replace(rngC, " ", ""), ".", ". ")
Next
End With
Next
For Each wks In Worksheets
With wks
For Each rngC In .Range(.Cells(2, 8), .Cells(Rows.Count, 10).End(xlUp))
rngC = Replace(Replace(rngC, " ", ""), ".", ". ")
Next
End With
Next
End Sub

Gruß
Fred

Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code dauert sehr lange !
09.05.2013 16:44:22
Oberschlumpf
Hi Fred
Schreib nur diesen Code rein, also nur eine wks-Schleife:
  For Each wks In Worksheets
With wks
For Each rngC In .Range(.Cells(2, 10), .Cells(Rows.Count, 10).End(xlUp))
rngC = Replace(Replace(rngC, " ", ""), ".", ". ")
Next
For Each rngC In .Range(.Cells(2, 8), .Cells(Rows.Count, 10).End(xlUp))
rngC = Replace(Replace(rngC, " ", ""), ".", ". ")
Next
End With
Next

Hilfts?
Ciao
Thorsten

Anzeige
AW: Code dauert sehr lange !
09.05.2013 17:35:32
rieckmann
Hallo Thorsten,
ich danke dir.
Ich werde es nächste Woche bei der Arbeit ausprobieren.
Schönen Vatertag noch
Gruß
Fred

AW: Code dauert sehr lange !
09.05.2013 20:11:14
JoWE
Hallo Fred,
schon mal so versucht?
Sub test()
Dim wks As Worksheet
Dim r1 As Range
Dim r2 As Range
Set wks = ActiveSheet
With wks
Set r1 = .Range("J2:J" & .Cells(Rows.Count, 10).End(xlUp).Row)
r1.Replace What:=" ", Replacement:=""
r1.Replace What:=".", Replacement:=". "
Set r2 = .Range("H2:H" & .Cells(Rows.Count, 8).End(xlUp).Row)
r1.Replace What:=" ", Replacement:=""
r1.Replace What:=".", Replacement:=". "
End With
Set r1 = Nothing
Set r2 = Nothing
Set wks = Nothing
End Sub
Gruß
Jochen

Anzeige
AW: Code dauert sehr lange !
09.05.2013 21:05:43
rieckmann
Hallo Jochen,
auch das werde ich nächste Woche ausprobieren wenn ich bei der Arbeit bin.
Mal sehen welcher Code schneller ist !
Danke dir für die Hilfe
Gruß
Fred

AW: Code dauert sehr lange ! Makrobremsen
10.05.2013 08:34:24
fcs
Hallo Fred,
beachte bitte, dass die Bildschirm-Aktualisierung nur eines von mehreren Elementen ist, die die Ausführung von Makros ausbremsen.
Kritisch sind auch der Berechnungsmodus für Formeln (Automatisch / Manuel) und Ereignismakros in deinem Fall ggf. das Worksheet_Change-Ereignismakro.
In Arbeitsmappen mit umfangreichem Formelwerk oder auch komplexen Marix und Vereisformeln sollte der Berechnungsmodus vorübergehend auf Manuel gesetzt werden.
Sind in den Tabellen Ereignismakros-Integriert, dann sollten diese temporär deaktiviert werden.
Gruß
Franz
Sub MakroTest()
Dim StatusCalc
'Makrobremsen lösen - Am beginn eine sMakros
With Application
.EnableEvents = False
StatusCalc = .Application.Calculation 'Aktuellen Berechnungsmodus merken
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
' Hauptprozedur
Beenden: 'Sprungadresse zum Beenden diese Makros - nicht mit Exit Sub arbeiten!!
'Makrobremsen zurücksetzen - vor dem Beenden eines Makros
With Application
.EnableEvents = True
.Calculation = StatusCalc
.ScreenUpdating = True
End With
End Sub

Anzeige
AW: Code dauert sehr lange ! Makrobremsen
10.05.2013 08:41:01
rieckmann
Hallo Franz,
tolle Erklärung.
Das werde ich mir abspeichern und ausprobieren.
Danke und Gruß
Fred

AW: Code dauert sehr lange ! Makrobremsen
10.05.2013 09:28:58
Klaus
Hi Fred,
die Idee von Franz ist so gut, dass man sie häufiger einsetzen will. Das geht sehr komfortabel. Hier im Forum ist mal diese Sub rumgegangen (ich weiss leider nicht mehr, von wem die ursprünglich stammt!)

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

Den ganzen Code in ein leeres Modul, dann rechtsclick auf das Modul und "exportieren". So wird das Modul als *.bas gespeichert.
Bei deinem nächsten Projekt, bei dem du das brauchst, einfach das vorhandene Modul wieder importieren und folgendermaßen benutzen:
Sub MakroOhneBremse()
On Error GoTo beenden
GetMoreSpeed (True)
[aufwendiger, rechenintensiver Code]
beenden:
GetMoreSpeed (False)
End Sub
Dadurch sparst du dir das dutzendfache abtippen der Prozedur, wenn du sie in mehr als einem Makro / Projekt gleichzeitig benutzen willst.
Grüße,
Klaus M.vdT.

Anzeige
AW: Code dauert sehr lange ! Makrobremsen
10.05.2013 10:30:31
rieckmann
Hallo Klaus,
super Idee.
Danke dir
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

So optimierst du langsame Excel-Makros


Schritt-für-Schritt-Anleitung

  1. Makro öffnen: Öffne die Excel-Datei, die das langsame Makro enthält.

  2. Code anpassen: Ersetze den bestehenden Code mit einem optimierten Ansatz. Hier ist ein Beispiel, das die Anzahl der Schleifen reduziert:

    Private Sub Workbook_Open()
        Dim wks As Worksheet
        Dim rngC As Range
        Application.ScreenUpdating = False
    
        For Each wks In Worksheets
            With wks
                For Each rngC In .Range(.Cells(2, 10), .Cells(Rows.Count, 10).End(xlUp))
                    rngC = Replace(Replace(rngC, " ", ""), ".", ". ")
                Next
                For Each rngC In .Range(.Cells(2, 8), .Cells(Rows.Count, 8).End(xlUp))
                    rngC = Replace(Replace(rngC, " ", ""), ".", ". ")
                Next
            End With
        Next
    
        Application.ScreenUpdating = True
    End Sub
  3. Berechnungsmodus einstellen: Setze den Berechnungsmodus auf „Manuell“, um die Excel-Berechnung zu beschleunigen, besonders wenn viele Formeln in der Arbeitsmappe vorhanden sind. Dies kannst du mit folgendem Code erreichen:

    Sub MakroTest()
        Dim StatusCalc
        With Application
            .EnableEvents = False
            StatusCalc = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
        End With
    
        ' Hauptprozedur hier einfügen
    
        With Application
            .EnableEvents = True
            .Calculation = StatusCalc
            .ScreenUpdating = True
        End With
    End Sub
  4. Makro testen: Führe das Makro aus und überprüfe, ob die Ausführungszeit kürzer ist.


Häufige Fehler und Lösungen

  • Makro läuft ewig: Achte darauf, dass du die Bildschirmaktualisierung (Application.ScreenUpdating) und den Berechnungsmodus (Application.Calculation) korrekt einstellst. Dies kann helfen, wenn die Excel-Berechnung lange dauert.

  • Fehlerhafte Bereiche: Stelle sicher, dass die angegebene Range korrekt ist. Ein falscher Bereich kann dazu führen, dass das Makro mehr Zellen bearbeitet als nötig.


Alternative Methoden

  • Verwendung der Replace-Methode: Statt mehrere For Each-Schleifen zu verwenden, kannst du die Replace-Methode für die gesamte Range verwenden:

    Sub OptimizedReplace()
        Dim r As Range
        Set r = ActiveSheet.Range("J2:J" & ActiveSheet.Cells(Rows.Count, 10).End(xlUp).Row)
        r.Replace What:=" ", Replacement:=""
        r.Replace What:=".", Replacement:=". "
    End Sub
  • Bulk-Operationen: Anstatt Zellen einzeln zu bearbeiten, versuche, die gewünschten Änderungen auf einmal vorzunehmen, um die Performance zu verbessern.


Praktische Beispiele

  • Beispiel für das Entfernen von Leerzeichen in Spalten:

    Sub RemoveSpaces()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
            ws.Range("J2:J" & ws.Cells(Rows.Count, "J").End(xlUp).Row).Replace What:=" ", Replacement:=""
            ws.Range("H2:H" & ws.Cells(Rows.Count, "H").End(xlUp).Row).Replace What:=" ", Replacement:=""
        Next ws
    End Sub
  • Makro zur Umwandlung von Zahlen: Falls du Daten in Zahlen umwandeln musst, könnte folgendes hilfreich sein:

    Sub ConvertToNumber()
        Dim rng As Range
        Set rng = ActiveSheet.Range("A1:A100") ' Beispielbereich
        rng.Value = rng.Value ' Umwandlung in Zahl
    End Sub

Tipps für Profis

  • Modularer Code: Lagere häufig verwendete Funktionalitäten in separate Subroutinen aus. So behältst du den Überblick.
  • Profiling: Teste den Code regelmäßig auf Performance und identifiziere Engpässe.
  • Verwendung von Arrays: Wenn du mit großen Datenmengen arbeitest, ziehe in Betracht, die Daten in ein Array zu laden, bevor du sie bearbeitest. Dies kann die Geschwindigkeit erheblich steigern.

FAQ: Häufige Fragen

1. Warum dauert meine Excel-Berechnung lange?
Die Berechnung kann lange dauern, wenn viele Formeln, Datenverknüpfungen oder komplexe Berechnungen vorhanden sind. Das Reduzieren der Bildschirmaktualisierung und das temporäre Setzen des Berechnungsmodus auf „Manuell“ können helfen.

2. Wie kann ich die Ausführungsgeschwindigkeit meines Makros erhöhen?
Verwende weniger Schleifen, optimiere die Range-Bereiche und setze Application.ScreenUpdating sowie Application.Calculation strategisch ein.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige