Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: esc Endlosschleife beenden

esc Endlosschleife beenden
22.01.2009 19:46:00
Michael
Hallo!
Benötige eine Schleife die die ganze Zeit im Hintergrund läuft. Bei ESC soll sie abgebrochen werden.
Mein Bescheidener Versuch!
Private Declare Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer
Sub Schleife()
Do
DoEvents
If (GetAsyncKeyState(&H1B)) 0 Then Exit Do
Application.OnTime Now + TimeValue("0:0:3"), "StartZeitGeber"
'StartZeitGeber
Loop Until 1 = 1
' normalerweise müsste hier " Loop Until 1 = 2" eine 2 stehen, damit es eine endlosschleife ist
End Sub



Public Sub StartZeitGeber()
Kontrolle
Application.OnTime Now + TimeValue("0:0:3"), "Schleife"
End Sub



Private Sub Kontrolle()
MsgBox Format(Now, "hh:nn:ss")
' dient zur kontrolle ob überhaut etwas passiert
Sheets("Tabelle1").Select
Selection.QueryTable.Refresh BackgroundQuery:=False
' DIE AKTUALISIERUNG VON TABELLE1 IST WICHTIG; DAS MUSS UNBEDINGT AUSGEFÜHRT WERDEN
End Sub


Es gibt sicherlich bessere Lösungen.(Ich glaub das hier ist keine)
Vielen Dank
Gruß Michael

Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: esc Endlosschleife beenden
23.01.2009 11:04:12
fcs
Hallo Michael,
die ESC-Taste solte man hier nicht nutzen, da sie in Excel eine allgemeine Funktion für das Abbrechen von Aktionen hat. Besser eine andere Tasten-Kombination, z.B. Strg+q
Die Prozeduren kannst du etwas anders aufbauen, so dass der Timer sich rekursiv immer wieder selber aufruft, bis er gestoppt wird.
Dem Makro StopZeitGeber ordnest du dann unter Extras--Makro--Makros...--Optionen die gewünschte Tastenkombination zu.
Gruß
Franz

'Code in einem Allgemeinen Modul
Option Explicit
Public TimeSchleife As Date
Public Sub StopZeitGeber()
'Tastenkombination StrG + q
On Error GoTo Fehler 'Falls OnTime nicht aktiv
Application.OnTime earliesttime:=TimeSchleife, Procedure:="Kontrolle", schedule:=False
MsgBox "Zeitgeber beendet"
Fehler:
End Sub
Public Sub StartZeitGeber()
Kontrolle
End Sub
Private Sub Kontrolle()
On Error GoTo Fehler
Application.StatusBar = "Tabellenaktualisierung  " & Format(Now, "hh:nn:ss")
Application.Wait Now + TimeValue("0:0:1")
' dient zur kontrolle ob überhaut etwas passiert
Sheets("Tabelle1").Select
Selection.QueryTable.Refresh BackgroundQuery:=False
' DIE AKTUALISIERUNG VON TABELLE1 IST WICHTIG; DAS MUSS UNBEDINGT AUSGEFÜHRT WERDEN
TimeSchleife = Now + TimeValue("0:0:3")
Application.OnTime TimeSchleife, "Kontrolle"
Application.StatusBar = False
Fehler:
With Err
If .Number  0 Then
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
Call StopZeitGeber
End If
End With
End Sub


Zusätzlich muss du unter DieseArbeitsmappe die folgende Prozedur einfügen, um ggf. beim Schließen der Datei den Timer automatisch zu beenden.


Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call StopZeitGeber
End Sub


Anzeige
AW: esc Endlosschleife beenden
23.01.2009 13:08:08
Michael
HI!
Sieht besser aus. Funktioniert nicht ganz!
Er schmeißt mir immer einen Fehler raus: " Mehrdeutiger Name "Kontrolle"
und NU?
Gruß Michael
AW: esc Endlosschleife beenden
23.01.2009 13:40:00
fcs
Hallo michael,
Entweder schwirrt irgendwo in der Datei/dem Modul zwei Prozeduren mit dem gleichen Namen oder Excel hat sich irgendwie mal beim Einfügen/Löschen von prozeduren "verschluckt".
Benenne die Prozedur "Kontrolle" um, zb. in "Kontrolle2".
Ebenso den Prozedurnamen in den beiden OnTime-Aufrufen.
Dann sollte es eigentlich klappen.
Gruß
Franz
Anzeige
AW: esc Endlosschleife beenden
23.01.2009 15:16:00
Michael
Jup das KNALLT!
Beides durchgeführt!
Danke!!!!!!!!!!!
Mein System hatte einen kleinen schluckauf. ;-) Passiert wohl bestimmt öfters, wenn man ein Program startet.
AW: esc Endlosschleife beenden
24.01.2009 10:09:00
Michael
Hi!
Habe das Program eingefügt. Leider muss ich erst einen Wert aus dem aktualisieenden Excel sheet löschen und kann danach mit Strg+q das Program beenden! Woran liegt das?
Gruß Michael
Anzeige
AW: esc Endlosschleife beenden
26.01.2009 09:46:02
fcs
Hallo Michael,
ich hatte ohne Datenaktualisierung aus einer externe Datenquelle getestet.
Da funktioniert das Abbrechen des Timers gut.
Möglicherweise gibt es eine "Interessenkonflikt" zwischen der automatischen Datenaktualisierung und dem Start des Stop-Makros per Tasten-Kombination. Leider weiß ich da nichts genaues.
Gruß
Franz
Anzeige
AW: esc Endlosschleife beenden
27.01.2009 16:43:44
ms_michael_2002@yahoo.de
Danke!
Hat alles geklappt!
Hatte die Daten in einem zweiten Arbeitsblatt eingetragen.
Gruß Michael
Anzeige
Anzeige

Infobox / Tutorial

Endlosschleifen in Excel VBA effektiv abbrechen


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (deine Arbeitsmappe)" > Einfügen > Modul.

  3. Code einfügen: Kopiere den folgenden Code in das Modul:

    Option Explicit
    Public TimeSchleife As Date
    
    Public Sub StartZeitGeber()
        Kontrolle
    End Sub
    
    Public Sub StopZeitGeber()
        On Error GoTo Fehler
        Application.OnTime earliesttime:=TimeSchleife, Procedure:="Kontrolle", schedule:=False
        MsgBox "Zeitgeber beendet"
    Fehler:
    End Sub
    
    Private Sub Kontrolle()
        On Error GoTo Fehler
        Application.StatusBar = "Tabellenaktualisierung  " & Format(Now, "hh:nn:ss")
        Application.Wait Now + TimeValue("0:0:1")
        Sheets("Tabelle1").Select
        Selection.QueryTable.Refresh BackgroundQuery:=False
        TimeSchleife = Now + TimeValue("0:0:3")
        Application.OnTime TimeSchleife, "Kontrolle"
        Application.StatusBar = False
    Fehler:
        With Err
            If .Number <> 0 Then
                MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
                Call StopZeitGeber
            End If
        End With
    End Sub
  4. Tastenkombination zuweisen: Gehe zu Extras > Makros > Makros... > wähle StopZeitGeber > klicke auf Optionen und ordne eine Tastenkombination zu, z.B. Strg + Q.

  5. Timer beim Schließen beenden: Füge den folgenden Code in DieseArbeitsmappe ein:

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Call StopZeitGeber
    End Sub

Häufige Fehler und Lösungen

  • Fehler: „Mehrdeutiger Name 'Kontrolle'“: Überprüfe, ob mehrere Prozeduren mit dem gleichen Namen existieren. Ändere den Namen der Prozedur, z.B. in "Kontrolle2".

  • Das Makro kann nicht ausgeführt werden: Stelle sicher, dass du keine geschützten Blätter oder Zellen hast, die das Ausführen des Codes verhindern.

  • Datenaktualisierung verhindert Abbruch: Wenn du Daten aus einer externen Quelle aktualisierst, kann es zu Konflikten mit dem Stop-Makro kommen. Überprüfe, ob du den Timer manuell stoppt, bevor du die Daten aktualisierst.


Alternative Methoden

Eine andere Möglichkeit zur Beendigung einer Endlosschleife ist die Verwendung der DoEvents-Funktion in einer Schleife. Hier ein einfaches Beispiel:

Sub Schleife()
    Do
        DoEvents ' Ermöglicht es Excel, auf Benutzeraktionen zu reagieren
        ' Füge hier deinen Code ein
    Loop
End Sub

Du kannst dann eine Tastenkombination verwenden, um die Schleife abzubrechen, indem du eine Bedingung zur Beendigung in die Schleife einfügst.


Praktische Beispiele

Hier ist ein Beispiel, wie du eine Endlosschleife implementieren und mit Strg + Q abbrechen kannst:

Public Sub StartSchleife()
    Do
        DoEvents
        ' Dein Code hier
    Loop Until StopFlag
End Sub

Public StopFlag As Boolean

Public Sub StopSchleife()
    StopFlag = True
End Sub

Setze StopFlag auf True, wenn du die Schleife abbrechen möchtest.


Tipps für Profis

  • Verwende spezifische Tastenkombinationen: Anstelle der ESC-Taste, die in Excel eine allgemeine Abbruchfunktion hat, nutze Strg + Q oder eine andere Kombination.

  • Debugging: Füge Debug.Print-Anweisungen in deine Schleifen ein, um den Status zu überwachen und Fehler zu diagnostizieren.

  • Fehlerbehandlung: Implementiere eine robuste Fehlerbehandlung, um sicherzustellen, dass dein Makro immer korrekt beendet wird, auch bei unerwarteten Fehlern.


FAQ: Häufige Fragen

1. Wie kann ich eine VBA-Endlosschleife abbrechen?
Du kannst eine Endlosschleife abbrechen, indem du eine Tastenkombination wie Strg + Q verwendest, die du dem entsprechenden Makro zuweist.

2. Warum funktioniert mein Makro nicht?
Das Makro kann möglicherweise nicht ausgeführt werden, wenn es in einer geschützten Arbeitsmappe gespeichert ist oder wenn es Konflikte mit anderen Prozeduren gibt.

3. Was kann ich tun, wenn Excel nicht auf das Stop-Makro reagiert?
Überprüfe, ob andere Prozesse, wie z.B. die Datenaktualisierung, Excel blockieren. Möglicherweise musst du den Timer manuell stoppen, bevor du die Daten aktualisierst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige