Excel 用户窗体文本框常量设置焦点

Excel Userform Textbox Constant Set Focus

首先我要感谢你们所有人。也许你没有注意到,但你帮助我从头开始在一定程度上掌握了 VBA。我仍在学习过程中,所以我可能会遗漏一些非常简单的东西,请温柔点:)

首先,我想提供一个关于我的问题的小背景更新。我一直在编写一个小程序来扫描进入我工作的零件,以便能够保持库存状态。该计划的最新外观如下:

图片上的数字是我最近的噩梦:

1. Scanned Part Number: 这是扫描仪输入值的文本框。收到输入后,我立即将该数据转换为变量并清除文本框值,如下所示:

Private Sub PN_CurrentScan_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then
        EnteredPN = Replace(PN_CurrentScan.Value, Chr(32), "", 1) '<---PN_CurrentScan is the name of text box
        EnteredPN = Left(EnteredPN, 12)
        PN_CurrentScan.Value = ""

在对扫描数据进行一些更正后,我基本上将其写入工作簿中的 sheet。然后我在同一个工作簿中也有一个数据透视表 table,它使用扫描的数据作为源并计算从每个零件号扫描的零件数。

2。当前状态: 此列表框包含所有已扫描的零件编号(来自上述枢轴 table)和等待扫描(来自另一项工作sheet)。然后它会在每次扫描新零件时自行刷新。

3。 ListBox 滚动条: 因为我有很长的部件编号列表,所以我不可能在屏幕上显示所有内容,这就是 listbox 创建此滚动条的原因。

背景我觉得够了:)

所以如果我们来关注我。由于我的拼贴画使用无绳扫描仪执行此操作,有时他们没有机会看到屏幕,因此他们无法理解光标是否在 "Scanned Part Number Text Box" 上。这就是为什么无论发生什么我都需要专注于那个盒子的原因(当然如果仓库被烧毁,地震或海啸袭击该地方我们将无能为力但让我们不要考虑这些)。

我尝试了什么:

  1. 首先,我禁用了属性中的所有剩余对象 window
  2. 然后我禁用了所有控件的制表位:

    Dim contr As Control
    For Each contr In ScannerInterface.Controls
        On Error Resume Next
        contr.TabStop = False
    Next
    ScannerInterface.PN_CurrentScan.TabStop = True
    
  3. 为所有按钮点击添加了 setfocus 属性:

    Me.PN_CurrentScan.SetFocus
    
  4. 添加了 setfocus 属性 到列表框点击:

    Private Sub CurrentStatus_List_Click()
        Me.PN_CurrentScan.SetFocus
    End Sub
    
  5. 添加了设置焦点以进入和退出列表框事件,但是这不起作用:

    Private Sub CurrentStatus_List_Enter()
    Me.PN_CurrentScan.SetFocus
    End Sub
    
    Private Sub CurrentStatus_List_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Me.PN_CurrentScan.SetFocus
    End Sub
    

所以,通过所有这些应对措施,我已经设法改进了一些,唯一剩下的问题是当我点击列表框旁边的滚动条时,文本框失去焦点并且没有点击文本框我无法设法再次设置焦点。我尝试了所有带有列表框的事件,但没有一个有效。有什么办法可以解决这个问题,或者我需要处理这个问题吗?在此先感谢您的支持。

解决方案:

感谢@Rory,我们成功解决了我的问题。正如他在下面的答案中注意到和解释的那样,我的文本框和列表框都在框架中。我尝试了几个 setfocus 选项,但我总是将焦点放在文本框上。但是,解决方案是将焦点放在包含目标文本框的框架上:

    Private Sub CurrentStatus_Frame_Enter() '<-- Enter event of the frame which contains listbox
        Me.PN_CurrentScan.SetFocus '<-- Setfocus to target textbox
        Me.Scanned_Frame.SetFocus '<-- Setfocus to frame which contains target textbox
    End Sub

(最终)注意到您的两个控件都在容器框架控件内,您实际上可以使用包含列表框的框架的 Enter 事件将焦点设置到包含文本框的框架,而不是文本框本身。