Excel VBA-记住上次用户表单文本框光标焦点

Excel VBA-记住上次用户表单文本框光标焦点,vba,excel,Vba,Excel,我在Excel VBA用户窗体上有10个文本框,当我离开窗口(例如,在不同的程序中执行其他工作)并返回时,我希望焦点集中在上次使用的文本框上 我认为对于一个有经验的人来说,这应该是一个显而易见的问题,但是我在任何地方都找不到一个关于这个话题的被问得很好的问题。如果有人能给我一个正确的答案,给我一个可搜索的主题,或者一段好的代码,那将是非常棒的。我是一块海绵,我愿意接受任何东西 谢谢大家!! -Chris光标焦点在VBA中不是一个事件,因此要做到这一点有点困难但是您可以使用\u Change事件并

我在Excel VBA用户窗体上有10个文本框,当我离开窗口(例如,在不同的程序中执行其他工作)并返回时,我希望焦点集中在上次使用的文本框上

我认为对于一个有经验的人来说,这应该是一个显而易见的问题,但是我在任何地方都找不到一个关于这个话题的被问得很好的问题。如果有人能给我一个正确的答案,给我一个可搜索的主题,或者一段好的代码,那将是非常棒的。我是一块海绵,我愿意接受任何东西

谢谢大家!!
-Chris

光标焦点在VBA中不是一个事件,因此要做到这一点有点困难但是您可以使用
\u Change
事件并记住上次更改的
文本框
,它与您想要的非常接近

在模块中需要一个公共变量,作为上次更改的文本框的名称。因此,下次激活表单时,您可以使用一个简单的
选择case
,并对表单的相应名称使用
.SetFocus
。下面的代码使用两个文本框

形式如下:

Option Explicit

Private Sub TextBox1_Change()
    strLastTb = "TextBox1"
End Sub

Private Sub TextBox2_Change()
    strLastTb = "TextBox2"
End Sub

Private Sub UserForm_Activate()

    Select Case strLastTb
    Case "TextBox1"
        TextBox1.SetFocus
    Case "TextBox2"
        TextBox2.SetFocus
    End Select

End Sub
在模块中:

Option Explicit

Public strLastTb As String

通常,您可以创建一个连接
文本框和数字的函数,因此,如果您有50个
文本框
,则不需要写100行。而且它看起来会更好。

您想关注当前单击的文本框吗?我认为没有办法轻松做到这一点,因为没有GotFocus事件,您需要将焦点恢复到正确的控件。使用API并使用SetwindowHooksEx+HCBT_激活可能是一种方法。
Change
显然意味着盒子有焦点,当然。。。但是如果框有焦点并且没有更改,
strLastTb
将不正确。不幸的是,如果切换到另一个框,Activate将不会下沉application@Mat自鸣得意&亚历克斯·K.-是的,你是对的,我也在想同样的问题,因此我编辑了答案。但是,这几乎是一样的:)我强烈建议不要给控件编号,不要为它们使用有意义的名称,例如
CustomerNameBox
AccountIdBox
,等等,然后在调用
.SetFocus
控件之前,使用表单的
控件集合按名称检索控件;这避免了
Select Case
,也不会让维护人员怀疑客户名称框应该是
TextBox12
还是
TextBox8
。当然最好是
Public LastTb As TextBox
/
set LastTb=TextBox2
,但它仍然需要一个事件来触发,而且没有。