SetFocus löst Exit Ereignis aus

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    SetFocus löst Exit Ereignis aus

    Hallo,

    Vielen Dank schon einmal für die hilfreichen Beiträge die ich hier schon gefunden habe. Nun habe ich ein Problem zu dem ich leider keine Lösung finden konnte.

    Ausgangslage:
    Ich habe unter Excel (2019 und 2016 getestet) ein UserForm mit mehreren TextBoxen. Textbox2 ist standardmäßig ausgeblendet und deaktiviert. Beim Verlassen der jeweiligen Textboxen wird über das Exit-Ereignis die Plausibilität geprüft.
    Wenn der Inhalt von TextBox1 z.B mit "A" anfängt soll beim Verlassen von TextBox1 TextBox2 eingeblendet werden und der Cursor zur Eingabe in diesem Feld stehen.
    Das klappt soweit alles.
    Leider wird aber das Exit-Ereignis von TextBox2 ausgelöst wenn in TextBox1 zum Beispiel "Apfel" eingegeben wird.
    Mit AfterUpdate kam ich auch nicht weiter.

    Ich hoffe, dass mir jemand das Brett dass ich vorm Kopf habe etwas verkleinern kann.

    FF
    Salmanazar

    Visual Basic-Quellcode

    1. Option Explicit
    2. Option Base 1
    3. Private Sub UserForm_Initialize()
    4. TextBox2.Visible = False
    5. TextBox2.Enabled = False
    6. End Sub
    7. Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    8. If Left(TextBox1, 1) = "A" Then
    9. TextBox2.Visible = True
    10. TextBox2.Enabled = True
    11. Me.TextBox2.SetFocus
    12. Else
    13. Me.TextBox3.SetFocus
    14. End If
    15. End Sub
    16. Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    17. If TextBox2 = "" Then
    18. MsgBox "bitte gültigen Wert eintragen (2)"
    19. Cancel = True
    20. End If
    21. End Sub
    22. Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    23. If TextBox3 = "" Then
    24. MsgBox "bitte gültigen Wert eintragen (3)"
    25. Cancel = True
    26. End If
    27. End Sub


    CodeTags korrigiert; bitte zukünftig darauf achten, das richtige CodeHighlighting zu verwenden ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo,

    Danke für die Antwort.
    Leider ändert sich dadurch nicht, dass das Exit-Ereignis von TextBox2 beim ersten Durchlauf eines Strings in Textbox1 der mit "A" beginnt ausgelöst wird.

    Das Problem liegt offensichtlich am Einblenden der TextBox2 während des Exit-Ereignisses.
    Habe den Code dahingehend geändert, dass er die Eingabe in Textbox1 mit Change überwacht und so ggf. die TextBox2 einblendet.
    Jetzt funktioniert es wie gewünscht. Unter Office365 funktioniert es so wie gewünscht. Andere Versionen habe ich noch nicht ausprobiert.
    Hoffe, dass es mit der Eingabe per Barcodescanner keine Probleme gibt.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Option Base 1
    3. Private Sub UserForm_Initialize()
    4. TextBox2.Visible = False
    5. TextBox2.Enabled = False
    6. End Sub
    7. Private Sub Textbox1_Change()
    8. If Left(TextBox1.Text, 2) = "A" Then
    9. TextBox2.Visible = True
    10. TextBox2.Enabled = True
    11. Else
    12. TextBox2.Visible = False
    13. TextBox2.Enabled = False
    14. End If
    15. End Sub
    16. Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    17. If TextBox1 = "" Then
    18. MsgBox "bitte gültigen Wert eintragen (1)"
    19. Cancel = True
    20. End If
    21. End Sub
    22. Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    23. If TextBox2 = "" Then
    24. MsgBox "bitte gültigen Wert eintragen (2)"
    25. Cancel = True
    26. End If
    27. End Sub
    28. Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    29. If TextBox3 = "" Then
    30. MsgBox "bitte gültigen Wert eintragen (3)"
    31. Cancel = True
    32. End If
    33. End Sub


    Es wäre trotzdem interessant zu wissen wieso es beim Einblenden im Exit-Ereignis zu Problemen kommt.

    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Willkommen im Forum.

    Wenn man einen Haltepunkt auf SetFocus setzt, sieht man, dass das 2x ausgeführt wird. Das dürfte daran liegen, dass der Fokus einmal durch den Befehl, aber eben auch durch Drücken der Tabulatortaste gesetzt wird. Wenn ich festlege, dass TextBox1 den TabIndex 0, TextBox2 den TabIndex 2 und TextBox3 den TabIndex 1 hat, klappt der Post#1-Code wie gewünscht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Besten Dank VaporidZed,

    wie so oft steckt der der Teufel im Detail. Jetzt macht der Code alles so wie er es soll. Mit Haltepunkten habe ich bislang nie nach Fehlern gesucht, das sollte ich in Zukunft mit beachten.

    Ich wünsche allen ein ruhiges Wochenende
    Salmanazar



    ******************************************
    gelöst
    ******************************************

    Salmanazar schrieb:

    Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Ich bin irritiert ob der ByVal-Übergabe.
    Ich weiß, dass die Microsoft-Doku auch ByVal vorgibt.
    Dennoch würde ich ByRef erwarten, da Cancel innerhalb der Routine verändert wird und dieser Wert an den Aufrufer zurück gegeben wird.
    Warum funktioniert das bei Events trotz ByVal?
    Hat da jemand eine vernünftige Erklärung?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --