Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

Rekursiven Aufruf von Ereignissen verhindern

Betrifft: Rekursiven Aufruf von Ereignissen verhindern von: zink
Geschrieben am: 25.10.2007 10:55:16

Hallo, liebe Forumsmitglieder,

ich habe eine Frage zum Ausschalten der Ereignisbehandlung (Application.EnableEvents=False).
Auf einer Userform befindet sich eine Textbox , die Eingaben entgegennimmt. Ich verwende das Change-Ereignis, um fehlerhafte Eingaben zu korrigieren.
Wenn ich in der Change-Ereignisprozedur den Wert der Textbox ändere (korrigiere), wird das Ereignis erneut augerufen (Rekursion) - dies will ich mit "Application.EnableEvents=False" verhindern.

Im folgenden Beispiel soll bei Eingabe eines Punktes dieser durch einen Strich ausgetauscht werden - dies funktioniert auch, aber das Change-Ereignis wird rekursiv aufgerufen, obwohl ein "Application.EnableEvents=False" gegeben wurde. Man sieht das im Einzelschrittmodus.
Warum funktioniert das Ausschalten der Ereignisbehandlung hier nicht? Dies trifft auch für die anderen Ereignisse (KeyUP, KeyDown etc.) zu.
Dass die Ereignisroutine nach Abschalten der Ereignisbehandlung dennoch erneut aufgerufen wird, ist doch eigentlich "gegen die guten Sitten" - ich versteh's nicht.
Kann mir jemand erklären, was ich hier falsch mache?

Private Sub TextBox1_Change()
   If Right(Me.TextBox1, 1) = "." Then
      Application.EnableEvents = False
        Me.TextBox1 = Left(Me.TextBox1, Len(Me.TextBox1) - 1) & "-"
      Application.EnableEvents = True
   End If
End Sub



Danke für Eure Hilfe
und freundliche Grüße
Joachim

  

Betrifft: Application.EnableEvents = FALSE von: NoNet
Geschrieben am: 25.10.2007 11:14:41

Hallo Joachim,

Die Anweisung "Application.EnableEvents = FALSE" gilt leider nicht für Steuerelemente in einem UserForm !
Dazu musst Du eine Boole'sche Variable deklarieren, deren Wert Du prüfst und während des Ereignisses änderst :

Dim bolModus As Boolean

Private Sub TextBox1_Change()
    If Not bolModus Then
        bolModus = True
        If Right(Me.TextBox1, 1) = "." Then
           Application.EnableEvents = False
             Me.TextBox1 = Left(Me.TextBox1, Len(Me.TextBox1) - 1) & "-"
           Application.EnableEvents = True
        End If
    End If
    bolModus = False
End Sub

     Code eingefügt mit Syntaxhighlighter 4.6

Gruß, NoNet


  

Betrifft: AW: Application.EnableEvents = FALSE von: zink
Geschrieben am: 25.10.2007 11:30:44

Ja O Elend ... das muss man wissen!
Ganz herzlichen Dank für Deine Hilfe.
Grüße
Joachim


 

Beiträge aus den Excel-Beispielen zum Thema "Rekursiven Aufruf von Ereignissen verhindern"