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

Forumthread: Einfaches Makro schneller machen

Einfaches Makro schneller machen
09.05.2017 16:34:46
Gerd
Hallo,
ich möchte gerne in zwei Tabellen, deren Inhalt sich täglich ändert, bestimmte Werte suchen und bei den entsprechenden Zellen den Hintergrund grau färben + den jeweiligen Wert in die erste Spalte der Tabellen schreiben.
Ich verwende dazu folgenden Ansatz, der auch wie geplant funktioniert.
Leider braucht das Makro dafür über eine Minute, was mir für eine solche Aktion sehr lange vorkommt (zudem ist es nur Teil eines größeren Makros).
Beide Tabellen sind nicht groß und enthalten nur ca. 500 bzw. 100 Werte.
Kann mir jemand sagen, wie man hier Zeit sparen oder den Code effektiver schreiben kann ?
Mein Code:
Sub PrepareRankRecords(varMode As String)
Call RankRecords(varMode, 10000)
Call RankRecords(varMode, 5000)
Call RankRecords(varMode, 2000)
Call RankRecords(varMode, 1500)
Call RankRecords(varMode, 1000)
Call RankRecords(varMode, 500)
End Sub
Sub RankRecords(varMode As String, varRank As Integer)
Dim cell As Range, varRange As Range
If varMode = "DSP" Then
' table AE:AJ
Application.StatusBar = "90 % - Ranking table AE:AJ"
DoEvents
Set varRange = Range("$AI$3", Cells(Rows.Count, "AI").End(xlUp)).Cells
Else
' table X:AC
Application.StatusBar = "60 % - Ranking table X:AC"
DoEvents
Set varRange = Range("$AB$3", Cells(Rows.Count, "AB").End(xlUp)).Cells
End If
With Worksheets(4)
For Each cell In varRange
If cell.Offset(0, -3).Value  "" Then
If cell.Value 
Vielen Dank im Voraus für Eure Hilfe.
VG,
Gerd
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Einfaches Makro schneller machen
09.05.2017 16:51:32
ChrisL
Hi Gerd
Die üblichen Tipps findest du via Recherche u.a.
Sub t()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' dein Code
Application.Calculation = xlCalculationAutomatic
End Sub
Hast du noch mehr Code (z.B. Worksheet_Change Ereignis)?
Erst färbst du alle Werte kleiner 10000 ein. Dann alle kleiner 5000 usw. Aber die Werte kleiner 10000 beinhalten doch auch alle anderen Grenzwerte?
Warum nicht mit bedingter Formatierung?
cu
Chris
Anzeige
AW: Einfaches Makro schneller machen
09.05.2017 17:10:36
Gerd
Hi Chris,
danke für Deine Nachricht !
Die Calculation schalte ich schon aus und ein, das habe ich hier nur nicht mit kopiert.
Ich möchte aber nicht alle Werte einfärben, sondern nur die jeweiligen Grenzwerte, d.h. den ersten Wert kleiner 10000, dann den ersten Wert kleiner 5000 usw. + ich muss dann die jeweiligen Werte in die erste Spalte schreiben.
Mein Makro funktioniert wie gesagt, es ist nur sehr langsam aufgrund des Loops.
VG,
Gerd
Anzeige
AW: Einfaches Makro schneller machen
09.05.2017 18:06:04
ChrisL
Hi Gerd
OK, das Exit For habe ich übersehen und jetzt macht es Sinn.
Trotzdem, eine Minute ist (zu) lang für diesen Code bei 100-500 Zeilen. Teste den Code mal in einer Dummy-Datei (nur Spalte AB resp. AI mit Daten), ich würde wetten du wartest keine Minute. Somit liegt das Problem nicht am gezeigten Code und wir können nur raten. Best guess: WS-Change Event
cu
Chris
Anzeige
AW: Einfaches Makro schneller machen
09.05.2017 18:22:23
Gerd
Hallo Chris,
vielen Dank nochmal !
In den Blättern selbst verwende ich hier kein VBA, d.h. es gibt auch keine Change Events o.ä.
Dieses Makro alleine in einer separaten Datei läuft tatsächlich wesentlich schneller.
Ich glaube, da muss ich mir mal die Pivots und Tabellen genauer anschauen.
Trotzdem danke.
VG,
Gerd
Anzeige
AW: Einfaches Makro schneller machen
09.05.2017 18:37:36
ChrisL
Hi Gerd
Jetzt wird es langsam interessant. Lass wissen, wenn du etwas rausfindest :)
Noch zwei Testfälle:
- Calculation ausnahmsweise ausgeschaltet lassen (liegt es vielleicht an der Neuberechnung ganz allgemein)
- Schrittweise Tabellenblätter löschen (vielleicht kannst du das Problem auf ein Blatt eingrenzen).
Falls die Liste sortiert ist, könnte man evtl. auch ohne Schleife (=VERGLEICH() resp. Application.Match).
cu
Chris
Anzeige
AW: Einfaches Makro schneller machen
09.05.2017 18:56:42
Gerd
Hallo Chris,
es liegt tatsächlich an der Neuberechnung, zumindest es stark danach aus - hängt vielleicht mit den Pivots zusammen.
Mein ganzes Makro (das hier ist nur ein Teil) braucht ca. 1,5 Minuten.
Ich schalte die Calculation gleich zu Beginn aus und dann nach jedem Teil-Makro wieder ein (da ich in jedem Teil-Makro Spalten kopiere und einfüge).
Nur die Neuberechnungen machen ca. 70 % der Laufzeit aus.
Beide Tabellen sind jeweils absteigend nach den Werten in der Spalte sortiert, in der ich hier suche.
VG,
Gerd
Anzeige
AW: Einfaches Makro schneller machen
09.05.2017 19:12:39
ChrisL
Hi Gerd
Für VERGLEICH müsste die Liste aufsteigend sortiert sein, Pech :)
Wenn ein Zwischenschritt die Neuberechnung tatsächlich erfordert, dann kannst du auch gezielt z.B. nur ein Blatt oder Bereich berechnen. z.B.
Worksheets("xy").Range("A1:B100").Calculate
Volatile Funktionen meiden siehe z.B.
http://www.tabellenexperte.de/excel-im-schneckentempo-volatile-funktionen/
cu
Chris
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Einfaches Makro schneller machen


Schritt-für-Schritt-Anleitung

Um dein Makro schneller zu machen, kannst du die folgenden Schritte befolgen:

  1. Deaktiviere die Bildschirmaktualisierung und Berechnung: Dies kann die Geschwindigkeit deines Makros erheblich verbessern. Um dies zu erreichen, kannst du deinen Code wie folgt anpassen:

    Sub t()
       Application.ScreenUpdating = False
       Application.Calculation = xlCalculationManual
       ' Dein bestehender Code hier
       Application.Calculation = xlCalculationAutomatic
       Application.ScreenUpdating = True
    End Sub
  2. Verwende bedingte Formatierung: Anstatt die Zellen manuell zu färben, kannst du die bedingte Formatierung in Excel verwenden, um die Werte automatisch zu färben, wenn sie bestimmte Kriterien erfüllen. Das spart Zeit und Ressourcen.

  3. Vermeide unnötige Schleifen: Wenn möglich, versuche, die Schleifen zu reduzieren. Stattdessen kannst du Funktionen wie VERGLEICH() oder Application.Match nutzen, um schneller Ergebnisse zu erhalten.

  4. Optimiere die Datenstruktur: Wenn deine Daten in einer bestimmten Reihenfolge (z.B. aufsteigend) sortiert sind, kann dies die Suche nach Werten beschleunigen.


Häufige Fehler und Lösungen

  • Fehler: Langsame Ausführung des Makros
    Lösung: Überprüfe, ob die Neuberechnung der Excel-Datei den größten Teil der Laufzeit ausmacht. Schalte die Berechnung vor dem Ausführen des Makros aus.

  • Fehler: Bildschirmaktualisierung führt zu Verzögerungen
    Lösung: Deaktiviere die Bildschirmaktualisierung mit Application.ScreenUpdating = False, um die Performance zu verbessern.

  • Fehler: Schleifen sind zu lang
    Lösung: Reduziere die Anzahl der Schleifen und suche nach Möglichkeiten, die Logik zu optimieren.


Alternative Methoden

  • Verwendung von Array-Operationen: Anstatt Zellen einzeln zu bearbeiten, kannst du die Daten in Arrays laden, die Berechnungen durchführen und das Ergebnis wieder zurück in die Zellen schreiben. Dies kann die Verarbeitungsgeschwindigkeit erheblich erhöhen.

  • VBA-Funktionen: Optimiere deinen VBA-Code, indem du Funktionen nutzt, die Excel bereits bietet. Einige Funktionen sind in VBA schneller als das Programmieren von Schleifen.


Praktische Beispiele

Beispiel eines optimierten Makros:

Sub OptimiertesMakro()
    Dim cell As Range
    Dim varRange As Range

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Set varRange = Range("$AB$3", Cells(Rows.Count, "AB").End(xlUp)).Cells

    For Each cell In varRange
        If cell.Offset(0, -3).Value <> "" Then
            If cell.Value < 10000 Then
                cell.Interior.Color = RGB(128, 128, 128) ' Grau färben
                ' Wert in die erste Spalte schreiben
                cell.Offset(0, -1).Value = cell.Value
                Exit For ' Schleife verlassen, um Zeit zu sparen
            End If
        End If
    Next cell

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Tipps für Profis

  • Teste deine Makros in einer Dummy-Datei: Manchmal kann die Komplexität der Originaldatei die Leistung beeinträchtigen. Teste deinen Code in einer einfachen Excel-Datei, um die Ausführungszeit zu überprüfen.

  • Vermeide volatile Funktionen: Diese können die Berechnungszeit erheblich verlängern. Nutze stattdessen feste Werte oder Berechnungen, die nicht ständig aktualisiert werden müssen.

  • Experimentiere mit verschiedenen Berechnungseinstellungen: Stelle sicher, dass du die Berechnungsoptionen optimal für dein Makro einstellst, um die Geschwindigkeit zu maximieren.


FAQ: Häufige Fragen

1. Wie kann ich meine Excel-Datei schneller machen?
Du kannst die Bildschirmaktualisierung deaktivieren, die Berechnung auf manuell setzen und Schleifen optimieren.

2. Welche Rolle spielt die Neuberechnung in Excel?
Die Neuberechnung kann die Ausführungsgeschwindigkeit eines Makros erheblich beeinträchtigen, insbesondere wenn viele Formeln in der Datei vorhanden sind.

3. Was sind volatile Funktionen und warum sollte ich sie vermeiden?
Volatile Funktionen sind Formeln, die sich bei jeder Änderung in der Datei neu berechnen. Sie können die Leistung beeinträchtigen, wenn sie häufig aufgerufen 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