Excel 在另一个文本框的选项卡上设置用户窗体文本框的焦点

Excel 在另一个文本框的选项卡上设置用户窗体文本框的焦点,excel,vba,userform,Excel,Vba,Userform,我在Excel中有一个用户表单。它有6个文本框,它们是Userform上TabStop设置为True的唯一控件 我可以在文本框中进行制表和移动。我无法使SetFocus处理在文本框之间移动时触发的事件。我可以使用Userform16.Textbox1.Setfocus在userform上放置一个CommandButton,它可以按预期将焦点移动到Textbox1 我设置了一个简单的测试事件(见下文),以便在输入Textbox2时将textbox焦点移回TextBox1。当我从TextBox1中取

我在Excel中有一个用户表单。它有6个文本框,它们是Userform上TabStop设置为True的唯一控件

我可以在文本框中进行制表和移动。我无法使
SetFocus
处理在文本框之间移动时触发的事件。我可以使用
Userform16.Textbox1.Setfocus
在userform上放置一个CommandButton,它可以按预期将焦点移动到Textbox1

我设置了一个简单的测试事件(见下文),以便在输入Textbox2时将textbox焦点移回TextBox1。当我从TextBox1中取出标签时,它会将焦点移到Textbox3

Private Sub TextBox2_Enter()
   Cancel = True
   UserForm16.TextBox1.SetFocus
End Sub
通过在上面设置
停止
,我可以看到事件按预期触发,但它不允许我控制下一个控件的焦点

无论是否使用sub中的
Cancel=True
语句,我都会得到相同的结果

我设置了一个简单的测试事件(见下文),在输入Textbox2时将textbox焦点移回TextBox1,当我从TextBox1中取出标签时,它实际上将焦点移回Textbox3

Private Sub TextBox2_Enter()
   Cancel = True
   UserForm16.TextBox1.SetFocus
End Sub
无法在
\u Enter()
事件中将焦点设置为另一个控件。如果您尝试这样做,代码将把焦点移动到下一个
TabIndex

TextBox1 (TabIndex 0)
TextBox2 (TabIndex 1)
TextBox3 (TabIndex 3)
TextBox4 (TabIndex 4)
TextBox5 (TabIndex 2)
比如说

假设您有5个文本框,其中包含以下
TabIndex

TextBox1 (TabIndex 0)
TextBox2 (TabIndex 1)
TextBox3 (TabIndex 3)
TextBox4 (TabIndex 4)
TextBox5 (TabIndex 2)
现在如果你有这个代码

Private Sub TextBox2_Enter()
    TextBox3.SetFocus
End Sub
TextBox1
按TAB键时,焦点将移到
TextBox5
(而不是
TextBox3
),因为它有下一个
TabIndex

而且
Cancel=True
也不会有任何效果,因为它不是
\u Enter()
的参数,就像它是say
Private Sub TextBox2\u Exit(ByVal Cancel作为MSForms.ReturnBoolean)

编辑


顺便说一句,在您的场景中,只有当表单中只有两个
文本框时,焦点才会回到
Textbox1

我知道这是旧的,但这回答了我的问题,我无法评论。然而,Stan关于您在2017年6月8日发表的评论,我相信您正在寻找下面的代码,当您使用Cancel=True时,该代码将突出显示文本框中的文本。我在文本框退出事件中使用它。这将向用户指示已选择文本框

With Me.TextBox1
    .Value = "Full Name"
    .SelStart = 0
    .SelLength = Len(.Text)
    .SetFocus
End With
Cancel = True

虽然
\u Enter()
事件确实无法处理
.SetFocus
,但
\u KeyDown()
事件可以!这是一个很好的解决方法,你只需要监视TAB键是否被按下

因此,代码看起来很类似,TextBox1是您离开的代码,TB2是您输入的代码

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 9 Then TextBox1.SetFocus  'where 9 is the KeyCode for the TAB button
End Sub

如果目的是在离开前验证
TextBox1
中的数据,为什么不在
TextBox1\u Exit
中处理它,方法是设置
Cancel=True
?Cancel=True不会有任何效果,因为它不是事件中的参数。我似乎记得在输入事件中更改焦点是不起作用的,所以您可能想考虑尝试另一个事件。我要做的是在离开下一个文本框时验证文本框中的日期,但是如果失败,则编辑将焦点返回到原文本框,并突出显示该文本框中的数据。如上所述,我可以使用Cancel=True将焦点放在原始文本框上,但不会向用户显示此文本框已被选中。谢谢