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

Frage zu Setfocus nach msgbox Userform

Forumthread: Frage zu Setfocus nach msgbox Userform

Frage zu Setfocus nach msgbox Userform
chris

Private Sub tb_Ident_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 13
'prüfen ob länge eingegebener ident stimmt - erst wenn ok in Listbox übernehmen
If Len(frm_Programm_1.tb_Ident) = 11 Then
'Eingegebene länge OK
Me.lb_Ident.AddItem Me.tb_Ident.Value
Else
MsgBox ("Bitte prüfen Sie die Ident!" & Chr(10) & Chr(10) & "        Länge  _
nicht OK"), vbCritical, "abbruch"
Me.tb_Ident.SetFocus
Exit Sub
End If
Case 37, 39, 8, 46
Case 48 To 57
Case 96 To 105
Case Else
KeyCode = 0
End Select
End Sub
Hallo noch einmal an alle,
muss erneut um Hilfe bitte.Komme nicht weiter.
ich habe eine userform.In dieser sind u.a ein Commandbutton eine Textbox und ein Frame und eine Listbox.
Ich will jetzt das man in die textbox nur zahlen eingeben darf und pfeil rechts und links und bei Enter ein anderes Makro ausgeführt wird.
Das klappt auch super aber ich möchte das ganz am anfang wenn also die Enter Taste gedrückt wird geprüft wird ob die Länge der eingegebenen zahl 11 Stellen hat.
Das klappt auch.Was ich nicht hinbekomme ist wenn die zahl weniger als 11 Stellen hat kommt ja im Beispiel oben eine fehler msgbox.
Danach möchte ich gerne den Focus wieder in die Textboix geben das versuche ich mit
Me.tb_Ident.SetFocus
aber das klappt nicht.Was mache ich falsch ?
Danke gruß Chris
Anzeige
AW: Frage zu Setfocus nach msgbox Userform
02.05.2011 11:28:25
Rudi
Hallo,
schränke die Eingabemöglichkeit im KeyPress-Ereignis ein und prüfe die Länge im Exit-Ereignis.
Gruß
Rudi
AW: Frage zu Setfocus nach msgbox Userform
02.05.2011 11:49:54
chris
Hallo Rudi,
habe es jetzt etwa so geändert.Klappt aber auch nicht:?
Private Sub tb_Ident_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(frm_Programm_1.tb_Ident) = 11 Then
'Eingegebene länge OK
Me.lb_Ident.AddItem Me.tb_Ident.Value
Else
MsgBox ("Bitte prüfen Sie die Ident!" & Chr(10) & Chr(10) & "        Länge  _
nicht OK"), vbCritical, "abbruch"
Cancel = True
End If
Cancel = True
End Sub

Aus irgend einem Grund hat immer das Frame in der die textbox steckt den focus und gibt in nicht her ?
Anzeige
AW: Frage zu Setfocus nach msgbox Userform
02.05.2011 11:52:53
Rudi
Hallo,
dann lösch mal das zweite Cancel=True.
Gruß
Rudi
AW: Frage zu Setfocus nach msgbox Userform
02.05.2011 12:07:11
chris
Hallo,
das bringt auch nichts.
Mein Bekannter sagte das das Problem ist das die Userform vbModeless ist und nicht vbModal.
Aber das sollte so bleiben.
Danke noch einmal
jetzt hab ich verstanden.
02.05.2011 12:44:11
Rudi
Hallo,
Private Sub tb_Ident_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(tb_Ident) = 11 Then
'Eingegebene länge OK
lb_Ident.AddItem tb_Ident.Value
Else
MsgBox ("Bitte prüfen Sie die Ident!" _
& Chr(10) & Chr(10) _
& "        Länge nicht OK"), vbCritical, "Abbruch"
Cancel = True
Repaint
End If
End Sub

Gruß
Rudi
Anzeige
Klappt alles nicht - Hier eine Beispieldatei
02.05.2011 13:43:27
chris
Hallo zusammen,
leider klappt alles nicht so wie ich es möchte.
Ich habe eine Beispieldatei erstellt.
CommandButton1:
- UserForm wird vbModeless geladen
- Eingabe in Textbox (z.B. '444') und Enter-Taste
- Msgbox kommt und wird mit OK bestätigt
- Textbox verliert den Fokus, dieser kann auch per SetFocus nicht mehr gesetzt werden
CommandButton2:
Wie oben, nur vbModal
Textbox hat auch nach der MsgBox noch den Fokus.
Ist es denn irgendwie möglich, das auch wenn das Userform modeless angezeigt wird, trotzdem der Fokus passt?
Hab ich da etwa einen Bug gefunden?
Danke noch einmal !
https://www.herber.de/bbs/user/74630.zip
Anzeige
Klappt alles nicht: Wo ist REPAINT?
02.05.2011 13:48:58
Rudi
Hallo,
warum setzt du meine Lösung nicht um?
Gruß
Rudi
AW: Klappt alles nicht: Wo ist REPAINT?
02.05.2011 14:00:06
chris
Habe ich doch gemacht Rudi.
Es klappt trotzdem nicht.
Kannst Du es bitte testen ?
P.s habe auch 2 mal repaint rein und es geht auch nicht ?
Private Sub CommandButton1_Click()
Unload Me
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1  "" And Len(TextBox1)  11 Then
MsgBox "Hallo"
Repaint
Cancel = True
Repaint
End If
End Sub

Anzeige
AW: Klappt alles nicht: Wo ist REPAINT?
02.05.2011 14:20:37
Rudi
Hallo,
was geht nicht? Bei mir (XP) einwandfrei.
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1  "" And Len(TextBox1)  11 Then
MsgBox "Hallo"
Cancel = True
Repaint
End If
End Sub

Gruß
Rudi
P.S. Du musst nat. erst einmal in die TB rein oder sie in der Aktivierreihenfolge auf Platz 1 setzen. Beim Start der UF hat jetzt der CmdBtn den Fokus.
Anzeige
AW: mit neuer Datei Fehler - klappt nicht
02.05.2011 14:45:18
chris
Hallo also bei mir Office 2003 geht es nicht ?
Bin am verzweifeln.
Habe noch einmal die BeispielDatei geändert angehängt.
Also wenn ich in dieser Datei Userform ins textfeld z.b 1234 eingebe und dann enter drücke kommt eine msgbox.
nach dem ich die msgbox mit OK bestätigt habe soll eigentlich der Focus wieder im textfeld sein.Ist er aber nicht.
Was mache ich anders als Du ?
gruß
https://www.herber.de/bbs/user/74632.zip
Anzeige
klappt auch bei mir nicht mehr ?
02.05.2011 15:26:06
Rudi
Hallo,
bin vollkommen irritiert. Vorhin ging's, jetzt nicht mehr.
Vielleicht hab aber vorhin auch nen Fehler gemacht.
Gruß
Rudi
anderer Vorschlag
02.05.2011 15:44:58
Tino
Hallo,
einen Weg über Exit habe ich auch nicht gefunden.
Du kannst es aber ins Click- Ereignis des Button einbauen.
Private Sub CommandButton1_Click()
If TextBox1  "" And Len(TextBox1)  11 Then
MsgBox "Hallo"
TextBox1.SetFocus
Else
Unload Me
End If
End Sub
Gruß Tino
Anzeige
AW: anderer Vorschlag
02.05.2011 16:10:53
chris
das geht nicht.Weil das Makro auf den Commandbutton zu einem anderen zeitpunkt ausgeführt wird.
AW: anderer Vorschlag
02.05.2011 16:19:41
Tino
Hallo,
fange den Code so lange mit einer Variablen ab, bis der Code auf dem Button ausgeführt werden darf.
Sonst habe ich jetzt auch keine Idee.
Gruß Tino
noch ein Vorschlag
02.05.2011 16:26:07
Rudi
Hallo,
es klemmt nur an der MsgBox. Ohne geht's
Vielleicht den Hinweis in ein Label (Label1) schreiben.
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim t
If TextBox1.Text  "" And Len(TextBox1.Text)  11 Then
Cancel = True
Label1.Caption = "genau 11 Zeichen eingeben!"
Repaint
t = Timer
Do While Timer 

Gruß
Rudi
Anzeige
AW: noch offen
02.05.2011 17:55:15
chris
Hallo,
genau das ist mir auch aufgefallen das es nur an der msgbox liegt.,
Habe diese auch schon versucht vbSystemModal usw.. zu laden funzt5 aber nichts.
Schade das es so schwiertig bzw. nicht möglich ist.
Ich lasse aber trotzdem mal offen vielleicht weiß noch jemand was.
Vielen dank bis dahin !!
gruß Chris
Anzeige
AW: so würde es doch gehen.? Danke
04.05.2011 08:52:02
chris
Hallo Rudi,
danke noch einmal für Deine Vorschläge.
Habe heute noch mal rumprobiert und habe es geschafft.
Zwar muss ich die Form entladen und dann noch einmal anzeigen lassen aber es geht.
Hier der Code zum mal anschauen.
Private Sub tb_Ident_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 13
If Len(frm_Programm_1.tb_Ident) = 11 Then
Me.lb_Ident.AddItem Me.tb_Ident.Value
frm_Programm_1.tb_Ident = ""
KeyCode = 0
ElseIf frm_Programm_1.tb_Ident = "" Then
btn_suche_Ident.SetFocus
Else
Unload frm_Programm_1
frm_Programm_1.Show
MsgBox ("Bitte prüfen Sie die Ident!" & Chr(10) & Chr(10) & "        Länge  _
nicht OK!"), vbCritical, "abbruch"
frm_Programm_1.tb_Ident.SetFocus
KeyCode = 0
End If
Case 37, 39, 8, 46
Case 48 To 57
Case 96 To 105
Case 17, 86
Case Else
KeyCode = 0
End Select
End Sub

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

SetFocus in UserForms: Tipps und Tricks für VBA


Schritt-für-Schritt-Anleitung

Um den Fokus in einer Textbox innerhalb einer UserForm nach einer MsgBox wiederherzustellen, kannst du folgende Schritte befolgen:

  1. Öffne den VBA-Editor und lade die UserForm, die du bearbeiten möchtest.

  2. Füge den folgenden Code in das KeyDown-Ereignis deiner Textbox ein:

    Private Sub tb_Ident_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
       Select Case KeyCode
           Case 13 ' Enter-Taste
               If Len(tb_Ident) = 11 Then
                   ' Eingegebene Länge ist OK
                   lb_Ident.AddItem tb_Ident.Value
                   tb_Ident.Value = "" ' Textbox zurücksetzen
                   KeyCode = 0 ' Verhindert das Standardverhalten der Enter-Taste
               Else
                   MsgBox "Bitte prüfen Sie die Ident! Länge nicht OK", vbCritical, "Abbruch"
                   tb_Ident.SetFocus ' Setzt den Fokus zurück auf die Textbox
                   KeyCode = 0
               End If
           Case Else
               ' Andere Tasten ignorieren
               KeyCode = 0
       End Select
    End Sub
  3. Teste deine UserForm, um sicherzustellen, dass der Fokus korrekt gesetzt wird, wenn die Eingabe nicht den Anforderungen entspricht.


Häufige Fehler und Lösungen

  • Fehler: Der Fokus bleibt nicht in der Textbox nach der MsgBox.

    • Lösung: Stelle sicher, dass du SetFocus nach der MsgBox aufrufst. Verwende tb_Ident.SetFocus direkt nach der MsgBox-Antwort.
  • Fehler: MsgBox blockiert die Eingabe.

    • Lösung: Überprüfe, ob die UserForm als vbModeless oder vbModal konfiguriert ist. vbModeless kann dazu führen, dass der Fokus nicht dort bleibt, wo du es möchtest.
  • Fehler: Die Textbox akzeptiert keine Eingaben.

    • Lösung: Überprüfe deine KeyPress-Ereignisse, um sicherzustellen, dass nur die gewünschten Zeichen (z.B. Zahlen) akzeptiert werden.

Alternative Methoden

Eine alternative Methode, um den Fokus zu verwalten, ist die Verwendung des Exit-Ereignisses:

Private Sub tb_Ident_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Len(tb_Ident) <> 11 Then
        MsgBox "Bitte prüfen Sie die Ident! Länge nicht OK", vbCritical, "Abbruch"
        Cancel = True ' Verhindert das Verlassen der Textbox
        tb_Ident.SetFocus ' Setzt den Fokus zurück
    End If
End Sub

Diese Methode überprüft die Eingabe, wenn die Textbox verlassen wird, und kann einfacher zu implementieren sein.


Praktische Beispiele

Hier ist ein Beispiel, wie du die Funktionen in einer UserForm implementieren kannst:

  1. Füge eine Textbox und einen Button auf der UserForm hinzu.
  2. Verwende den Code aus der Schritt-für-Schritt-Anleitung für die Textbox und füge Folgendes für den Button hinzu:

    Private Sub CommandButton1_Click()
       If Len(tb_Ident) = 11 Then
           ' Weitere Aktionen
       Else
           MsgBox "Bitte prüfen Sie die Ident! Länge nicht OK", vbCritical, "Abbruch"
           tb_Ident.SetFocus
       End If
    End Sub

Tipps für Profis

  • Nutze Repaint, um die UserForm nach einer MsgBox neu zu zeichnen. Das kann helfen, grafische Probleme zu lösen.
  • Teste deine UserForm in verschiedenen Excel-Versionen, um sicherzustellen, dass der Code plattformübergreifend funktioniert.
  • Verwende vbSystemModal für MsgBoxen, die sicherstellen, dass der Benutzer die Eingabe nicht ignoriert.

FAQ: Häufige Fragen

1. Was bedeutet SetFocus in VBA? SetFocus ist eine Methode, die den Eingabefokus auf ein Steuerelement (z.B. Textbox) in einer UserForm setzt. Dies ist besonders nützlich, um sicherzustellen, dass der Benutzer sofort mit der Eingabe fortfahren kann.

2. Warum funktioniert SetFocus manchmal nicht? SetFocus funktioniert möglicherweise nicht, wenn das Steuerelement ausgeblendet oder nicht aktiv ist. Stelle sicher, dass die UserForm sichtbar ist und das Steuerelement, auf das du den Fokus setzen möchtest, aktiv ist.

3. Gibt es Einschränkungen bei der Verwendung von MsgBox mit SetFocus? Ja, die Verwendung von MsgBox kann die Steuerung des Fokus beeinträchtigen, insbesondere bei modeless UserForms. Es ist ratsam, den Fokus nach dem Schließen der MsgBox manuell zu setzen.

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