Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.10.2025 10:28:49
16.10.2025 17:40:39
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Geschwindigkeit eines Makros messen?

Geschwindigkeit eines Makros messen?
24.10.2005 11:36:23
Peter
Hallo zusammen,
ist es mit relativ einfachen Mitteln möglich die Geschwindigkeit eines Makros festzustellen? Ich stelle mir das so vor dass beim Start des Makros ein Timer irgendwie gesetzt wird und nachdem das Makro durchgelaufen ist (aber noch vor End Sub) die benötigte Zeit per "Application.StatusBar = Die Ausführung hat xx sek" dargestellt wird. Hat jemand ne Ahnung wie das geht?
Danke und Gruß
Peter
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Geschwindigkeit eines Makros messen?
24.10.2005 11:44:29
MichaV
Hallo,
mit Bordmitteln geht es nur, wenn das Makro nicht über Mitternacht läuft. Dann setzt sich Timer nämlich auf 0 zurück.
Option Explicit

Sub Test2()
Dim i As Integer
Dim t As Single
Dim s
t = Timer
For i = 1 To 10000
s = "bla"
Next i
Application.StatusBar = "Makrozeit: " & (Timer - t) * 1000 & " ms"
End Sub

Gruss- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Geschwindigkeit eines Makros messen?
24.10.2005 11:54:46
GraFri
Hallo
Mit Klasenmodul in Millisekunden.


      
'------------------- Anfang Code Zeitmessung  --------------------
'Aufruf zum Starten und Stoppen sowie Ausgabe in MSG-Box

Option Explicit
Dim s       As Single
Dim l       As Long
Dim xtime   As New xTimer
Sub Zeit_starten()
  xtime.Calibrieren
  xtime.Start
End Sub
Sub Zeit_stoppen()
  xtime.Halt
  ShowTime
End Sub
Private Sub ShowTime()
  MsgBox "Zeitmessung: " & Format(xtime.RunTime, "0.00 ms")
End Sub
'-------------------- Ende Code Zeitmessung  ---------------------

'------------------- Anfang Code xTimer  --------------------
'Dem Klassenmodul den Namen "xTimer" zuweisen

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
  Lo 
As Long
  Hi 
As Long
End Type
Dim Strt        As LARGE_INTEGER
Dim Ende        As LARGE_INTEGER
Dim Freq        As LARGE_INTEGER
Dim Calibr      As Double
Private Sub Class_Initialize()
  
Call QueryPerformanceFrequency(Freq)
End Sub
Public Sub Calibrieren()
  
Call QueryPerformanceCounter(Strt)
  
Call QueryPerformanceCounter(Ende)
  Calibr = (D(Ende) - D(Strt)) / D(Freq) * 1000 
'ms
End Sub
Public Sub Start()
  
Call QueryPerformanceCounter(Strt)
End Sub
Public Sub Halt()
  
Call QueryPerformanceCounter(Ende)
End Sub
Public Property Get RunTime() As Variant  'ms
  RunTime = (D(Ende) - D(Strt)) / D(Freq) * 1000 - Calibr
End Property
Private Function D(x As LARGE_INTEGER) As Double
  
Dim l As Double, h As Double
    l = x.Lo
    h = x.Hi
    
If l < 0 Then l = 4294967296# + l + 1
    
If h < 0 Then h = 4294967296# + h + 1
    D = l + h * 4294967296#
End Function
'-------------------- Ende Code xTimer  --------------------- 


Bei weiteren Fragen einfach melden.
mfg, GraFri
Anzeige
AW: Geschwindigkeit eines Makros messen?
24.10.2005 11:55:12
Peter
Hallo Micha,
das funktioniert ja perfekt! Und über Mitternacht werde ich diese Funktion nicht brauchen... ;-)
Danke dir also vielmals für deine Lösung!!
Gruß
Peter
AW: Geschwindigkeit eines Makros messen?
24.10.2005 12:05:26
MichaV
Hallo Peter,
danke für Deine Rückmeldung.
Dank GraFri hab ich noch einen kleinen Fehler entdeckt: Die Timer- Zeit wird auf Win- Rechnern bereits in ms gemessen, Du musst die also nicht mit 1000 multiplizieren.
Gruss- Micha
Anzeige
AW: Geschwindigkeit eines Makros messen?
24.10.2005 12:10:58
Peter
Hallo GraFri,
danke auch für deine Profilösung. Für die Zukunft kann ich das sicher mal noch brauchen!
Hallo Micha,
hab den Fehler nun auch ausgemerzt. Nun ist alles perfekt! :)
Gruß
Peter
;
Anzeige
Anzeige

Infobox / Tutorial

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:

  1. Öffne den VBA-Editor: Drücke ALT + F11, um den Visual Basic for Applications (VBA) Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (DeinWorkbookName)" im Projektfenster und wähle Einfügen > Modul.

  3. 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
  4. Makro ausführen: Schließe den VBA-Editor und führe das Makro über Entwicklertools > Makros aus.

  5. Ergebnis überprüfen: Die Zeit, die das Makro benötigt hat, wird in der Statusleiste angezeigt.


Häufige Fehler und Lösungen

  1. 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.

  2. 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:

  1. Neues Klassenmodul erstellen: Füge ein neues Klassenmodul hinzu und nenne es xTimer.

  2. 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
  3. 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.

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