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

Forumthread: TextBox und SetFocus Problem!

TextBox und SetFocus Problem!
07.01.2005 11:41:49
Oliver
Hi an alle,
ich steck mal wider fest. Ich habe eine UserForm, mit mehreren TextBoxen, über die Eingaben erfolgen sollen. Durch ein AfterUpdate Ereignis wird überprüft, ob der eingegebene Wert eine Zahl ist. Wenn nicht, wird der TextBoxinhalt gelöscht. Wenn die Eingabe eine Zahl war, wird die nächste TextBox eingeblendet. Das funktioniert auch soweit. Nun möchte ich aber, dass wenn die Eingabe keine Zahl war, der Textfeldinhalt gelöscht wird und der Coursor wieder in der TextBox steht. Wenn die Eingabe eine Zahl war, soll der Coursor in der neu eingeblendeten TextBox stehen. Ich habe das mit nachfolgendem Code versucht zu realisieren, aber leider funktioniert das setzen des Coursors nicht. Woran kann das liegen? Hat jemand eine Idee? Wäre super.

Private Sub TextBox1_AfterUpdate()
If Not IsNumeric(TextBox1) Then
MsgBox "Die Eingabe muss nummerisch sein!"
TextBox1 = ""
TextBox1.SetFocus
GoTo Ende
End If
TextBox2.Visible = True
Label2.Visible = True
TextBox2.SetFocus
Ende:
End Sub

Danke Euch schon mal im Vorfeld für die Hilfe,
Oliver
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: TextBox und SetFocus Problem!
07.01.2005 11:47:58
Matthias
Hallo Oliver,
verwende zur Eingabeprüfung das Ereignis TextBox1_Exit(). Die hat ein Cancel-Argument, wenn du dieses in der Prozedur auf True stellst, wird die Textbox nicht verlassen.
Gruß Matthias
Einen Teil der Antwort verstehe ich leider nicht!
Oliver
Hi Matthias,
Danke Dir erst einmal für Deine Antwort. Eines verstehe ich leider nicht an Deiner Antwort. Was meinst Du mit
Zitat:
Die hat ein Cancel-Argument, wenn du dieses in der Prozedur auf True stellst, wird die Textbox nicht verlassen.
Was meinst Du damit. Wäre super, wenn Du mir das noch erklären könntest.
Gruß,
Oliver
Anzeige
AW: Einen Teil der Antwort verstehe ich leider nic
07.01.2005 12:01:36
Matthias
Hallo Oliver,
ein Beispiel:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1 = 12 Then Cancel = True
End Sub
Wenn die Textbox 12 drinstehen hat, dann wird sie einfach nicht verlassen...
Gruß Matthias
Leider funktionierts nur zum Teil!
Oliver
Danke Dir Matthias,
dass Du noch mal geantwortet hast. Ich habe das jetzt mal bei mir geändert. Die TextBox wird nun nicht verlassen, aber der Focus steht dann nicht in der TextBox, sondern auf einer Schaltfläche, die zum Beenden der UserFrom dient (Ist zu dem Zeitpunkt das einzige Element was in der UserForm angezeigt wird, da alles andere erst durch die richtigen Eingaben in den Textfeldern eingeblendet wird). Wenn ich aber eine Zahl eingebe und somit die Bedingung erfüllt ist, mir dann die zweite TextBox eingeblendet wird und der Focus in TextBox2 springen sollte, dann wird der Focus auf TextBox1 gesetzt. Wie bekomme ich das hin, das der Focus dann wieder in der TextBox steht, bzw. bei Erfüllung der Bedingung auf die nächste TextBox wechselt?
Mein Code sieht nun folgendermaßen aus:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox1) Then
MsgBox "Die Eingabe muss nummerisch sein!"
TextBox1 = ""
TextBox1.SetFocus
Else
TextBox2.Visible = True
Label2.Visible = True
TextBox2.SetFocus
End If
End Sub

Ich hoffe, da gibt es eine Lösung. Denn immer wieder die Felder mit der Maus anwählen ist lästig.
Danke und Gruß,
Oliver
Anzeige
AW: Leider funktionierts nur zum Teil!
07.01.2005 12:49:10
Matthias
Hallo Oliver,
du hast das Cancel = True vergessen...
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox1) Then
MsgBox "Die Eingabe muss nummerisch sein!"
TextBox1 = ""
Cancel = True
Else
TextBox2.Visible = True
Label2.Visible = True
TextBox2.SetFocus
End If
End Sub
Evtl. kannst du noch die Eigenschaft "TakeFocusOnClick" des Buttons auf "False" stellen.
Viel Erfolg!
Matthias
Anzeige
Super, aber wie den Focus in die nächste TextBox!
Oliver
Hi Matthias,
super, jetzt bleibt der Coursor schon mal in der TextBox, wenn die Bedingung nicht erfüllt ist. Aber wie bekomme ich das hin, dass wenn die nächste TextBox eingeblendet wird, der Coursor in die gerade eingeblendete TextBox springt? Das tut er im Moment nämlich nicht. In dem Code ist zwar der Befehl TextBox2.SetFocus vorhanden, aber der Coursor bleibt in der anderen TextBox und markiert mir die vorher getätigte Eingabe. Gibt es da auch noch eine Lösung? Ich hoffe doch?
Danke noch mal,
Oliver
Anzeige
AW: Super, aber wie den Focus in die nächste TextB
07.01.2005 15:10:32
Matthias
Hallo Oliver,
es lag an einem kleinen Wörtchen:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox1) Then
MsgBox "Die Eingabe muss nummerisch sein!"
TextBox1 = ""
Cancel = True
Else
TextBox2.Visible = True
Label2.Visible = True
DoEvents
TextBox2.SetFocus
End If
End Sub
DoEvents veranlasst Excel, noch nicht fertiggestellte Aufgaben zu erledigen, in diesem Fall das Sichtbarmachen von Textbox2.
Gruß Matthias
Anzeige
Es funktioniert leider nicht!
Oliver
Hi Matthias,
danke Dir für Deine Antwort. Sorry, aber es funktionierrt nicht. Wenn ich TextBox1 fülle, die Returntaste betätige, wird TextBox2 eingeblendet, aber der Coursor bleibt in TextBox1 und markiert mir immer noch die vorher eingegebene Eingabe in TextBox1. Erst wenn ich dann erneut die Entertaste betätige, springt der Coursor in TextBox2. Das hätte ich aber lieber, wenn beim ersten Betätigen der Returntaste der Coursor in die gerade eingeblendete TextBox springt. Hast Du noch eine Idee, woran das liegen könnte?
Gruß,
Oliver
Anzeige
AW: Es funktioniert leider nicht!
07.01.2005 16:08:06
Matthias
Hallo Oliver,
seltsam...
vorhin hat es bei mir funktioniert, jetzt aber auch nicht mehr...
bin leider ratlos.
Gruß Matthias
Hat noch jemand anderes eine Idee?
Oliver
Hi Matthias,
schade, dass Dir im Moment nichts mehr einfällt. Eventuell hast Du ja später oder jemand anders eine Idee und kann hier weiterhelfen. Danke Dir auf jeden Fall noch mal für Deine Hilfe, sie hat mich ja immerhin schon ein bisschen weitergebracht. Für den Rest hoffe ich gibt es sicherlich auch noch eine Lösung.
MfG,
Oliver
Anzeige
Habe eine zuriedenstellende Lösung erarbeitet!
Oliver
Moin,
ich habe jetzt für mich eine Lösung gefunden, die ich hier gerne mitteilen möchte. Da es scheinbar Probleme gibt, wenn eine textBox ausgeblendet ist, gleich nach dem Einblenden den Focus auf die eingeblendete TextBox zu setzen habe ich anstelle dass ich die TextBoxen ausblende, die Hintergrundfarbe und die Schriftfarbe geändert. Also wenn die UserForm geöffnet wird, erhalten alle Label- und Textfelder die Farbe der UserForm. Sie sind somit von der optik her ausgeblendet, aber dennoch da. Wenn nun das Kriterium erfüllt ist, ändere ich die Farbe des nächsten Label- und Textfeldes. Somit kann der Focus auf das nächste Textfeld ohne Probleme übergeben werden. Der Code für z.B. TextBox1 sieht somit nun folgendermaßen aus:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Freigabe_TextBox1 = 1 Then
If Not IsNumeric(Me.TextBox1.Value) Then
MsgBox "Die Eingabe muss nummerisch sein!"
Me.TextBox1 = ""
Cancel = True
Else
With TextBox2
.BackColor = &H80000005
.SpecialEffect = fmSpecialEffectSunken
End With
Label2.ForeColor = &H80000008
TextBox2.SetFocus
End If
End If
Freigabe_TextBox1 = 0
End Sub

Die If Abfrage nach der Variablen Freigabe_TextBox1 mache ich, da ich in der UserForm einen Buttton habe, mit dem ich die UserForm ohne die Daten zu übernehmen beenden kann. Das funktionierte ohne die Abfrage nicht, da immer die MsgBox mit der Fehlermeldung erschien. Mit dieser Abfrage erscheint sie nicht mehr.
Sollte doch noch jemand eine Lösung für mein obiges Problem haben, dann bitte hier reinschreiben, damit ich das dann in meine userForm übernehmen kann, da mir eine Lösung mit ausblenden lieber wäre.
Schönes Wochenende,
Oliver
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

TextBox und SetFocus Problem in Excel VBA


Schritt-für-Schritt-Anleitung

Um das Problem mit dem Setzen des Fokus auf eine TextBox in Excel VBA zu lösen, kannst Du folgende Schritte befolgen:

  1. Öffne die UserForm: Stelle sicher, dass Du eine UserForm mit mehreren TextBoxen hast, beispielsweise TextBox1 und TextBox2.

  2. Ereignis für TextBox1: Nutze das AfterUpdate-Ereignis, um die Eingabe zu überprüfen und den Fokus entsprechend zu setzen. Hier ist ein Beispielcode:

    Private Sub TextBox1_AfterUpdate()
       If Not IsNumeric(TextBox1.Value) Then
           MsgBox "Die Eingabe muss nummerisch sein!"
           TextBox1 = ""
           TextBox1.SetFocus ' Setzt den Fokus zurück auf TextBox1
       Else
           TextBox2.Visible = True
           Label2.Visible = True
           TextBox2.SetFocus ' Setzt den Fokus auf TextBox2
       End If
    End Sub
  3. Verwendung von Cancel: Um zu verhindern, dass die TextBox verlassen wird, kannst Du das Exit-Ereignis nutzen. Hierbei ist es wichtig, das Cancel-Argument auf True zu setzen:

    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
       If Not IsNumeric(TextBox1.Value) Then
           MsgBox "Die Eingabe muss nummerisch sein!"
           TextBox1 = ""
           Cancel = True ' Verhindert das Verlassen der TextBox
       Else
           TextBox2.Visible = True
           Label2.Visible = True
           TextBox2.SetFocus ' Setzt den Fokus auf die nächste TextBox
       End If
    End Sub
  4. DoEvents verwenden: Um sicherzustellen, dass Excel die Sichtbarkeit von TextBox2 korrekt verarbeitet, füge DoEvents in deinen Code ein:

    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
       If Not IsNumeric(TextBox1.Value) Then
           MsgBox "Die Eingabe muss nummerisch sein!"
           TextBox1 = ""
           Cancel = True
       Else
           TextBox2.Visible = True
           Label2.Visible = True
           DoEvents ' Gewährleistet, dass Excel die Sichtbarkeit aktualisiert
           TextBox2.SetFocus
       End If
    End Sub

Häufige Fehler und Lösungen

  • Fehler: SetFocus funktioniert nicht: Wenn der Fokus nicht auf die TextBox gesetzt wird, kann das an der Reihenfolge der Ausführung liegen. Stelle sicher, dass DoEvents vor SetFocus steht.

  • Fehler: Fokus bleibt auf einer anderen Steuerung: Wenn der Fokus nach der Eingabe auf einem anderen Element bleibt, überprüfe, ob Du das Cancel-Argument korrekt setzt.

  • Fehler: TextBox bleibt nicht sichtbar: Wenn die TextBox nicht angezeigt wird, stelle sicher, dass die Sichtbarkeit (Visible) korrekt gesetzt ist, bevor Du den Fokus setzt.


Alternative Methoden

Eine alternative Methode, um den Fokus zu setzen, wäre die Verwendung von Formateigenschaften anstelle der Sichtbarkeit:

  1. Ändere die Hintergrundfarbe der TextBox, um sie visuell aus- oder einzublenden.
  2. Nutze SetFocus, um den Fokus auf die TextBox zu setzen, ohne sie auszublenden.

Beispiel:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Not IsNumeric(TextBox1.Value) Then
        MsgBox "Die Eingabe muss nummerisch sein!"
        TextBox1 = ""
        Cancel = True
    Else
        TextBox2.BackColor = &H80000005 ' Ändert die Farbe
        TextBox2.SetFocus
    End If
End Sub

Praktische Beispiele

Hier sind einige praktische Beispiele zur Verwendung von SetFocus in Excel VBA:

  1. Eingabevalidierung: Nutze TextBox1 für numerische Eingaben und setze den Fokus auf TextBox2, wenn die Eingabe gültig ist.

  2. Visuelles Feedback: Ändere die Hintergrundfarbe der TextBoxen, um anzuzeigen, welche Eingaben erforderlich sind.

  3. Nutzung von Labels: Mache die Labels sichtbar oder änder deren Farbe, um Benutzerfeedback zu geben.


Tipps für Profis

  • Verwende With-Anweisungen: Dies kann den Code lesbarer machen und die Leistung verbessern.

  • Teste die UserForm: Überprüfe alle Eingabefelder gründlich, um sicherzustellen, dass der Fokus korrekt gesetzt wird.

  • Nutze Access VBA: Wenn Du mit Access arbeitest, sind die Prinzipien ähnlich, aber die Syntax kann variieren.


FAQ: Häufige Fragen

1. Warum funktioniert SetFocus manchmal nicht?
Das kann an der Ausführungsreihenfolge oder an nicht sichtbaren Steuerelementen liegen. Überprüfe, ob alle Steuerelemente sichtbar sind, bevor Du SetFocus verwendest.

2. Was ist der Unterschied zwischen AfterUpdate und Exit?
AfterUpdate tritt ein, nachdem der Benutzer die Eingabe abgeschlossen hat, während Exit eintritt, wenn der Benutzer die TextBox verlässt.

3. Wie kann ich sicherstellen, dass der Fokus immer auf der richtigen TextBox bleibt?
Verwende Cancel = True im Exit-Ereignis, um zu verhindern, dass die TextBox verlassen wird, wenn die Eingabe ungültig ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige