Probleme mit SetFocus in VBA

Hallo!

Ich habe ein Problem mit dem SetFocus in einer Userform

Meine Userform beinhaltet:

TextBox1 TabIndex 0
CheckBox1 TabIndex 1
TextBox2 TabIndex 2
TextBox3 TabIndex 3
TextBox4 TabIndex 4

In dieser Userform möchte ich wenn ich CheckBox1 anklicke auf Checkbox 4 springen

Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
TextBox4.SetFocus
End If
End Sub

das funktioniert noch. Es funktioniert auch in späterer Folge, wenn ich CheckBox1 aus und wieder anklicke.

Jetzt kommt mein Problem!
Ich möchte, wenn ich mit Tabulator weiterspringe und zu Checkbox1 komme und diese bereits value=true gesetzt ist automatisch zu Textbox4 springt.

Private Sub CheckBox1_Enter()
If CheckBox1.Value = True Then
TextBox4.SetFocus
End If
End Sub

Und da ist das Problem: Er setzt den Focus auf TextBox2.

Gehe ich den Code im Debuggmodus durch passt alles bis zu „End Sub“.
Bis dorthin ist SetFocus auf TextBox4, nach Beendigung der Sub springt er auf TextBox2.

Ich hoffe, ich habe mein Problem gut beschrieben und jemand kann mir helfen!

Danke im vorhinein!

Hallo Dooley,
als workaround könnte man an Folgendes denken:

Private Sub CheckBox1_Enter()
If CheckBox1.Value = True Then
TextBox4.TabIndex = 2
TextBox4.SetFocus
End If

End Sub

Gruß Wilhelm

Hallo!

Ich habe ein Problem mit dem SetFocus in einer Userform

Meine Userform beinhaltet:

TextBox1 TabIndex 0
CheckBox1 TabIndex 1
TextBox2 TabIndex 2
TextBox3 TabIndex 3
TextBox4 TabIndex 4

In dieser Userform möchte ich wenn ich CheckBox1 anklicke auf
Checkbox 4 springen

Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
TextBox4.SetFocus
End If
End Sub

das funktioniert noch. Es funktioniert auch in späterer Folge,
wenn ich CheckBox1 aus und wieder anklicke.

Jetzt kommt mein Problem!
Ich möchte, wenn ich mit Tabulator weiterspringe und zu
Checkbox1 komme und diese bereits value=true gesetzt ist
automatisch zu Textbox4 springt.

Private Sub CheckBox1_Enter()
If CheckBox1.Value = True Then
TextBox4.SetFocus
End If
End Sub

Und da ist das Problem: Er setzt den Focus auf TextBox2.

Gehe ich den Code im Debuggmodus durch passt alles bis zu „End
Sub“.
Bis dorthin ist SetFocus auf TextBox4, nach Beendigung der Sub
springt er auf TextBox2.

Ich hoffe, ich habe mein Problem gut beschrieben und jemand
kann mir helfen!

Danke im vorhinein!

Hallo,

 Private Sub CheckBox1\_Enter()
 If CheckBox1.Value = True Then
 TextBox4.SetFocus
 End If
 End Sub

Und da ist das Problem: Er setzt den Focus auf TextBox2.

dann ist die Textbox4 zu dem Zeitpunkt entweder nicht in der Lage, den Focus zu bekommen (unsichtbar, abgeschaltet …) oder es gint eine Prozedur ‚GotFocus‘ die den Focus auf ein anderes Steuerelement setzt wenn bestimmte Bedingungen erfüllt sind.

Der Code ist richtig, die Ursache, warum sich das Programm nicht verhält, wie Du es möchtest liegt in einem Teil Deines Codes, den Du uns nicht gezeigt hast.

Gruß, Rainer

Hallo Wilhelm,
danke für deine Antwort!

Das funktioniert zwar beim nächsten mal, beim Verlassen von TextBox4 springt er jetzt auf TextBox2 obwohl er ja auf Textbox1 springen sollte. Ich bin dann in einer Schleife von TextBox2, TextBox3 und TextBox4. Zu TextBox1 und CheckBox1 komme ich mit dem Tabulator nicht mehr.
Es muss doch eine unkompliziertere Variante geben, in der man nicht bei jedem Verlassen eines Steuerelements den TabIndex neu setzen muss?

Hallo Dooley,
als workaround könnte man an Folgendes denken:

Private Sub CheckBox1_Enter()
If CheckBox1.Value = True Then
TextBox4.TabIndex = 2
TextBox4.SetFocus
End If

End Sub

Gruß Wilhelm

Hallo Rainer!

Das IST alles!
Es ist schon richtig, dass das nicht alles ist was ich programmiere!
Aber um das Problem zu zeigen reicht diese Userform mit den Steuerelementen die ich angegeben habe (ist einfacher auszuprobieren)
Der Fehler tritt ja schon bei diesem 0815 VBA-Macro auf.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Das IST alles!

hmmm.

Es ist schon richtig, dass das nicht alles ist was ich
programmiere!
Aber um das Problem zu zeigen reicht diese Userform mit den
Steuerelementen die ich angegeben habe (ist einfacher
auszuprobieren)
Der Fehler tritt ja schon bei diesem 0815 VBA-Macro auf.

natürlich ist es dann immer sinnvoll, das in einem eigenen kleinen Programm zu testen. Ich sehe mit bloßem Auge keinen Fehler, kann aber in VBA nicht testen, nur etwas ähnliches in VB6 schreiben. Da sieht die Syntax dann natürlich etwas anders aus:

Option Explicit

Private Sub Check1\_Click()
 If Check1.Value = Checked Then
 Text1.SetFocus
 Else
 Text2.SetFocus
 End If
End Sub

Private Sub Check2\_Click()
 If Check2.Value = Checked Then
 Text3.SetFocus
 Else
 Text4.SetFocus
 End If
End Sub

Das funktioniert ohne jedes Problem. Steht denn für alle Textboxen Tabstop auf True? Alles sichtbar, nichts auf ‚disabled‘?

Gruß, Rainer

Hi,
wie Rainer bereits schrieb, ist es schwer, Dir zu raten, da Du uns nicht mitteilst, in welchem Kontext Du den Code gebrauchst. Versuch mal Folgendes:

Die chx-Box mit Tabindex 0,
die txt-Boxen mit Tabindex 1 bis 4,
einen cmd-Button mit Tabindex 5.

Mit

Private Sub CheckBox1_Change()
If CheckBox1.Value = True Then
TextBox1.SetFocus
Else
TextBox3.TabStop = True
TextBox1.SetFocus
End If
End Sub

Private Sub CommandButton1_Click()
End
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If frm1.CheckBox1.Value = True Then
TextBox3.TabStop = False
TextBox4.SetFocus
End If
End Sub

Private Sub UserForm_Click()

End Sub

läuft es bei mir.
MfG
Wilhelm

Hi Tom,

ich hab mich auch daran versucht, kam da auch nur mehr oder minder funktionale Lösungen mit Veränderungen der Tabindexe und der Tabstops.

Was mir dabei aber auffiel, mit deinem bisher gezeigten Code bleibt die Checkbox immer auf True, wenn sie mal auf True gesetzt wurde.
Ist das so geplant?

Und, Excel ist da sehr eigen, im Debugger sieht man auch in anderen Fällen genau das was du beschrieben hast, BIS „End Sub“ stimmt alles, NACH „End Sub“ wird noch was vom Programmierer ungeplantes ausgeführt und vor allem, es läßt sich nicht verhindern :frowning:

Bei Interesse kann ich gerne den Code, genauer die vergeblichen Codeversuche an/zu der mistigen ListBox posten.

Gruß
Reinhard

Gruß
Reinhard

Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
TextBox4.SetFocus
End If
End Sub

Private Sub CheckBox1_Enter()
If CheckBox1.Value = True Then
TextBox4.SetFocus
End If
End Sub

OT Excel-Vba UserForms zur Laufzeit ‚bestücken‘
Hallo Interessierte,
in gewisser Weise passt es zum Thema.

Es ist möglich zur Laufzeit eine UserForm zu erstellen und diese zu bestücken. Das geht.

Was (meist) völlig scheitert ist, eine schon bestehende UF zur Laufzeit mit was auch immer, CommandButtons, ListBoxes, sonstwas zu bestücken.
Da geschehen seltsame Dinge, die man a) nicht planen kann, b) nicht abstellen kann.

Genau das Gleiche wie hier, trotz klarem Befehl wohin zu „hüpfen“ ist (TextBox4), „hüpft“ Excel nach TextBox2 bei Tab.

Nur mal so. Lösung habe ich keine.

Gruß
Reinhard