Geschwindigkeit eines Makros in Excel messen
Schritt-für-Schritt-Anleitung
Um die Geschwindigkeit eines Makros in Excel zu messen, kannst Du den Timer in VBA verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:
-
Öffne den VBA-Editor: Drücke ALT + F11
, um den Visual Basic for Applications (VBA) Editor zu öffnen.
-
Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (DeinWorkbookName)" im Projektfenster und wähle Einfügen > Modul
.
-
Code einfügen: Kopiere den folgenden Code in das Modul:
Sub MakroZeitMessen()
Dim t As Single
t = Timer ' Startzeit speichern
' Hier kommt der Code deines Makros
Dim i As Integer
For i = 1 To 10000
Dim s As String
s = "bla"
Next i
Application.StatusBar = "Makrozeit: " & (Timer - t) * 1000 & " ms"
End Sub
-
Makro ausführen: Schließe den VBA-Editor und führe das Makro über Entwicklertools > Makros
aus.
-
Ergebnis überprüfen: Die Zeit, die das Makro benötigt hat, wird in der Statusleiste angezeigt.
Häufige Fehler und Lösungen
-
Fehler bei Mitternacht: Wenn das Makro über Mitternacht läuft, kann es zu falschen Zeitmessungen kommen, da der Timer auf 0 zurückgesetzt wird. Verwende in diesem Fall die QueryPerformanceCounter
-Methode.
-
Falsche Zeitangabe: Wenn die Zeit nicht korrekt ist, überprüfe, ob Du den Timer korrekt initialisiert hast. Achte darauf, die Messung in Millisekunden vorzunehmen, indem Du das Ergebnis mit 1000 multiplizierst, falls nötig.
Alternative Methoden
Eine alternative Methode zur Zeitmessung ist die Verwendung eines Klassenmoduls in VBA, das QueryPerformanceCounter
verwendet. Hier ist ein Beispiel:
-
Neues Klassenmodul erstellen: Füge ein neues Klassenmodul hinzu und nenne es xTimer
.
-
Code für Zeitmessung einfügen:
Option Explicit
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Private Type LARGE_INTEGER
Low As Long
High As Long
End Type
Dim Strt As LARGE_INTEGER
Dim Ende As LARGE_INTEGER
Dim Freq As LARGE_INTEGER
Public Sub Start()
Call QueryPerformanceCounter(Strt)
End Sub
Public Sub Halt()
Call QueryPerformanceCounter(Ende)
End Sub
Public Property Get RunTime() As Double
RunTime = (Ende.Low - Strt.Low) / Freq.Low * 1000 ' ms
End Property
-
Verwendung im Makro: Du kannst den Timer dann in deinem Hauptmakro aufrufen, um die Zeit zu messen.
Praktische Beispiele
Hier ist ein einfaches Beispiel, wie Du die beiden Methoden in der Praxis umsetzen kannst:
Beispiel für die einfache Timer-Methode:
Sub BeispielMakro()
Dim t As Single
t = Timer
' Hier kommt der Code
Application.StatusBar = "Zeit: " & (Timer - t) * 1000 & " ms"
End Sub
Beispiel für die QueryPerformanceCounter
-Methode:
Sub BeispielMakroMitQuery()
Dim timer As New xTimer
timer.Start
' Hier kommt der Code
timer.Halt
MsgBox "Zeit: " & timer.RunTime & " ms"
End Sub
Tipps für Profis
-
Verwende QueryPerformanceCounter
: Für präzisere Messungen, insbesondere wenn Du sehr kurze Laufzeiten messen möchtest, ist QueryPerformanceCounter
die beste Wahl.
-
Statusleiste nutzen: Nutze die Statusleiste, um Informationen während der Makroausführung anzuzeigen. Dies kann helfen, die Benutzerinteraktion zu verbessern.
-
Fehlerbehandlung implementieren: Achte darauf, Fehlerbehandlung in deine Makros einzubauen, um unerwartete Abbrüche zu vermeiden.
FAQ: Häufige Fragen
1. Wie messe ich die Zeit eines Makros in Millisekunden?
Du kannst die Timer
-Funktion verwenden und das Ergebnis mit 1000 multiplizieren, um die Zeit in Millisekunden zu erhalten.
2. Was ist der Unterschied zwischen Timer
und QueryPerformanceCounter
?
Timer
misst in Sekunden mit einer Genauigkeit von Hundertstelsekunden, während QueryPerformanceCounter
eine höhere Präzision in Millisekunden bietet und daher besser geeignet ist, um die Geschwindigkeit eines Makros zu messen.