如何确定VBA用户窗体中的下一个tabstop?

如何确定VBA用户窗体中的下一个tabstop?,vba,Vba,我有一个UserForm,上面有一些文本框输入字段,这些字段由复选框启用/禁用。当一个复选框被点击选中时,我想把焦点移到现在启用的文本框中 文本框是选项卡顺序中复选框之后的下一个控件,因此使用选项卡顺序查找适当的文本框似乎是个好主意 但是。。。如何在给定控件之后找到选项卡顺序中的下一个控件?有没有一种方法可以做到这一点,或者我必须列举所有的控件并自己解决它?作为另一种看待这一点的方式 您是否可以不使用要聚焦的文本框,并在checkbox.tag中设置该名称 然后在您的vba代码中使用 DoCmd

我有一个UserForm,上面有一些文本框输入字段,这些字段由复选框启用/禁用。当一个复选框被点击选中时,我想把焦点移到现在启用的文本框中

文本框是选项卡顺序中复选框之后的下一个控件,因此使用选项卡顺序查找适当的文本框似乎是个好主意


但是。。。如何在给定控件之后找到选项卡顺序中的下一个控件?有没有一种方法可以做到这一点,或者我必须列举所有的控件并自己解决它?

作为另一种看待这一点的方式

您是否可以不使用要聚焦的文本框,并在checkbox.tag中设置该名称

然后在您的vba代码中使用

DoCmd.GoToControl CheckBox.Tag
其中CheckBox.Tag是Textbox.Name

编辑:

好的,我找到了这个

SendKeys "{Enter}", True

我知道这是在“枚举所有控件”的标题下,但它非常简单,为了完整性,我附上了代码:

Private Sub CheckBox1_Click()
    Dim ctl As Control
    For Each ctl In Me.Controls
        If ctl.TabIndex = Me.ActiveControl.TabIndex + 1 Then
            ctl.SetFocus
            Exit For
        End If
    Next
End Sub
我和他有麻烦

SendKeys "{Enter}", True
通过一些实验,我发现这是可行的

SendKeys "{TAB}", True

一个警告…如果您在VBE中单步执行代码,并在表单上查看它,那么SendKeys将在代码中执行。一开始我就把自己搞糊涂了,为什么我的代码开始看起来很奇怪,比如额外的间距和额外的行数

对于迄今为止所提供的善意建议,如果在用户表单本身中有办法解决这个问题,那么就不应该通过编程来解决这个问题


单击用户表单本身,然后右键单击并选择“选项卡顺序”。然后,您可以将userform中的每个元素移动到您想要的任何位置,而不必使用复杂且不稳定的编程技巧。

谢谢。我可以这样做,但我希望避免将控件的名称放在任何地方,因为我希望能够一遍又一遍地复制和粘贴这些控件,而且我不想在标记(或其他任何地方)中不断更新名称。无意冒犯,但有一个比使用发送键更健壮的选项,在一个用户可以在sendkeys触发之前将焦点切换到另一个应用程序的环境中,发送密钥非常脆弱。是的,如果我要走这条路,我至少会使用SendMessage来确保消息发送到正确的位置。但是,尽管这毫无疑问是有效的,我还是会暂时搁置一下,希望得到一个“更好”的答案。事实上,就目前情况而言,我仍然倾向于列举所有的控件,然后自己找出下一个。老兄,我删除了我的答案,因为它不完整,但我知道,事实上,在窗体或控件上都有这样一个函数,我已经用过了。当您键入后跟点的ActiveControl时,请尝试查看inteli sense选项。我会发布代码示例,但我现在正在和太太出去买圣诞礼物:)@Binary-Worrier:我想你一定是在想VB而不是VBA。没有FindControl方法,UserForm对象或ActiveControl对象上都没有适合bill.PS的内容。我从来没有去过农场:-)Gary是的,我确实认为这是VB.Net,抱歉。是的,我最终做了类似的事情-尽管请注意,并不是每种类型的控件都有TabIndex属性(例如Picture),所以你需要注意这一点。如果控件在一个框架内,你需要使用
Me.ActiveControl
而不是
Me.MyFrameName.ActiveControl
,否则VBA会将帧视为活动控件。是的,虽然这可以在90%的时间内正常工作(如果在我的机器上运行,并且如果我准备把手从键盘上移开,等等),这不是一个我准备向很多用户推出的解决方案。这是一个古老的历史,但是:我在问题中提到了标签顺序。我知道怎么设置。当时,我正在构建一个扩展/改进默认行为的UI,只是惊讶于选项卡顺序不容易通过API发现。我只是为其他人提供一些指导,这些人可能和我一样遇到过这个问题,但他们没有从给出的答案中得到可行的答案。