【问题标题】:Rearrange sequence of userform controls重新排列用户窗体控件的序列
【发布时间】:2021-07-12 02:18:11
【问题描述】:

我在 excel 中创建了这个用户表单,但是,我意识到当我点击键盘上的“tab”转到下一个字段时,它会按照屏幕截图所示的混乱顺序进行。

我想知道是否有办法重置此顺序,使其从左到右顺利进行(客户名称、基本工资等),然后移至复选框区域?

谢谢。

【问题讨论】:

  • 这是控件属性中的TabIndex 值。您将需要按照您想要的顺序一一通过控件。所以对于第一个项目,你使用值 0,然后是 1,然后是 2 等等。我不相信有一种方法可以自动通过控件,我认为你必须手动完成。但是,一旦您设置它,它将保持不变。它混乱的原因是 Tab 键顺序是由创建控件的顺序定义的。
  • @Pitbull999 请允许我在回答您的问题“如何重新排列一系列用户窗体控件”时发表评论;如果有帮助,将不胜感激任何反馈并随时接受/支持 - 请参阅someone answers

标签: excel vba userform


【解决方案1】:

a) 通过 VBA 重置标签索引

假设文本框命名为 e.g. “TextBox1”、“TextBox2”等表示想要的顺序 您可以编写如下代码:

Private Sub UserForm_Initialize()
    Dim no As Long
    For no = 1 To 5                    ' corresponding to tab indices 0..4
        With Me.Controls.Item("TextBox" & no)
            .TabIndex = no - 1
        End With
    Next
    ''optional continuation with Frame1 (checkbox container)
    ' Me.Controls.Item("Frame1").TabIndex = no - 1
End Sub

请注意,作为 第一号控件 的 TextBox1 将通过 0 的从零开始的 .TabIndex 属性获得焦点。 动态更改的选项卡索引将移动任何其他已经存在的索引 遵循它们的创建顺序。

替代循环

当然,也可以通过 array 循环通过以下方式保存控件对象:

Private Sub UserForm_Initialize()
    Dim ctrls
    ctrls = Array(TextBox1, TextBox2, TextBox3, TextBox4, TextBox5)
    Dim i As Long
    For i = LBound(ctrls) To UBound(ctrls)
        ctrls(i).TabIndex = i
    Next
    ''optional continuation with Frame1 (checkbox container)
    'Me.Controls.Item("Frame1").TabIndex = i
End Sub

这将允许为您的文本框使用任何其他命名约定,例如ctrls = Array(ClientName, BasePay, ...).

b) 智能更改标签顺序(手动)

虽然现在可以正确执行动态更改的选项卡行为,但上述过程不会更改 designer 中现有的 hard 选项卡索引。 这是不令人满意的,特别是如果您想检查 VB 编辑器的属性窗口中的选项卡。

我个人更喜欢手动更改

  • 在设计器模式下直接右键单击用户窗体并
  • 在上下文菜单中选择“激活顺序”

或通过快速更改选择整个初学者组

  • 按所需顺序选择第一个文本框(单击)和随后的文本框(Ctrl+单击)
  • 并且只输入0 作为(起始)tabindex。

而不是以编程方式操作 设计器(例如,使用库引用 Microsoft Visual Basic for Applications Extensibility 5.3)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多