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

Limit von DoEvents

Forumthread: Limit von DoEvents

Limit von DoEvents
04.07.2018 08:04:10
DoEvents
Guten morgen zusammen,
ich habe ein kleines Programm geschrieben, welches für mich in regelmäßigen Abständen einen Mausclick durchführen soll. Dieses funktioniert an sich auch sehr gut, aber offenbar stößt es zeitlich an seine Grenzen. Die Aktion soll im ca. 5 Minuten Rythmus durchgeführt werden und beispielsweise 9999x wiederholt werden. Aber ich stelle fest, dass ich das Makro/Programm bereits nach einem Tag wieder erneut starten muss, da er sich irgendwie aufhängt bzw. stoppt.
Hier mal ein Ausschnitt des Codes:

Private Sub Button_Start_Click()
Dim i, j As Integer
' Ausführung und Wiederholung des Mausclicks
For i = 1 To Me.TextBox_Wiederholungen.Value
DoEv
Me.Move_Cursor_to
SendMausklick MOUSE_LEFT
Next i
End Sub
' Definiert die Wartezeit zwischen Mausclicks
Sub DoEv()
Dim Start, Startzeit
Start = Timer
Startzeit = Time
' Wenn Sekunden gewählt sind
If Me.OB_Sek.Value = True Then
Do While Timer 
In den Textboxen Intervall und Wiederholungen kann man entsprechend definieren, wie oft und in welchem Abstand gedrückt werden soll.
Jemand eine Idee, wieso es nach ca. einem Tag stoppt? Gibt es eine gewisse Laufzeitbegrenzung von VBA?
Zur Information: Der Rechner, auf dem das Makro läuft, wird nicht parallel anders benutzt, eigentlich läuft dort nur das Makro, sodass keine menschliche Aktion es irgendwie unterbrechen könnte.
Vielen Dank im Voraus!
LG
Sascha
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Timer = #Sekunden seit Mitternacht! (owT)
04.07.2018 08:17:26
EtoPHG

AW: Timer = #Sekunden seit Mitternacht! (owT)
04.07.2018 08:53:57
Sascha
Hm okay, da hatte ich nicht dran gedacht.
Das heißt, ich müsste eine Abfrage einbauen, die beispielsweise prüft, ob
(Start-Timer) > 10.000
~f~
ist (zu groß für ein normales Intervall, sprich es muss grade der Umsprung auf den nächsten Tag sein).
Bsp. Start um 23:59 (=86340), und Timer wird irgendwann bei 0:00 zu "1", dadurch wird
~f~
"Start-Timer" > 10.000
Würde es das Problem beheben, wenn ich diesem Fall "Start" wieder neu auf "Timer" setze?
Ich bin mir zudem unsicher, an welche Stelle ich genau diese Abfrage einbauen sollte.
In die Do While Schleife, oder davor?
Anzeige
AW: Limit von DoEvents
04.07.2018 08:39:24
DoEvents
Hi
Wie schon geschrieben, Timer sind die Sekunden seit Mitternacht, dh Timer wird um Mitternacht auf 0 zurückgesetzt.
Wenn jetzt Start+Intervall auf den nächsten Tag fällt, kann Timer diesen Wert nie erreichen und du hast eine Endlosschleife.
Lösung: verwende statt Timer immer Date + Timer
( nicht nur Uhrzeit, sondern Datum+Uhrzeit)
Ansonsten schau dir auch mal Application.Ontime an.
Damit kannst du Makros zu einem definierten Datum+Uhrzeit starten lassen, dann muss nicht permanent die DoEvents-Schleife laufen.
Die DoEvents-Schleife mit Timer nimmt man dann, wenn die Intervalle kleiner als Sekunden sind.
Gruß Daniel
Anzeige
AW: Limit von DoEvents
04.07.2018 09:05:04
DoEvents
Danke für den Vorschlag!
Grade noch eine andere Idee gehabt.
Würde der Einbau der folgenden Abfrage + Anweisung das Problem beheben?
' Definiert die Wartezeit zwischen Mausclicks
<pre>Sub DoEv()
Dim Start, Startzeit
Start = Timer
Startzeit = Time
' Wenn Sekunden gewählt sind
If Me.OB_Sek.Value = True Then
If (Start + Me.TextBox_Intervall.Value) > 86400 Then
Start = 0
End If
Do While Timer < Start + Me.TextBox_Intervall.Value
DoEvents
Loop
' Wenn Minuten gewählt sind
ElseIf Me.OB_Min.Value = True Then
If (Start + Me.TextBox_Intervall.Value) > 86400 Then
Start = 0
End If
Do While Timer < Start + (Me.TextBox_Intervall.Value * 60)
DoEvents
Loop
Else
MsgBox "ungültige Eingabe"
End If
End Sub</pre>
Anzeige
AW: Limit von DoEvents
04.07.2018 09:11:39
DoEvents
Hallo
Es gibt auch eine Wait Funktion (Beispiel wartet 1 Minute)

Application.Wait (Now + TimeValue("0:01:00"))

@Peter
04.07.2018 09:16:23
RPP63
Moin!
Application.Wait lässt (nomen est omen) die Application warten!
Insofern ist Excel tot und wartet brav ab …
Gruß Ralf
Anzeige
AW: Limit von DoEvents
04.07.2018 10:02:55
DoEvents
Hi
eine Lösung mit Application.Ontime würde so aussehen:
1. dieser Code in einem allgeminen Modul
Option Explicit
Public NächsterStart As Date
Public Anz As Long
Sub MeinMakro()
Anz = Anz + 1
If Anz 
dieser Code im Modul "DieseArbeitsmappe"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If NächsterStart > Now Then
Select Case MsgBox("Bearbeitungschleife läuft. Soll diese beendet werden?", vbYesNo +  _
vbQuestion)
Case vbYes
Application.OnTime Now, "MeinMakro", schedule:=False
Case Else
End Select
End If
End Sub

hiermit steuerst du, ob bei einem Schließen der Datei die Schleife trotzdem weiter laufen soll.
Sofern Excel nicht beendet wurde, wird ein per Application.Ontime aufgerufenes Makro auch ausgeführt, wenn die betroffene Datei geschlossen wurde (sie wird dazu wieder geöffnet, aber Excel muss laufen)
wenn das nicht passieren soll, muss man den Aufruf mit Application.Ontime zurücknehmen.
Hier dann mit Abfrage.
im Button dann nur noch dies:
Private Sub Button_Start_Click()
if Me.TextBox_Intervall.Value  "" and Me.TextBox_Wiederholungen.Value  "" AND _
(Me.OB_Sek.Value  or Me.OB_Min.Value) then
anz = 0
Call "MeinMakro"
Else
Msgbox "Bitte Anzahl und Intervall eingeben"
end if
End sub
Gruß Daniel
Anzeige
AW: Limit von DoEvents
05.07.2018 09:32:35
DoEvents
Vielen Dank Daniel!
Leider habe ich ein Problem bei der Umsetzung. Das Makro wird einmal ausgeführt, hört danach aber auf.
Wenn ich es durch den Debugger laufen lassen, zeigt er mir nach Ablaufen der Intervallzeit, also dem Zeitpunkt von "NächsterStart", die Fehlermeldung, dass "das Makro nicht ausgeführt werden kann. Das Makro ist möglicherweise in dieser Arbeitsmappe nicht verfügbar, oder alle Makros wurden deaktiviert."
Makros sind nicht deaktiviert, sonst würde ja gar nichts laufen, und es kann auch eigentlich NICHT nicht verfügbar sein, da es ja beim ersten Mal ausgeführt wird.
Anzeige
AW: Limit von DoEvents
05.07.2018 09:39:21
DoEvents
Okay, die Fehlermeldung lag an der Umbenennung der Datei in "+Kopie", mein Fehler.
Nach dem Ändern in den Originalnamen wiederholt es sich leider trotzdem nicht x)
AW: Limit von DoEvents
05.07.2018 09:54:01
DoEvents
Hab den Fehler gefunden. Hatte entgegen deiner Anweisung das Makro nicht in ein separates Modul, sondern in die UserForm geschrieben, da ich nicht alle Variablen wie MOUSE_CLICKED wiederholen wollte. Habe es aber jetzt hinbekommen.
Vielen, vielen Dank dir noch einmals, die Lösung ist super.
Anzeige
AW: Limit von DoEvents
05.07.2018 10:12:53
DoEvents
Hi
naja, Makros für Application.Ontime müssen in einem allgemeinen Modul stehen.
Wenn du die gleichen Variablen in mehreren Makros in verschiedenen Modulen benötigst, kannst du diese Variablen auch in einem allgemeinen Modul oberhalb der Makros als Public-Variablen deklarieren
Sie stehen dann in allen Makros des Projekts zur verfügung und behalten bei Makrowechsel dann auch ihre Werte.
wie gesagt, deine Alte Lösung würde auch funktionieren, wenn du eben nicht nur die Uhrzeit (TIMER) sondern Datum und Uhrzeit für die Prüfung verwenden würde.
Dann würde ja, wenn der Timer auf 0 zurück gesetzt wird, das Datum erhöht werden, so dass auch bei Datumswechsel weiter hochgezählt wird.
allerdings muss man den Timer dann durch die Anzahl Sekunden/Tag teilen, damit man ihn zu Date hinzuaddieren kann (in Date entspricht ein Tag mit 24 dem Wert 1)
also statt Timer immer Date + Timer / 24 / 60 / 60
dann geht auch deine alte Lösung
Gruß Daniel
Anzeige
;
Anzeige

Infobox / Tutorial

DoEvents in Excel VBA: Probleme und Lösungen


Schritt-für-Schritt-Anleitung

  1. Makro erstellen: Öffne Excel und erstelle ein neues Makro. Du kannst dies tun, indem du auf "Entwicklertools" > "Visual Basic" klickst.
  2. Code einfügen: Kopiere den folgenden Code in ein Modul:

    Private Sub Button_Start_Click()
       Dim i As Integer
       For i = 1 To Me.TextBox_Wiederholungen.Value
           Call DoEv
           Me.Move_Cursor_to
           SendMausklick MOUSE_LEFT
       Next i
    End Sub
    
    Sub DoEv()
       Dim Start As Double
       Start = Timer
       Do While Timer < Start + Me.TextBox_Intervall.Value
           DoEvents
       Loop
    End Sub
  3. Textboxen konfigurieren: Stelle sicher, dass die Textboxen für Intervalle und Wiederholungen im UserForm korrekt konfiguriert sind.
  4. Makro starten: Klicke auf den Button, um das Makro zu starten.

Häufige Fehler und Lösungen

  • Endlosschleife nach Mitternacht: Wenn dein Makro am Abend gestartet wird, könnte der Timer um Mitternacht auf 0 zurückgesetzt werden. Um dies zu vermeiden, solltest du das Datum mit einbeziehen:
    If (Start + Me.TextBox_Intervall.Value) > 86400 Then
       Start = 0
    End If
  • Makro stoppt nach einem Tag: Manchmal kann das Makro aufgrund von Speicherproblemen oder langen Laufzeiten stoppen. Achte darauf, dass du DoEvents sparsam einsetzt und auf Application.OnTime setzt, wenn du längere Intervalle benötigst.

Alternative Methoden

  • Application.Wait: Eine einfache Methode, um eine Pause einzulegen:

    Application.Wait (Now + TimeValue("0:01:00"))

    Beachte hierbei, dass Excel während der Wartezeit "tot" ist, was in manchen Fällen nicht ideal sein könnte.

  • Application.Ontime: Diese Methode erlaubt es dir, ein Makro zu einem bestimmten Zeitpunkt auszuführen, ohne dass das aktuelle Makro blockiert wird. Hier ist ein Beispiel:

    Application.OnTime Now + TimeValue("00:01:00"), "MeinMakro"

Praktische Beispiele

Ein Beispiel für ein vollständiges Makro, das DoEvents und Application.OnTime kombiniert:

Public NächsterStart As Date
Public Anz As Long

Sub MeinMakro()
    Anz = Anz + 1
    ' Hier kannst du deine Logik einfügen
    NächsterStart = Now + TimeValue("00:01:00")
    Application.OnTime NächsterStart, "MeinMakro"
End Sub

Dieses Beispiel zeigt, wie du das Makro regelmäßig ohne Blockierung ausführen kannst.


Tipps für Profis

  • Verwende Public-Variablen, um den Status deiner Makros über Module hinweg zu speichern.
  • Überlege, ob du DoEvents wirklich benötigst. In vielen Fällen reicht Application.Wait oder Application.OnTime aus.
  • Halte deinen Code modular, um die Wartbarkeit zu erhöhen und Fehler zu vermeiden.

FAQ: Häufige Fragen

1. Warum sollte ich DoEvents verwenden?
DoEvents ermöglicht es Excel, auf andere Ereignisse (wie Benutzereingaben) zu reagieren, während dein Makro läuft.

2. Gibt es eine maximale Laufzeit für ein Makro in Excel VBA?
Es gibt keine festgelegte maximale Laufzeit, aber lange Laufzeiten können zu Leistungseinbußen führen und das Makro könnte aufgrund von Speicherproblemen stoppen.

3. Was ist der Unterschied zwischen DoEvents und Application.Wait?
DoEvents erlaubt es Excel, andere Aufgaben während der Ausführung deines Makros zu erledigen, während Application.Wait Excel "stoppt", bis die Wartezeit abgelaufen ist.

4. Wie kann ich sicherstellen, dass mein Makro nicht stoppt?
Nutze Application.OnTime, um deine Makros in Intervallen auszuführen, und berücksichtige dabei sowohl Datum als auch Uhrzeit.

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