Excel Userform文本框常量设置焦点

时间:2015-03-05 13:20:06

标签: excel vba excel-vba listbox userform

首先,我要感谢你们所有人。也许你没有注意到,但是你帮助我从头开始把VBA搞到一定程度。我还在学习过程中,所以我可能会遗漏一些非常简单的东西,请保持温和:)

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

enter image description here

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

1。扫描的部件号:这是扫描仪输入值的文本框。收到输入后,我将数据转换为变量并清除文本框值,如下所示:

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 = ""

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

2。当前状态:此ListBox包含扫描的所有部件号(来自上述数据透视表)和等待扫描(来自另一个工作表)。然后每次扫描新零件时它都会自动刷新。

第3。 ListBox滚动条:由于我有很长的部件号列表,因此我无法在屏幕上显示所有内容,这就是列表框创建此滚动条的原因。

我认为足够的背景:)

所以,如果我们关注我的话。由于我的拼贴使用无绳扫描仪进行此操作,有时他们没有机会看到屏幕,因此他们无法理解光标是否在扫描的部件号文本框中。或不。这就是为什么无论发生什么事情我都需要专注于那个盒子(当然,如果仓库烧毁,地震或海啸袭击这个地方我们什么也做不了,但不要考虑那些)。

我做过什么:

  1. 首先,我禁用了属性窗口中的所有剩余对象
  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
    
  6. 所以,通过所有这些反制措施,我已经设法提升到某个点,只剩下的问题是当我点击列表框旁边的滚动条时,文本框失去焦点而没有点击文本框我无法设法重新设定焦点。我尝试了所有与listbox不同的事件。有什么方法可以解决这个问题,还是我需要处理这个问题?在此先感谢您的支持。

    解决方案:

    感谢@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
    

1 个答案:

答案 0 :(得分:2)

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