Warum wird VBA durch Optimierung langsamer?
Liebe Community,
ich habe über den Makroaufnahme ein umfangreiches Makro aufgenommen. Typisch dafür ist, dass oft der Befehl Select benutzt wird. Da ich gelesen habe, dass dadurch die Geschwindigkeit verlangsamt wird und weggelassen werden sollte, habe ich das so befolgt.
Vorher ist das Makro innerhalb weniger Sekunden durchgelaufen, jetzt braucht es circa eine Minute. Ich habe mal ein Beispiel angehängt, wo man den Zeitverlust sehr deutlich bemerkt.
Habe ich da was falsch gemacht?
Vorher:
Cells.Select
Range("B13").Activate
With Selection.Font
.Name = "Calibri"
.Size = 14
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.ThemeFont = xlThemeFontMinor
End With
Nachher:
With Cells.Font
.Name = "Calibri"
.Size = 14
.ThemeColor = xlThemeColorLight1
.ThemeFont = xlThemeFontMinor
End With
Ich habe eher wenig Ahnung von VBA, habe mich durch Ausprobieren und Internetseiten rumgeschlagen.
Vielen Dank schonmal für Antworten.
Lamio13
3 Antworten
Ja genau - jetzt wird die Formatierung für alle Zellen durchgeführt.
Grundsätzlich immer auf Select und Activate verzichten. Alles, was man sieht, ist ein Objekt und kann eindeutig identifiziert werden.
Also man könnte z.B. schreiben:
With ActiveSheet.Cells(13,2).Font
- jetzt hier die ganzen Formatierungen
End With
Und wenn Du die Zelle B13 (in der Cells Schreibweise ist das die 13te Zeile und 2te Spalte - deshalb Cells(13,2) ) aus einem anderen Sheet formatieren willst, ist es egal, wo Du stehst, dann benennst Du einfach das Sheet, Beispiel:
With Worksheets("Blattname").Cells(13,2).Font
...
End With
Bezogen auf den ersten Code: Allerdings wird ja nur die Zelle aktiviert, aber formatiert wird schon das gesamte Tabellenblatt und nicht nur B13, "Cells.Select". Wenn ich "Range("B13").Activate" herauslösche, bleibt die Geschwindigkeit identisch, also weiterhin schnell.
Auf den ersten Blick würde ich schauen, welche Zellen durch das verkürzte Makro bearbeitet werden.
Ich habe den Verdacht, ohne jetzt in den Code während der Laufzeit geschaut zu haben, dass der originale Code nur eine Zelle, B13, bearbeitet, während der gekürzte eventuell sogar das gesamte Tabellenblatt mit all seinen Zellen erfassen könnte.
Schau Dir mal an, wie man mit dem Debugger und Stopppunkten umgeht, auch mit der Zeilenweisen Ausführung F8.
Excel VBA Debugging ist zum Beispiel hier beschrieben, wobei ich gerade wesentlich bessere Videos in englischer Sprache gefunden habe:
Hilft Dir das?
Grundsätzlich immer nur soviel ändern wie nötig.
Zunächst also den Bereich ermitteln, der angepasst werden muss.
Hier hilft
UntersteZeile = Worksheets("Bla").UsedRange.Rows.Count
RechtesteSpalte = Worksheets("Bla").UsedRange.Columns.Count
Application.EnableEvents = False 'Abschalten der ExcelEvents damit es sich nur um die nächsten Zeilen kümmert
Range(Cells(1,1),Cells(UntersteZeile, RechtesteSpalte)).Font.Name = "Calibri"
Range(Cells(1,1),Cells(UntersteZeile, RechtesteSpalte)).Font.Size = 14
Range(Cells(1,1),Cells(UntersteZeile, RechtesteSpalte)).Font.ThemeColor = xlThemeColorLight1
Range(Cells(1,1),Cells(UntersteZeile, RechtesteSpalte)).Font.ThemeFont = xlThemeFontMinor
Application.EnableEvents = True 'Nicht vergessen dies wieder anzuschalten.
Schonmal danke. Das Video habe ich noch nicht ganz angeschaut. Ich habe gerade nochmal probiert, folgende Zeile auszukommentieren:
Somit bleibt es auf jeden Fall, dass auch im ersten Code alle Zellen formatiert werden, das ändert jedoch nichts an der Geschwindigkeit.