【问题标题】:Set focus on UserForm Textbox on tabbing from another Textbox在另一个文本框的选项卡上将焦点设置在用户窗体文本框上
【发布时间】:2017-11-10 10:11:03
【问题描述】:

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

我可以通过标签和移动文本框。我无法让SetFocus 处理在文本框之间移动时触发的事件。我可以使用Userform16.Textbox1.Setfocus 在用户窗体上放置一个CommandButton,它可以按预期将焦点移到Textbox1。

我设置了一个简单的测试事件(见下文),以便在输入 Textbox2 时将文本框焦点移回 TextBox1。当我跳出 TextBox1 时,它会将焦点移至 Textbox3。

Private Sub TextBox2_Enter()
   Cancel = True
   UserForm16.TextBox1.SetFocus
End Sub

通过在上面添加Stop,我可以看到事件按预期触发,但它不允许我控制下一个控件的焦点。

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

【问题讨论】:

  • 如果目标是在离开之前验证TextBox1 中的数据,为什么不通过设置Cancel = TrueTextBox1_Exit 中处理它呢?
  • Cancel = True 不会产生任何影响,因为它不是事件中的参数。我似乎记得在 Enter 事件中更改焦点不起作用,因此您可能需要考虑尝试不同的事件。
  • 我要做的是在我离开下一个文本框时验证文本框中的日期,但如果编辑失败,则无法将焦点返回到原始文本框并突出显示该文本框中的数据。如上所述,我可以使用 Cancel=True 将焦点集中到原始文本框,但不会向用户指示选择了此文本框。谢谢。

标签: excel vba userform


【解决方案1】:

我设置了一个简单的测试事件(见下文),以便在输入 Textbox2 时将文本框焦点移回 TextBox1,当我退出 TextBox1 时,它实际上将焦点移到 Textbox3。

您不能在_Enter() 事件中将焦点设置到另一个控件。如果您尝试这样做,代码会将焦点移动到控制下一个TabIndex

例如

假设您有 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

TextBox1TAB 的那一刻,焦点将移动到TextBox5(而不是TextBox3),因为它有下一个TabIndex

同样Cancel = True 也不会产生任何影响,因为它不是_Enter() 的参数,就像Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) 一样

编辑

顺便说一句,在您的方案中,焦点会回到 Textbox1 的唯一情况是表单中只有两个 TextBoxes

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      虽然_Enter() 事件确实无法处理.SetFocus,但_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
      

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 2016-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多