Problem mit Exit-Ereignis einer Textbox
#1
Guten Tag.

Ich habe eine Userform zur Erfassung von Daten, die unter anderem eine Textbox "tbName" enthält. Diese Textbox soll nicht verlassen werden können, ohne in ihr einen Eintrag vorzunehmen. Der Anwender soll aber die Möglichkeit haben, ohne einen Eintrag den kompletten Erfassungsvorgang abzubrechen. Ich habe das folgendermaßen gelöst:

Private Sub tbName_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Me.tbName.Value = "" Then
        If MsgBox("Das Namensfeld darf nicht leer bleiben", vbOKCancel) = 2 Then
            Cancel = False
            Unload Me
        Else
            Cancel = True
        End If
    End If
End Sub

Es geschieht allerdings folgendes: die Messagebox mit dem Hinweis erscheint und bei Klick auf den Abbruchbutton der Messagebox wird die Userform tatsächlich geschlossen. Nach dem Schließen erscheint die Messagebox jedoch erneut und verschwindet erst, wenn man dort nochmals auf "OK" oder "Abbrechen" klickt. Wie kann ich des erneute Erscheinen der Messagebox verhindern?
Top
#2
Hi,

hiermit


Code:
If MsgBox("Das Namensfeld darf nicht leer bleiben", vbOKCancel) = 2 Then
           Cancel = False

gibst Du an, dass der Cancel-Vorgang abgebrochen wird. Die MessageBox bleibt also geöffnet.
Danach schließt Du die UF.

Ich würde einen CommandButton (Abbruch) auf der Userform platzieren und diesen mit dem
Unload.Me bestücken.

Gruß
Ich
Top
#3
Danke für die Antwort, IchBinIch.

Die Antwort ist m.E. aber nicht zutreffend.

Anhand des Wertes der boolschen Variable "Cancel" des Exit-Ereignisses entscheidet sich, ob die Textbox verlassen werden kann oder nicht. Ist Cancel=False, dann wird das Verlassen der Textbox nicht abgebrochen, das Verlassen ist also möglich. Die Variable "Cancel" hat nichts mit der Messagebox zu tun. Ich kann die Variable Cancel in der Prozedur auch umbenennen in "Reibekuchen".

In der Userform habe ich eine Schaltfläche "Abbrechen", die mit der Anweisung "Unload Me" hinterlegt ist. Wenn ich diese benutze, wird trotzdem in jedem Fall immer erst das Exit-Ereignis der Textbox ausgeführt, da diese beim "Unload Me" den Focus verliert.

Grüße von der Ostsee
Top
#4
Hallo Usedom,

(07.11.2016, 20:03)Usedom schrieb: In der Userform habe ich eine Schaltfläche "Abbrechen", die mit der Anweisung "Unload Me" hinterlegt ist. Wenn ich diese benutze, wird trotzdem in jedem Fall immer erst das Exit-Ereignis der Textbox ausgeführt, da diese beim "Unload Me" den Focus verliert.

Du hast es selbst schon erklärt: Unload Me löst das Exit-Ereignis (nochmals) aus. Dies muss man abfangen
Private Sub tbName_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 If Me.tbName.Tag = "" Then
   Me.tbName.Tag = 1
   If Me.tbName.Value = "" Then
     If MsgBox("Das Namensfeld darf nicht leer bleiben", vbOKCancel) = 1 Then
       Cancel = True
     Else
       Unload Me
     End If
   End If
   Me.tbName.Tag = ""
 End If
End Sub
Gruß Uwe
Top
#5
Hallo Uwe.

Danke für die Antwort. Ja, ich habe es bereits selbst erklärt, dass "Unload Me" das Exit-Ereignis erneut auslöst. Allerdings wollte ich das abfangen durch die vorherige Zeile "Cancel = False", was aber ein Denkfehler war. Mit der Tag-Eigenschaft einer Textbox werde ich mich jetzt beschäftigen.

Aber ich habe mittlerweile eine andere Lösung gefunden:

Da nach dem zweiten Erscheinen der Messagebox der endgültige Abbruch funktioniert, konnte das ja nur daran liegen, dass wegen des vorherigen "Unload Me" keine Textbox mehr da war, die ein Exit-Ereignis auslösen konnte. Sonst wäre die Sache unendlich weiter gegangen. Also hab ich die Prozedur wie folgt geändert:

Private Sub tbName_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If frmPersonalErfassen.Visible = True Then
        If Me.tbName.Value = "" Then
            If MsgBox("Das Namensfeld darf nicht leer bleiben", vbOKCancel, "FEHLER") = 2 Then
                Cancel = False
                Unload Me
            Else
                Cancel = True
            End If
        End If
    End If
End Sub

Jetzt klappt es. Danke an alle, die mir geantwortet haben.

Bitte schreibe mir noch jemand, wie ich ein Thema als gelöst kennzeichnen kann.
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste